DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] net/i40e: fix unexpected mbuf free in vPMD
@ 2017-10-10 13:22 Qi Zhang
  2017-10-10  8:48 ` Bruce Richardson
  2017-10-12 17:28 ` Ferruh Yigit
  0 siblings, 2 replies; 13+ messages in thread
From: Qi Zhang @ 2017-10-10 13:22 UTC (permalink / raw)
  To: konstantin.ananyev, jingjing.wu, beilei.xing; +Cc: dev, Qi Zhang, stable

vPMD tx does not set sw_ring's mbuf to NULL after free it.
So to prevent same mbuf be free again, we need more carefully
check in i40e_tx_queue_release_mbufs.

Fixes: b4669bb95038 ("i40e: add vector Tx")
Cc: stable@dpdk.org

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
v2:
- fix at i40e_tx_queue_release_mbufs so no performance impact.

 drivers/net/i40e/i40e_rxtx.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 3a8d32c..f21c1c5 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -2305,18 +2305,40 @@ i40e_reset_rx_queue(struct i40e_rx_queue *rxq)
 void
 i40e_tx_queue_release_mbufs(struct i40e_tx_queue *txq)
 {
+	struct rte_eth_dev *dev;
 	uint16_t i;
 
+	dev = &rte_eth_devices[txq->port_id];
+
 	if (!txq || !txq->sw_ring) {
 		PMD_DRV_LOG(DEBUG, "Pointer to rxq or sw_ring is NULL");
 		return;
 	}
 
-	for (i = 0; i < txq->nb_tx_desc; i++) {
-		if (txq->sw_ring[i].mbuf) {
+	/**
+	 *  vPMD tx will not set sw_ring's mbuf to NULL after free,
+	 *  so need to free remains more carefully.
+	 */
+	if (dev->tx_pkt_burst == i40e_xmit_pkts_vec) {
+		i = txq->tx_next_dd - txq->tx_rs_thresh + 1;
+		if (txq->tx_tail < i) {
+			for (; i < txq->nb_tx_desc; i++) {
+				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
+				txq->sw_ring[i].mbuf = NULL;
+			}
+			i = 0;
+		}
+		for (; i < txq->tx_tail; i++) {
 			rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
 			txq->sw_ring[i].mbuf = NULL;
 		}
+	} else {
+		for (i = 0; i < txq->nb_tx_desc; i++) {
+			if (txq->sw_ring[i].mbuf) {
+				rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
+				txq->sw_ring[i].mbuf = NULL;
+			}
+		}
 	}
 }
 
-- 
2.9.5

^ permalink raw reply	[flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH] net/i40e: fix unexpected mbuf free in vPMD
@ 2017-10-09  8:53 Qi Zhang
  2017-10-09  1:47 ` Wu, Jingjing
  2017-10-09 12:44 ` Ananyev, Konstantin
  0 siblings, 2 replies; 13+ messages in thread
From: Qi Zhang @ 2017-10-09  8:53 UTC (permalink / raw)
  To: jingjing.wu, beilei.xing; +Cc: dev, Qi Zhang, stable

The patch reset tx queue sw_ring's mbuf to NULL after it is free in
i40_tx_free_bufs, this prevent same mbuf be free again in
i40e_dev_tx_queue_release. This fix follow the same implemenation of
non-vPMD.

Fixes: b4669bb95038 ("i40e: add vector Tx")
Cc: stable@dpdk.org

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/i40e/i40e_rxtx_vec_common.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/i40e/i40e_rxtx_vec_common.h b/drivers/net/i40e/i40e_rxtx_vec_common.h
index 39a6da0..ed51b4d 100644
--- a/drivers/net/i40e/i40e_rxtx_vec_common.h
+++ b/drivers/net/i40e/i40e_rxtx_vec_common.h
@@ -124,11 +124,13 @@ i40e_tx_free_bufs(struct i40e_tx_queue *txq)
 	  */
 	txep = &txq->sw_ring[txq->tx_next_dd - (n - 1)];
 	m = rte_pktmbuf_prefree_seg(txep[0].mbuf);
+	txep[0].mbuf = NULL;
 	if (likely(m != NULL)) {
 		free[0] = m;
 		nb_free = 1;
 		for (i = 1; i < n; i++) {
 			m = rte_pktmbuf_prefree_seg(txep[i].mbuf);
+			txep[i].mbuf = NULL;
 			if (likely(m != NULL)) {
 				if (likely(m->pool == free[0]->pool)) {
 					free[nb_free++] = m;
@@ -145,6 +147,7 @@ i40e_tx_free_bufs(struct i40e_tx_queue *txq)
 	} else {
 		for (i = 1; i < n; i++) {
 			m = rte_pktmbuf_prefree_seg(txep[i].mbuf);
+			txep[i].mbuf = NULL;
 			if (m != NULL)
 				rte_mempool_put(m->pool, m);
 		}
-- 
2.9.5

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-10-12 17:29 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-10 13:22 [dpdk-dev] [PATCH] net/i40e: fix unexpected mbuf free in vPMD Qi Zhang
2017-10-10  8:48 ` Bruce Richardson
2017-10-10 11:05   ` Roger B. Melton
2017-10-10 11:39     ` Bruce Richardson
2017-10-10 11:47       ` Roger B. Melton
2017-10-12 11:15         ` [dpdk-dev] [dpdk-stable] " Roger B. Melton
2017-10-12 11:30           ` Richardson, Bruce
2017-10-12 17:28 ` Ferruh Yigit
  -- strict thread matches above, loose matches on Subject: below --
2017-10-09  8:53 [dpdk-dev] " Qi Zhang
2017-10-09  1:47 ` Wu, Jingjing
2017-10-09 12:44 ` Ananyev, Konstantin
2017-10-09 13:20   ` Bruce Richardson
2017-10-10  1:10   ` Zhang, Qi Z

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).