Hi, Maxime > -----Original Message----- > From: Maxime Leroy <maxime.le...@6wind.com> > Sent: Thursday, November 12, 2020 17:39 > To: Matan Azrad <ma...@nvidia.com>; Shahaf Shuler <shah...@nvidia.com>; > Slava Ovsiienko <viachesl...@nvidia.com>; Olivier Matz > <olivier.m...@6wind.com> > Cc: dev@dpdk.org; Didier Pallard <didier.pall...@6wind.com> > Subject: [PATCH v2 2/2] net/mlx5: fix Rx descriptor status returned value > > From: Didier Pallard <didier.pall...@6wind.com> > > One entry may contain several segments, so 'used' must be multiplied by > number of segments per entry to properly reflect the queue usage. > > Fixes: 8788fec1f269 ("net/mlx5: implement descriptor status API") > Signed-off-by: Didier Pallard <didier.pall...@6wind.com> > Signed-off-by: Maxime Leroy <maxime.le...@6wind.com> > --- > drivers/net/mlx5/mlx5_rxtx.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c index > 2733dcd3..f390dd66 100644 > --- a/drivers/net/mlx5/mlx5_rxtx.c > +++ b/drivers/net/mlx5/mlx5_rxtx.c > @@ -463,6 +463,7 @@ rx_queue_count(struct mlx5_rxq_data *rxq) > struct rxq_zip *zip = &rxq->zip; > volatile struct mlx5_cqe *cqe; > const unsigned int cqe_n = (1 << rxq->cqe_n); > + const unsigned int sges_n = (1 << rxq->sges_n); > const unsigned int cqe_cnt = cqe_n - 1; > unsigned int cq_ci, used; > > @@ -488,7 +489,7 @@ rx_queue_count(struct mlx5_rxq_data *rxq) > used += n; > cqe = &(*rxq->cqes)[cq_ci & cqe_cnt]; > } > - used = RTE_MIN(used, cqe_n); > + used = RTE_MIN(used * sges_n, cqe_n);
cqe_n reflects the number of the data descriptors in the RxQ, there might be convergency. I suppose the clamping should be: - for non-MPRQ rx_burst (regular and vectorized) - (1 <<rxq->elts_n) - for MPRQ (1 <<rxq->elts_n) * (1 << rxq->strd_n) For non-MPRQ the rxq->strd_n is zero, hence, it could look like: used = RTE_MIN(used * sges_n, (1 <<rxq->elts_n) * (1 << rxq->strd_n)); With best regards, Slava