[dpdk-dev] [PATCH v2 17/17] net/bnxt: modify ring index logic

Lance Richardson h.lance.richardson at gmail.com
Wed Dec 9 21:49:48 CET 2020


On Wed, Dec 9, 2020 at 2:28 PM Ajit Khaparde <ajitkhaparde at gmail.com> wrote:
>
> Change the ring logic so that the index increments
> unbounded and mask it only when needed.
>
> Modify the existing macros so that the index is not masked.
> Add a new macro RING_IDX() to mask it only when needed.
>
> Signed-off-by: Ajit Khaparde <ajit.khaparde at broadcom.com>
> ---

<snip>

> index d540e9eee..202291202 100644
> --- a/drivers/net/bnxt/bnxt_rxtx_vec_common.h
> +++ b/drivers/net/bnxt/bnxt_rxtx_vec_common.h
> @@ -105,21 +105,21 @@ bnxt_tx_cmp_vec_fast(struct bnxt_tx_queue *txq, int 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;
> +       uint16_t raw_cons = txr->tx_raw_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;
> +               raw_cons = (raw_cons + 1) & ring_mask;
> +               tx_buf = &txr->tx_buf_ring[raw_cons];

If the intention is (as stated in the commit log) to track the unmasked
index and only mask it when needed, this does not accomplish that,
and if the naming convention is for "raw" indices to refer to the unmasked
version, this might be misleading. Maybe change to this:
                 raw_cons = RING_NEXT(raw_cons);
                 tx_buf = &txr->tx_buf_ring[raw_cons & ring_mask];

>                 free[blk++] = tx_buf->mbuf;
>                 tx_buf->mbuf = NULL;
>         }
>         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
> @@ -127,7 +127,7 @@ 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 = txr->tx_cons;
> +       uint16_t raw_cons = txr->tx_raw_cons;
>         unsigned int blk = 0;
>         uint32_t ring_mask = txr->tx_ring_struct->ring_mask;
>
> @@ -135,8 +135,8 @@ bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts)
>                 struct bnxt_sw_tx_bd *tx_buf;
>                 struct rte_mbuf *mbuf;
>
> -               tx_buf = &txr->tx_buf_ring[cons];
> -               cons = (cons + 1) & ring_mask;
> +               raw_cons = (raw_cons + 1) & ring_mask;
> +               tx_buf = &txr->tx_buf_ring[raw_cons];

See previous comment.

>                 mbuf = rte_pktmbuf_prefree_seg(tx_buf->mbuf);
>                 if (unlikely(mbuf == NULL))
>                         continue;
> @@ -151,6 +151,6 @@ bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts)
>         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_ */


More information about the dev mailing list