@@ -2921,12 +2921,12 @@ struct cmd_setup_rxtx_queue {
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 {
@@ -2412,6 +2412,40 @@ struct extmem_param {
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,
+ const struct rte_eth_rxconf *rx_conf,
+ struct rte_mempool *mp)
+{
+ struct rte_eth_rxseg rx_seg[MAX_SEGS_BUFFER_SPLIT] = {};
+ unsigned int i, mp_n;
+
+ if (rx_pkt_nb_segs <= 1 ||
+ (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT) == 0)
+ return rte_eth_rx_queue_setup(port_id, rx_queue_id,
+ nb_rx_desc, socket_id,
+ rx_conf, mp);
+ for (i = 0; i < rx_pkt_nb_segs; i++) {
+ 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[i].length = rx_pkt_seg_lengths[i] ?
+ rx_pkt_seg_lengths[i] :
+ mbuf_data_size[mp_n];
+ rx_seg[i].mp = mpx ? mpx : mp;
+ }
+ return rte_eth_rxseg_queue_setup(port_id, rx_queue_id,
+ nb_rx_desc, socket_id, rx_conf,
+ rx_seg, rx_pkt_nb_segs);
+}
+
int
start_port(portid_t pid)
{
@@ -2520,7 +2554,7 @@ struct extmem_param {
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]),
@@ -2536,7 +2570,7 @@ struct extmem_param {
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]),
@@ -872,6 +872,12 @@ 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,
+ const 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);