From: John Daley Date: Mon, 11 Jul 2016 19:45:01 +0000 (-0700) Subject: net/enic: decrement Tx mbuf reference count before recycling X-Git-Tag: spdx-start~6157 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=da24f6f658fb7892606b3796a5ed03a5dff688af;p=dpdk.git net/enic: decrement Tx mbuf reference count before recycling In the burst Tx cleanup function, the reference count in mbufs returned to the pool should to be decremented before they are returned. Decrementing is not done by rte_mempool_put_bulk() so it must be done separately using __rte_pktmbuf_prefree_seg(). Also when returning unsent buffers when the device is stopped use rte_mbuf_free_seg() instead of rte_mempool_put() so that reference counts are properly decremented. Fixes: 36935afbc53c ("net/enic: refactor Tx mbuf recycling") Reviewed-by: Nelson Escobar Signed-off-by: John Daley --- diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index 89afb9fa91..a21b3002d9 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c @@ -106,7 +106,7 @@ static void enic_free_wq_buf(struct vnic_wq_buf *buf) { struct rte_mbuf *mbuf = (struct rte_mbuf *)buf->mb; - rte_mempool_put(mbuf->pool, mbuf); + rte_pktmbuf_free_seg(mbuf); buf->mb = NULL; } diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c index 2f4a08c581..845a8e6691 100644 --- a/drivers/net/enic/enic_rxtx.c +++ b/drivers/net/enic/enic_rxtx.c @@ -398,7 +398,14 @@ static inline void enic_free_wq_bufs(struct vnic_wq *wq, u16 completed_index) pool = ((struct rte_mbuf *)buf->mb)->pool; for (i = 0; i < nb_to_free; i++) { buf = &wq->bufs[tail_idx]; - m = (struct rte_mbuf *)(buf->mb); + m = __rte_pktmbuf_prefree_seg((struct rte_mbuf *)(buf->mb)); + buf->mb = NULL; + + if (unlikely(m == NULL)) { + tail_idx = enic_ring_incr(desc_count, tail_idx); + continue; + } + if (likely(m->pool == pool)) { RTE_ASSERT(nb_free < ENIC_MAX_WQ_DESCS); free[nb_free++] = m; @@ -409,7 +416,6 @@ static inline void enic_free_wq_bufs(struct vnic_wq *wq, u16 completed_index) pool = m->pool; } tail_idx = enic_ring_incr(desc_count, tail_idx); - buf->mb = NULL; } rte_mempool_put_bulk(pool, (void **)free, nb_free);