Add new command to setup queue: queue setup (rx|tx) (port_id) (queue_idx) (ring_size) (offloads)
rte_eth_[rx|tx]_queue_setup will be called corresponsively Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> --- v3: - add offload parameter to queue setup command. - couple code refactory. app/test-pmd/cmdline.c | 128 ++++++++++++++++++++++++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++ 2 files changed, 135 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index d1dc1de6c..02dcad2b3 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -774,6 +774,9 @@ static void cmd_help_long_parsed(void *parsed_result, "port tm hierarchy commit (port_id) (clean_on_fail)\n" " Commit tm hierarchy.\n\n" + "queue setup (rx|tx) (port_id) (queue_idx) (ring_size) (offloads)\n" + " setup a not started queue or re-setup a started queue.\n\n" + , list_pkt_forwarding_modes() ); } @@ -16030,6 +16033,130 @@ cmdline_parse_inst_t cmd_load_from_file = { }, }; +/* Queue Setup */ + +/* Common result structure for queue setup */ +struct cmd_queue_setup_result { + cmdline_fixed_string_t queue; + cmdline_fixed_string_t setup; + cmdline_fixed_string_t rxtx; + portid_t port_id; + uint16_t queue_idx; + uint16_t ring_size; + uint64_t offloads; +}; + +/* Common CLI fields for queue setup */ +cmdline_parse_token_string_t cmd_queue_setup_queue = + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, queue, "queue"); +cmdline_parse_token_string_t cmd_queue_setup_setup = + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, setup, "setup"); +cmdline_parse_token_string_t cmd_queue_setup_rxtx = + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, rxtx, "rx#tx"); +cmdline_parse_token_num_t cmd_queue_setup_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, port_id, UINT16); +cmdline_parse_token_num_t cmd_queue_setup_queue_idx = + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, queue_idx, UINT16); +cmdline_parse_token_num_t cmd_queue_setup_ring_size = + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, ring_size, UINT16); +cmdline_parse_token_num_t cmd_queue_setup_offloads = + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, offloads, UINT64); + +static void +cmd_queue_setup_parsed( + void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_queue_setup_result *res = parsed_result; + struct rte_port *port; + struct rte_mempool *mp; + unsigned int socket_id; + uint8_t rx = 1; + int ret; + + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) + return; + + if (!strcmp(res->rxtx, "tx")) + rx = 0; + + if (rx && res->ring_size <= rx_free_thresh) { + printf("Invalid ring_size, must >= rx_free_thresh: %d\n", + rx_free_thresh); + return; + } + + if (rx && res->queue_idx >= nb_rxq) { + printf("Invalid rx queue index, must < nb_rxq: %d\n", + nb_rxq); + return; + } + + if (!rx && res->queue_idx >= nb_txq) { + printf("Invalid tx queue index, must < nb_txq: %d\n", + nb_txq); + return; + } + + port = &ports[res->port_id]; + if (rx) { + struct rte_eth_rxconf rxconf = port->rx_conf; + + rxconf.offloads = res->offloads; + socket_id = rxring_numa[res->port_id]; + if (!numa_support || socket_id == NUMA_NO_CONFIG) + socket_id = port->socket_id; + + mp = mbuf_pool_find(socket_id); + if (mp == NULL) { + printf("Failed to setup RX queue: " + "No mempool allocation" + " on the socket %d\n", + rxring_numa[res->port_id]); + return; + } + ret = rte_eth_rx_queue_setup(res->port_id, + res->queue_idx, + res->ring_size, + socket_id, + &rxconf, + mp); + if (ret) + printf("Failed to setup RX queue\n"); + } else { + struct rte_eth_txconf txconf = port->tx_conf; + + txconf.offloads = res->offloads; + socket_id = txring_numa[res->port_id]; + if (!numa_support || socket_id == NUMA_NO_CONFIG) + socket_id = port->socket_id; + + ret = rte_eth_tx_queue_setup(res->port_id, + res->queue_idx, + res->ring_size, + socket_id, + &txconf); + if (ret) + printf("Failed to setup TX queue\n"); + } +} + +cmdline_parse_inst_t cmd_queue_setup = { + .f = cmd_queue_setup_parsed, + .data = NULL, + .help_str = "queue setup <rx|tx> <port_id> <queue_idx> <ring_size>", + .tokens = { + (void *)&cmd_queue_setup_queue, + (void *)&cmd_queue_setup_setup, + (void *)&cmd_queue_setup_rxtx, + (void *)&cmd_queue_setup_port_id, + (void *)&cmd_queue_setup_queue_idx, + (void *)&cmd_queue_setup_ring_size, + NULL, + }, +}; + /* ******************************************************************************** */ /* list of instructions */ @@ -16272,6 +16399,7 @@ cmdline_parse_ctx_t main_ctx[] = { (cmdline_parse_inst_t *)&cmd_del_port_tm_node, (cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent, (cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit, + (cmdline_parse_inst_t *)&cmd_queue_setup, NULL, }; diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index a766ac795..e8e0b0a4e 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -1444,6 +1444,13 @@ Reset ptype mapping table:: testpmd> ptype mapping reset (port_id) +queue setup +~~~~~~~~~~~ + +Setup a not started queue or re-setup a started queue:: + + testpmd> queue setup (rx|tx) (port_id) (queue_idx) (ring_size) (offloads) + Port Functions -------------- -- 2.13.6