Acked-by: Viacheslav Ovsiienko <viachesl...@nvidia.com>
> -----Original Message-----
> From: Alexander Kozyrev <akozy...@nvidia.com>
> Sent: Monday, October 28, 2024 7:54 PM
> To: dev@dpdk.org
> Cc: sta...@dpdk.org; Raslan Darawsheh <rasl...@nvidia.com>; Slava
> Ovsiienko <viachesl...@nvidia.com>; Matan Azrad <ma...@nvidia.com>;
> Dariusz Sosnowski <dsosnow...@nvidia.com>; Bing Zhao
> <bi...@nvidia.com>; Suanming Mou <suanmi...@nvidia.com>
> Subject: [PATCH] net/mlx5: fix shared Rx queue port number in data path
>
> Wrong CQE is used to get the shared Rx queue port number in vectorized Rx
> burst routine. Fix the CQE indexing.
>
> Fixes: 25ed2ebff1 ("net/mlx5: support shared Rx queue port data path")
>
> Signed-off-by: Alexander Kozyrev <akozy...@nvidia.com>
> ---
> drivers/net/mlx5/mlx5_rxtx_vec_altivec.h | 12 ++++++------
> drivers/net/mlx5/mlx5_rxtx_vec_neon.h | 24 ++++++++++++------------
> drivers/net/mlx5/mlx5_rxtx_vec_sse.h | 6 +++---
> 3 files changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h
> b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h
> index cccfa7f2d3..f6e74f4180 100644
> --- a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h
> +++ b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h
> @@ -1249,9 +1249,9 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq,
> volatile struct mlx5_cqe *cq,
> rxq_cq_to_ptype_oflags_v(rxq, cqes, opcode, &pkts[pos]);
> if (unlikely(rxq->shared)) {
> pkts[pos]->port = cq[pos].user_index_low;
> - pkts[pos + p1]->port = cq[pos + p1].user_index_low;
> - pkts[pos + p2]->port = cq[pos + p2].user_index_low;
> - pkts[pos + p3]->port = cq[pos + p3].user_index_low;
> + pkts[pos + 1]->port = cq[pos + p1].user_index_low;
> + pkts[pos + 2]->port = cq[pos + p2].user_index_low;
> + pkts[pos + 3]->port = cq[pos + p3].user_index_low;
> }
> if (rxq->hw_timestamp) {
> int offset = rxq->timestamp_offset;
> @@ -1295,17 +1295,17 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq,
> volatile struct mlx5_cqe *cq,
> metadata;
> pkts[pos]->ol_flags |= metadata ? flag : 0ULL;
> metadata = rte_be_to_cpu_32
> - (cq[pos + 1].flow_table_metadata) & mask;
> + (cq[pos + p1].flow_table_metadata) & mask;
> *RTE_MBUF_DYNFIELD(pkts[pos + 1], offs, uint32_t
> *) =
> metadata;
> pkts[pos + 1]->ol_flags |= metadata ? flag : 0ULL;
> metadata = rte_be_to_cpu_32
> - (cq[pos + 2].flow_table_metadata) & mask;
> + (cq[pos + p2].flow_table_metadata) & mask;
> *RTE_MBUF_DYNFIELD(pkts[pos + 2], offs, uint32_t
> *) =
> metadata;
> pkts[pos + 2]->ol_flags |= metadata ? flag : 0ULL;
> metadata = rte_be_to_cpu_32
> - (cq[pos + 3].flow_table_metadata) & mask;
> + (cq[pos + p3].flow_table_metadata) & mask;
> *RTE_MBUF_DYNFIELD(pkts[pos + 3], offs, uint32_t
> *) =
> metadata;
> pkts[pos + 3]->ol_flags |= metadata ? flag : 0ULL; diff
> --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
> b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
> index 3ed688191f..942d395dc9 100644
> --- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
> +++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h
> @@ -835,13 +835,13 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq,
> volatile struct mlx5_cqe *cq,
> rxq_cq_to_ptype_oflags_v(rxq, ptype_info, flow_tag,
> opcode, &elts[pos]);
> if (unlikely(rxq->shared)) {
> - elts[pos]->port = container_of(p0, struct mlx5_cqe,
> + pkts[pos]->port = container_of(p0, struct mlx5_cqe,
> pkt_info)->user_index_low;
> - elts[pos + 1]->port = container_of(p1, struct
> mlx5_cqe,
> + pkts[pos + 1]->port = container_of(p1, struct
> mlx5_cqe,
> pkt_info)->user_index_low;
> - elts[pos + 2]->port = container_of(p2, struct
> mlx5_cqe,
> + pkts[pos + 2]->port = container_of(p2, struct
> mlx5_cqe,
> pkt_info)->user_index_low;
> - elts[pos + 3]->port = container_of(p3, struct
> mlx5_cqe,
> + pkts[pos + 3]->port = container_of(p3, struct
> mlx5_cqe,
> pkt_info)->user_index_low;
> }
> if (unlikely(rxq->hw_timestamp)) {
> @@ -853,34 +853,34 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq,
> volatile struct mlx5_cqe *cq,
> ts = rte_be_to_cpu_64
> (container_of(p0, struct mlx5_cqe,
> pkt_info)->timestamp);
> - mlx5_timestamp_set(elts[pos], offset,
> + mlx5_timestamp_set(pkts[pos], offset,
> mlx5_txpp_convert_rx_ts(sh, ts));
> ts = rte_be_to_cpu_64
> (container_of(p1, struct mlx5_cqe,
> pkt_info)->timestamp);
> - mlx5_timestamp_set(elts[pos + 1], offset,
> + mlx5_timestamp_set(pkts[pos + 1], offset,
> mlx5_txpp_convert_rx_ts(sh, ts));
> ts = rte_be_to_cpu_64
> (container_of(p2, struct mlx5_cqe,
> pkt_info)->timestamp);
> - mlx5_timestamp_set(elts[pos + 2], offset,
> + mlx5_timestamp_set(pkts[pos + 2], offset,
> mlx5_txpp_convert_rx_ts(sh, ts));
> ts = rte_be_to_cpu_64
> (container_of(p3, struct mlx5_cqe,
> pkt_info)->timestamp);
> - mlx5_timestamp_set(elts[pos + 3], offset,
> + mlx5_timestamp_set(pkts[pos + 3], offset,
> mlx5_txpp_convert_rx_ts(sh, ts));
> } else {
> - mlx5_timestamp_set(elts[pos], offset,
> + mlx5_timestamp_set(pkts[pos], offset,
> rte_be_to_cpu_64(container_of(p0,
> struct mlx5_cqe, pkt_info)-
> >timestamp));
> - mlx5_timestamp_set(elts[pos + 1], offset,
> + mlx5_timestamp_set(pkts[pos + 1], offset,
> rte_be_to_cpu_64(container_of(p1,
> struct mlx5_cqe, pkt_info)-
> >timestamp));
> - mlx5_timestamp_set(elts[pos + 2], offset,
> + mlx5_timestamp_set(pkts[pos + 2], offset,
> rte_be_to_cpu_64(container_of(p2,
> struct mlx5_cqe, pkt_info)-
> >timestamp));
> - mlx5_timestamp_set(elts[pos + 3], offset,
> + mlx5_timestamp_set(pkts[pos + 3], offset,
> rte_be_to_cpu_64(container_of(p3,
> struct mlx5_cqe, pkt_info)-
> >timestamp));
> }
> diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
> b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
> index 2bdd1f676d..fb59c11346 100644
> --- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
> +++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h
> @@ -783,9 +783,9 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile
> struct mlx5_cqe *cq,
> rxq_cq_to_ptype_oflags_v(rxq, cqes, opcode, &pkts[pos]);
> if (unlikely(rxq->shared)) {
> pkts[pos]->port = cq[pos].user_index_low;
> - pkts[pos + p1]->port = cq[pos + p1].user_index_low;
> - pkts[pos + p2]->port = cq[pos + p2].user_index_low;
> - pkts[pos + p3]->port = cq[pos + p3].user_index_low;
> + pkts[pos + 1]->port = cq[pos + p1].user_index_low;
> + pkts[pos + 2]->port = cq[pos + p2].user_index_low;
> + pkts[pos + 3]->port = cq[pos + p3].user_index_low;
> }
> if (unlikely(rxq->hw_timestamp)) {
> int offset = rxq->timestamp_offset;
> --
> 2.43.5