app/testpmd: add extended Rx queue setup
authorViacheslav Ovsiienko <viacheslavo@nvidia.com>
Fri, 16 Oct 2020 16:44:40 +0000 (16:44 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 20:26:41 +0000 (22:26 +0200)
If Rx queue is configured with split feature the extended
setup with specified segment sizes and pool will be performed.

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
app/test-pmd/cmdline.c
app/test-pmd/testpmd.c
app/test-pmd/testpmd.h

index e09df36..07ee4e4 100644 (file)
@@ -2945,12 +2945,12 @@ cmd_setup_rxtx_queue_parsed(
                                rxring_numa[res->portid]);
                        return;
                }
-               ret = rte_eth_rx_queue_setup(res->portid,
-                                            res->qid,
-                                            port->nb_rx_desc[res->qid],
-                                            socket_id,
-                                            &port->rx_conf[res->qid],
-                                            mp);
+               ret = rx_queue_setup(res->portid,
+                                    res->qid,
+                                    port->nb_rx_desc[res->qid],
+                                    socket_id,
+                                    &port->rx_conf[res->qid],
+                                    mp);
                if (ret)
                        printf("Failed to setup RX queue\n");
        } else {
index 3b568ef..00cffae 100644 (file)
@@ -2458,6 +2458,51 @@ setup_hairpin_queues(portid_t pi, portid_t p_pi, uint16_t cnt_pi)
        return 0;
 }
 
+/* Configure the Rx with optional split. */
+int
+rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
+              uint16_t nb_rx_desc, unsigned int socket_id,
+              struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp)
+{
+       union rte_eth_rxseg rx_useg[MAX_SEGS_BUFFER_SPLIT] = {};
+       unsigned int i, mp_n;
+       int ret;
+
+       if (rx_pkt_nb_segs <= 1 ||
+           (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT) == 0) {
+               rx_conf->rx_seg = NULL;
+               rx_conf->rx_nseg = 0;
+               ret = rte_eth_rx_queue_setup(port_id, rx_queue_id,
+                                            nb_rx_desc, socket_id,
+                                            rx_conf, mp);
+               return ret;
+       }
+       for (i = 0; i < rx_pkt_nb_segs; i++) {
+               struct rte_eth_rxseg_split *rx_seg = &rx_useg[i].split;
+               struct rte_mempool *mpx;
+               /*
+                * Use last valid pool for the segments with number
+                * exceeding the pool index.
+                */
+               mp_n = (i > mbuf_data_size_n) ? mbuf_data_size_n - 1 : i;
+               mpx = mbuf_pool_find(socket_id, mp_n);
+               /* Handle zero as mbuf data buffer size. */
+               rx_seg->length = rx_pkt_seg_lengths[i] ?
+                                  rx_pkt_seg_lengths[i] :
+                                  mbuf_data_size[mp_n];
+               rx_seg->offset = i < rx_pkt_nb_offs ?
+                                  rx_pkt_seg_offsets[i] : 0;
+               rx_seg->mp = mpx ? mpx : mp;
+       }
+       rx_conf->rx_nseg = rx_pkt_nb_segs;
+       rx_conf->rx_seg = rx_useg;
+       ret = rte_eth_rx_queue_setup(port_id, rx_queue_id, nb_rx_desc,
+                                   socket_id, rx_conf, NULL);
+       rx_conf->rx_seg = NULL;
+       rx_conf->rx_nseg = 0;
+       return ret;
+}
+
 int
 start_port(portid_t pid)
 {
@@ -2572,7 +2617,7 @@ start_port(portid_t pid)
                                                return -1;
                                        }
 
-                                       diag = rte_eth_rx_queue_setup(pi, qi,
+                                       diag = rx_queue_setup(pi, qi,
                                             port->nb_rx_desc[qi],
                                             rxring_numa[pi],
                                             &(port->rx_conf[qi]),
@@ -2588,7 +2633,7 @@ start_port(portid_t pid)
                                                        port->socket_id);
                                                return -1;
                                        }
-                                       diag = rte_eth_rx_queue_setup(pi, qi,
+                                       diag = rx_queue_setup(pi, qi,
                                             port->nb_rx_desc[qi],
                                             port->socket_id,
                                             &(port->rx_conf[qi]),
index a7230e5..833ca14 100644 (file)
@@ -932,6 +932,11 @@ void port_rss_reta_info(portid_t port_id,
 
 void set_vf_traffic(portid_t port_id, uint8_t is_rx, uint16_t vf, uint8_t on);
 
+int
+rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
+              uint16_t nb_rx_desc, unsigned int socket_id,
+              struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp);
+
 int set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate);
 int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate,
                                uint64_t q_msk);