On Wed, Jun 28, 2017 at 04:04:00PM -0700, Yongseok Koh wrote:
> When processing Tx completion, it is more efficient to free buffers in bulk
> using rte_mempool_put_bulk() if buffers are from a same mempool.
> 
> Signed-off-by: Yongseok Koh <ys...@mellanox.com>
> ---
>  drivers/net/mlx5/mlx5_rxtx.c | 36 +++++++++++++++++++++++++++---------
>  1 file changed, 27 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
> index 43db06ad8..d81d630f7 100644
> --- a/drivers/net/mlx5/mlx5_rxtx.c
> +++ b/drivers/net/mlx5/mlx5_rxtx.c
> @@ -264,6 +264,8 @@ txq_complete(struct txq *txq)
>       uint16_t cq_ci = txq->cq_ci;
>       volatile struct mlx5_cqe *cqe = NULL;
>       volatile struct mlx5_wqe_ctrl *ctrl;
> +     struct rte_mbuf *m, *free[elts_n];
> +     unsigned int blk_n = 0;
>  
>       do {
>               volatile struct mlx5_cqe *tmp;
> @@ -296,21 +298,37 @@ txq_complete(struct txq *txq)
>       assert((elts_tail & elts_m) < (1 << txq->wqe_n));
>       /* Free buffers. */
>       while (elts_free != elts_tail) {
> -             struct rte_mbuf *elt = (*txq->elts)[elts_free & elts_m];
> -             struct rte_mbuf *elt_next =
> -                     (*txq->elts)[(elts_free + 1) & elts_m];
> -
> +             m = rte_pktmbuf_prefree_seg((*txq->elts)[elts_free++ & elts_m]);
> +             if (likely(m != NULL)) {
> +                     if (blk_n) {
> +                             if (likely(m->pool == free[0]->pool)) {
> +                                     free[blk_n++] = m;
> +                             } else {
> +                                     rte_mempool_put_bulk(
> +                                                     free[0]->pool,
> +                                                     (void *)free,
> +                                                     blk_n);

The indentation is strange here, free[0] should be on the same line as
rte_mempool_put_bulk.

> +                                     free[0] = m;
> +                                     blk_n = 1;
> +                             }
> +                     } else {
> +                             free[0] = m;
> +                             blk_n = 1;
> +                     }
> +             }

This loop could be smaller, blk_n can only be equal to 0 in the first
iteration, otherwise is >= 1.
The first if statement can be merged with the second one: 

        if (likely(m != NULL)) {
                if (likely(blk_n && m->pool == free[0]->pool)) {
                ...
                } else {
                ...
                }

Thanks,

-- 
Nélio Laranjeiro
6WIND

Reply via email to