X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_rxtx_vec_common.h;h=91ff6736b1749e0885d3c23c0e1ebea2f4a2c70d;hb=9b77f1fe303f1f9b6e5af0428d03fe07f17687a9;hp=ca5e345ce8d0b09167e8fb11c218b6cae10a2d3f;hpb=efc60c0ff7914c138b3021bbfbd744f9f221e8a6;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_common.h b/drivers/net/bnxt/bnxt_rxtx_vec_common.h index ca5e345ce8..91ff6736b1 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. */ @@ -9,8 +9,6 @@ #include "bnxt_rxq.h" #include "bnxt_rxr.h" -#define RTE_BNXT_DESCS_PER_LOOP 4U - #define TX_BD_FLAGS_CMPL ((1 << TX_BD_LONG_FLAGS_BD_CNT_SFT) | \ TX_BD_SHORT_FLAGS_COAL_NOW | \ TX_BD_SHORT_TYPE_TX_BD_SHORT | \ @@ -73,6 +71,8 @@ bnxt_rxq_rearm(struct bnxt_rx_queue *rxq, struct bnxt_rx_ring_info *rxr) if (rte_mempool_get_bulk(rxq->mb_pool, (void *)rx_bufs, nb) < 0) { rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed += nb; + for (i = 0; i < nb; i++) + rx_bufs[i] = &rxq->fake_mbuf; return; } @@ -94,4 +94,63 @@ bnxt_rxq_rearm(struct bnxt_rx_queue *rxq, struct bnxt_rx_ring_info *rxr) rxq->rxrearm_nb -= nb; } + +/* + * Transmit completion function for use when DEV_TX_OFFLOAD_MBUF_FAST_FREE + * is enabled. + */ +static inline void +bnxt_tx_cmp_vec_fast(struct bnxt_tx_queue *txq, int nr_pkts) +{ + struct bnxt_tx_ring_info *txr = txq->tx_ring; + struct rte_mbuf **free = txq->free; + uint16_t cons, raw_cons = txr->tx_raw_cons; + unsigned int blk = 0; + uint32_t ring_mask = txr->tx_ring_struct->ring_mask; + + while (nr_pkts--) { + struct bnxt_sw_tx_bd *tx_buf; + + cons = raw_cons++ & ring_mask; + tx_buf = &txr->tx_buf_ring[cons]; + free[blk++] = tx_buf->mbuf; + tx_buf->mbuf = NULL; + } + if (blk) + rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); + + txr->tx_raw_cons = raw_cons; +} + +static inline void +bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts) +{ + struct bnxt_tx_ring_info *txr = txq->tx_ring; + struct rte_mbuf **free = txq->free; + uint16_t cons, raw_cons = txr->tx_raw_cons; + unsigned int blk = 0; + uint32_t ring_mask = txr->tx_ring_struct->ring_mask; + + while (nr_pkts--) { + struct bnxt_sw_tx_bd *tx_buf; + struct rte_mbuf *mbuf; + + cons = raw_cons++ & ring_mask; + tx_buf = &txr->tx_buf_ring[cons]; + mbuf = rte_pktmbuf_prefree_seg(tx_buf->mbuf); + if (unlikely(mbuf == NULL)) + continue; + tx_buf->mbuf = NULL; + + if (blk && mbuf->pool != free[0]->pool) { + rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); + blk = 0; + } + free[blk++] = mbuf; + } + if (blk) + rte_mempool_put_bulk(free[0]->pool, (void **)free, blk); + + txr->tx_raw_cons = raw_cons; +} #endif /* _BNXT_RXTX_VEC_COMMON_H_ */