X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_rxtx_vec_common.h;h=9b9489a695a2c53c8cdef22baf4c13016d0116b1;hb=a5d81111dc51d3bb7a96cd670e2186ce042e6c3e;hp=d540e9eee46047fe1934b5655f5246e8f3bd4dd6;hpb=fc544b5460491195a2cdd1c75da9bbba3f6e0d98;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_common.h b/drivers/net/bnxt/bnxt_rxtx_vec_common.h index d540e9eee4..9b9489a695 100644 --- a/drivers/net/bnxt/bnxt_rxtx_vec_common.h +++ b/drivers/net/bnxt/bnxt_rxtx_vec_common.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2020 Broadcom + * Copyright(c) 2020-2021 Broadcom * All rights reserved. */ @@ -100,57 +100,78 @@ bnxt_rxq_rearm(struct bnxt_rx_queue *rxq, struct bnxt_rx_ring_info *rxr) * is enabled. */ static inline void -bnxt_tx_cmp_vec_fast(struct bnxt_tx_queue *txq, int nr_pkts) +bnxt_tx_cmp_vec_fast(struct bnxt_tx_queue *txq, uint32_t nr_pkts) { struct bnxt_tx_ring_info *txr = txq->tx_ring; - uint32_t ring_mask = txr->tx_ring_struct->ring_mask; - struct rte_mbuf **free = txq->free; - uint16_t cons = txr->tx_cons; - unsigned int blk = 0; - - while (nr_pkts--) { - struct bnxt_sw_tx_bd *tx_buf; - - tx_buf = &txr->tx_buf_ring[cons]; - cons = (cons + 1) & ring_mask; - free[blk++] = tx_buf->mbuf; - tx_buf->mbuf = NULL; + uint16_t cons, raw_cons = txr->tx_raw_cons; + uint32_t ring_mask, ring_size, num; + struct rte_mempool *pool; + + ring_mask = txr->tx_ring_struct->ring_mask; + ring_size = txr->tx_ring_struct->ring_size; + + cons = raw_cons & ring_mask; + num = RTE_MIN(nr_pkts, ring_size - cons); + pool = txr->tx_buf_ring[cons]->pool; + + rte_mempool_put_bulk(pool, (void **)&txr->tx_buf_ring[cons], num); + memset(&txr->tx_buf_ring[cons], 0, num * sizeof(struct rte_mbuf *)); + raw_cons += num; + num = nr_pkts - num; + if (num) { + cons = raw_cons & ring_mask; + rte_mempool_put_bulk(pool, (void **)&txr->tx_buf_ring[cons], + num); + memset(&txr->tx_buf_ring[cons], 0, + num * sizeof(struct rte_mbuf *)); + raw_cons += num; } - if (blk) - rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); - txr->tx_cons = cons; + txr->tx_raw_cons = raw_cons; } static inline void -bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts) +bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, uint32_t nr_pkts) { struct bnxt_tx_ring_info *txr = txq->tx_ring; - struct rte_mbuf **free = txq->free; - uint16_t cons = txr->tx_cons; - unsigned int blk = 0; - uint32_t ring_mask = txr->tx_ring_struct->ring_mask; + uint16_t cons, raw_cons = txr->tx_raw_cons; + uint32_t ring_mask, ring_size, num, blk; + struct rte_mempool *pool; - while (nr_pkts--) { - struct bnxt_sw_tx_bd *tx_buf; - struct rte_mbuf *mbuf; + ring_mask = txr->tx_ring_struct->ring_mask; + ring_size = txr->tx_ring_struct->ring_size; - tx_buf = &txr->tx_buf_ring[cons]; - cons = (cons + 1) & ring_mask; - mbuf = rte_pktmbuf_prefree_seg(tx_buf->mbuf); - if (unlikely(mbuf == NULL)) - continue; - tx_buf->mbuf = NULL; + while (nr_pkts) { + struct rte_mbuf *mbuf; - if (blk && mbuf->pool != free[0]->pool) { - rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); - blk = 0; + cons = raw_cons & ring_mask; + num = RTE_MIN(nr_pkts, ring_size - cons); + pool = txr->tx_buf_ring[cons]->pool; + + blk = 0; + do { + mbuf = txr->tx_buf_ring[cons + blk]; + mbuf = rte_pktmbuf_prefree_seg(mbuf); + if (!mbuf || mbuf->pool != pool) + break; + blk++; + } while (blk < num); + + if (blk) { + rte_mempool_put_bulk(pool, + (void **)&txr->tx_buf_ring[cons], + blk); + memset(&txr->tx_buf_ring[cons], 0, + blk * sizeof(struct rte_mbuf *)); + raw_cons += blk; + nr_pkts -= blk; + } + if (!mbuf) { + /* Skip freeing mbufs with non-zero reference count. */ + raw_cons++; + nr_pkts--; } - free[blk++] = mbuf; } - if (blk) - rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); - - txr->tx_cons = cons; + txr->tx_raw_cons = raw_cons; } #endif /* _BNXT_RXTX_VEC_COMMON_H_ */