Hi,

On Mon, Jan 05, 2026 at 05:24:33PM +0300, Mohand Alrasheed wrote:
> 
> From 9ca4302dd93461a7b01ad05af82ee2bcadf47675 Mon Sep 17 00:00:00 2001
> From: Mohand Alrasheed <[email protected]>
> Date: Mon, 5 Jan 2026 15:44:25 +0300
> Subject: [PATCH] net/mlx5: fix offset handling in
>  mlx5_aso_cnt_sq_enqueue_burst
> 
> mlx5_aso_cnt_sq_enqueue_burst() selects the ASO counter block using
> dcs_id_base/4 and ignores the batch offset. This causes every batch to
> target the first counter block, leading to counter aliasing (e.g. 2^16
> matches 0).
> 
> This patch selects the counter block using the offset-adjusted index.
> 
> Reproducible example: 
> https://github.com/Hawzen/rte-flow-async-profiling/blob/5e654e3a8a0414a5fa8ed43274195f180760f0b5/examples/flow_filtering/reproduce.md

Thank you very much for your contribution and reporting this issue.

There is in fact another issue with flow counter query logic
in mlx5_aso_cnt_query_one_dcs() function.
This function did not take into account a case when
mlx5_aso_cnt_sq_enqueue_burst() would query fewer counters than requested,
which could happen when available space in the queue is smaller lower than "n".

We have upstreamed a patch which addresses both of these issues: 
https://patches.dpdk.org/project/dpdk/patch/[email protected]/

Would you be able to test this patch locally on your side?

> 
> Fixes: 4d368e1da3a453cbcac620e8844c0300b2f45cfa
> Cc: [email protected]
> Cc: [email protected]
> ---
>  drivers/net/mlx5/mlx5_flow_aso.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/net/mlx5/mlx5_flow_aso.c 
> b/drivers/net/mlx5/mlx5_flow_aso.c
> index feca8c3e89..a232289024 100644
> --- a/drivers/net/mlx5/mlx5_flow_aso.c
> +++ b/drivers/net/mlx5/mlx5_flow_aso.c
> @@ -1877,6 +1877,7 @@ mlx5_aso_cnt_sq_enqueue_burst(struct mlx5_hws_cnt_pool 
> *cpool,
>       sq->elts[0].burst_size = max;
>       ctrl_gen_id = dcs_id_base;
>       ctrl_gen_id /= 4;
> +     ctrl_gen_id += offset / 4;
>       do {
>               ccntid = upper_offset - max * 4;
>               wqe = &sq->sq_obj.aso_wqes[sq->head & mask];
> --
> 2.39.5
> 
> 

Best regards,
Dariusz Sosnowski

Reply via email to