Adds "--rxq-share" parameter to enable shared rxq for each rxq.

Default shared rxq group 0 is used, RX queues in same switch domain
shares same rxq according to queue index.

Shared Rx queue is enabled only if device support offloading flag
RTE_ETH_RX_OFFLOAD_SHARED_RXQ.

Signed-off-by: Xueming Li <xuemi...@nvidia.com>
---
 app/test-pmd/config.c                 |  6 +++++-
 app/test-pmd/parameters.c             | 13 +++++++++++++
 app/test-pmd/testpmd.c                | 18 ++++++++++++++++++
 app/test-pmd/testpmd.h                |  2 ++
 doc/guides/testpmd_app_ug/run_app.rst |  7 +++++++
 5 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 9c66329e96e..6c7f9dee065 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -2709,7 +2709,11 @@ rxtx_config_display(void)
                        printf("      RX threshold registers: pthresh=%d 
hthresh=%d "
                                " wthresh=%d\n",
                                pthresh_tmp, hthresh_tmp, wthresh_tmp);
-                       printf("      RX Offloads=0x%"PRIx64"\n", offloads_tmp);
+                       printf("      RX Offloads=0x%"PRIx64, offloads_tmp);
+                       if (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_SHARED_RXQ)
+                               printf(" share group=%u",
+                                      rx_conf->shared_group);
+                       printf("\n");
                }
 
                /* per tx queue config only for first queue to be less verbose 
*/
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 3f94a82e321..30dae326310 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -167,6 +167,7 @@ usage(char* progname)
        printf("  --tx-ip=src,dst: IP addresses in Tx-only mode\n");
        printf("  --tx-udp=src[,dst]: UDP ports in Tx-only mode\n");
        printf("  --eth-link-speed: force link speed.\n");
+       printf("  --rxq-share: number of ports per shared rxq groups, defaults 
to MAX(1 group)\n");
        printf("  --disable-link-check: disable check on link status when "
               "starting/stopping ports.\n");
        printf("  --disable-device-start: do not automatically start port\n");
@@ -607,6 +608,7 @@ launch_args_parse(int argc, char** argv)
                { "rxpkts",                     1, 0, 0 },
                { "txpkts",                     1, 0, 0 },
                { "txonly-multi-flow",          0, 0, 0 },
+               { "rxq-share",                  2, 0, 0 },
                { "eth-link-speed",             1, 0, 0 },
                { "disable-link-check",         0, 0, 0 },
                { "disable-device-start",       0, 0, 0 },
@@ -1271,6 +1273,17 @@ launch_args_parse(int argc, char** argv)
                        }
                        if (!strcmp(lgopts[opt_idx].name, "txonly-multi-flow"))
                                txonly_multi_flow = 1;
+                       if (!strcmp(lgopts[opt_idx].name, "rxq-share")) {
+                               if (optarg == NULL) {
+                                       rxq_share = UINT32_MAX;
+                               } else {
+                                       n = atoi(optarg);
+                                       if (n >= 0)
+                                               rxq_share = (uint32_t)n;
+                                       else
+                                               rte_exit(EXIT_FAILURE, 
"rxq-share must be >= 0\n");
+                               }
+                       }
                        if (!strcmp(lgopts[opt_idx].name, "no-flush-rx"))
                                no_flush_rx = 1;
                        if (!strcmp(lgopts[opt_idx].name, "eth-link-speed")) {
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 97ae52e17ec..417e92ade11 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -498,6 +498,11 @@ uint8_t record_core_cycles;
  */
 uint8_t record_burst_stats;
 
+/*
+ * Number of ports per shared Rx queue group, 0 disable.
+ */
+uint32_t rxq_share;
+
 unsigned int num_sockets = 0;
 unsigned int socket_ids[RTE_MAX_NUMA_NODES];
 
@@ -1506,6 +1511,11 @@ init_config_port_offloads(portid_t pid, uint32_t 
socket_id)
                port->dev_conf.txmode.offloads &=
                        ~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 
+       if (rxq_share > 0 &&
+           (port->dev_info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SHARED_RXQ))
+               port->dev_conf.rxmode.offloads |=
+                               RTE_ETH_RX_OFFLOAD_SHARED_RXQ;
+
        /* Apply Rx offloads configuration */
        for (i = 0; i < port->dev_info.max_rx_queues; i++)
                port->rx_conf[i].offloads = port->dev_conf.rxmode.offloads;
@@ -3401,6 +3411,14 @@ rxtx_port_config(struct rte_port *port)
        for (qid = 0; qid < nb_rxq; qid++) {
                offloads = port->rx_conf[qid].offloads;
                port->rx_conf[qid] = port->dev_info.default_rxconf;
+
+               if (rxq_share > 0 &&
+                   (port->dev_info.rx_offload_capa &
+                    RTE_ETH_RX_OFFLOAD_SHARED_RXQ)) {
+                       offloads |= RTE_ETH_RX_OFFLOAD_SHARED_RXQ;
+                       port->rx_conf[qid].shared_group = nb_ports / rxq_share;
+               }
+
                if (offloads != 0)
                        port->rx_conf[qid].offloads = offloads;
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 5863b2f43f3..3dfaaad94c0 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -477,6 +477,8 @@ extern enum tx_pkt_split tx_pkt_split;
 
 extern uint8_t txonly_multi_flow;
 
+extern uint32_t rxq_share;
+
 extern uint16_t nb_pkt_per_burst;
 extern uint16_t nb_pkt_flowgen_clones;
 extern int nb_flows_flowgen;
diff --git a/doc/guides/testpmd_app_ug/run_app.rst 
b/doc/guides/testpmd_app_ug/run_app.rst
index 640eadeff73..43c85959e0b 100644
--- a/doc/guides/testpmd_app_ug/run_app.rst
+++ b/doc/guides/testpmd_app_ug/run_app.rst
@@ -389,6 +389,13 @@ The command line options are:
 
     Generate multiple flows in txonly mode.
 
+*   ``--rxq-share=[X]``
+
+    Create queues in shared RX queue mode if device supports.
+    Group number grows per X ports, default to group 0 if X not specified.
+    Only "shared-rxq" forwarding engine suppose to resolve source stream
+    correctly.
+
 *   ``--eth-link-speed``
 
     Set a forced link speed to the ethernet port::
-- 
2.33.0

Reply via email to