]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: support shared Rx queue port data path
authorViacheslav Ovsiienko <viacheslavo@nvidia.com>
Thu, 4 Nov 2021 12:33:20 +0000 (20:33 +0800)
committerRaslan Darawsheh <rasland@nvidia.com>
Thu, 4 Nov 2021 21:55:51 +0000 (22:55 +0100)
When receive packet, mlx5 PMD saves mbuf port number from
RxQ data.

To support shared RxQ, save port number into RQ context as user index.
Received packet resolve port number from CQE user index which derived
from RQ context.

Legacy Verbs API doesn't support RQ user index setting, still read from
RxQ port number.

Signed-off-by: Xueming Li <xuemingl@nvidia.com>
Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/mlx5/mlx5_devx.c
drivers/net/mlx5/mlx5_rx.c
drivers/net/mlx5/mlx5_rxq.c
drivers/net/mlx5/mlx5_rxtx_vec_altivec.h
drivers/net/mlx5/mlx5_rxtx_vec_neon.h
drivers/net/mlx5/mlx5_rxtx_vec_sse.h

index d3d189ab7f2e645bb32b0241b6472a57fcba6dac..a9f9f4af700d69687721a73a1d6cfa0fc55a24aa 100644 (file)
@@ -277,6 +277,7 @@ mlx5_rxq_create_devx_rq_resources(struct mlx5_rxq_priv *rxq)
                                                MLX5_WQ_END_PAD_MODE_NONE;
        rq_attr.wq_attr.pd = cdev->pdn;
        rq_attr.counter_set_id = priv->counter_set_id;
+       rq_attr.user_index = rte_cpu_to_be_16(priv->dev_data->port_id);
        if (rxq_data->shared) /* Create RMP based RQ. */
                rxq->devx_rq.rmp = &rxq_ctrl->obj->devx_rmp;
        /* Create RQ using DevX API. */
index 1ffa1b95b88b90a5bacb6500751035a16bb27752..4d85f64accdd29a21c04cff5b09e3dbb83818681 100644 (file)
@@ -709,6 +709,7 @@ rxq_cq_to_mbuf(struct mlx5_rxq_data *rxq, struct rte_mbuf *pkt,
 {
        /* Update packet information. */
        pkt->packet_type = rxq_cq_to_pkt_type(rxq, cqe, mcqe);
+       pkt->port = unlikely(rxq->shared) ? cqe->user_index_low : rxq->port_id;
 
        if (rxq->rss_hash) {
                uint32_t rss_hash_res = 0;
index 8feb3e2c0fb4afd728a24d7845feba2d2144af86..4515d5318356fa49845afd9d2dc0ef78883cee8f 100644 (file)
@@ -186,7 +186,8 @@ rxq_alloc_elts_sprq(struct mlx5_rxq_ctrl *rxq_ctrl)
                mbuf_init->data_off = RTE_PKTMBUF_HEADROOM;
                rte_mbuf_refcnt_set(mbuf_init, 1);
                mbuf_init->nb_segs = 1;
-               mbuf_init->port = rxq->port_id;
+               /* For shared queues port is provided in CQE */
+               mbuf_init->port = rxq->shared ? 0 : rxq->port_id;
                if (priv->flags & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF)
                        mbuf_init->ol_flags = RTE_MBUF_F_EXTERNAL;
                /*
index 1d00c1c43d1b4e2a9d3f8b23bf1432b221cb083f..423e229508c090820c9932cdfe126ea0d12e3e40 100644 (file)
@@ -1189,6 +1189,12 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq,
 
                /* D.5 fill in mbuf - rearm_data and packet_type. */
                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;
+               }
                if (rxq->hw_timestamp) {
                        int offset = rxq->timestamp_offset;
                        if (rxq->rt_timestamp) {
index aa36df29a099374454a220e4bf9c001774525933..b1d16baa619ba7fbf1b82c21e96bc1534abd0cc1 100644 (file)
@@ -787,7 +787,17 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq,
                /* C.4 fill in mbuf - rearm_data and packet_type. */
                rxq_cq_to_ptype_oflags_v(rxq, ptype_info, flow_tag,
                                         opcode, &elts[pos]);
-               if (rxq->hw_timestamp) {
+               if (unlikely(rxq->shared)) {
+                       elts[pos]->port = container_of(p0, struct mlx5_cqe,
+                                             pkt_info)->user_index_low;
+                       elts[pos + 1]->port = container_of(p1, struct mlx5_cqe,
+                                             pkt_info)->user_index_low;
+                       elts[pos + 2]->port = container_of(p2, struct mlx5_cqe,
+                                             pkt_info)->user_index_low;
+                       elts[pos + 3]->port = container_of(p3, struct mlx5_cqe,
+                                             pkt_info)->user_index_low;
+               }
+               if (unlikely(rxq->hw_timestamp)) {
                        int offset = rxq->timestamp_offset;
                        if (rxq->rt_timestamp) {
                                struct mlx5_dev_ctx_shared *sh = rxq->sh;
index b0fc29d7b9ec7cd9509c9fe83df4817ca8c02f9e..f3d838389e2201edfb0b878a82a09262438cdd22 100644 (file)
@@ -736,7 +736,13 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq,
                *err |= _mm_cvtsi128_si64(opcode);
                /* D.5 fill in mbuf - rearm_data and packet_type. */
                rxq_cq_to_ptype_oflags_v(rxq, cqes, opcode, &pkts[pos]);
-               if (rxq->hw_timestamp) {
+               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;
+               }
+               if (unlikely(rxq->hw_timestamp)) {
                        int offset = rxq->timestamp_offset;
                        if (rxq->rt_timestamp) {
                                struct mlx5_dev_ctx_shared *sh = rxq->sh;