> -----Original Message----- > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Qi Zhang > Sent: Friday, March 2, 2018 4:13 AM > To: tho...@monjalon.net > Cc: dev@dpdk.org; Xing, Beilei <beilei.x...@intel.com>; Wu, Jingjing > <jingjing...@intel.com>; Lu, Wenzhuo <wenzhuo...@intel.com>; > Zhang, Qi Z <qi.z.zh...@intel.com> > Subject: [dpdk-dev] [PATCH v2 3/4] app/testpmd: add command for queue setup > > Add new command to setup queue: > queue setup (rx|tx) (port_id) (queue_idx) (ring_size) > > rte_eth_[rx|tx]_queue_setup will be called corresponsively > > Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> > --- > app/test-pmd/cmdline.c | 136 > ++++++++++++++++++++++++++++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++ > 2 files changed, 143 insertions(+) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index b4522f46a..b725f644d 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)\n" > + " setup a not started queue or re-setup a started > queue.\n\n" > + > , list_pkt_forwarding_modes() > ); > } > @@ -16030,6 +16033,138 @@ 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; > +}; > + > +/* 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); > + > +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; > + 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) { > + if (numa_support && > + (rxring_numa[res->port_id] != NUMA_NO_CONFIG)) { > + mp = mbuf_pool_find(rxring_numa[res->port_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, > + rxring_numa[res->port_id], > + &(port->rx_conf), > + mp);
You can probably reorder that code a bit to mimimize code duplication: If (numa_support ....) { mp = ...; rx_conf = ...; } else { mp = ...; rx_conf = ...; } If (mp == NILL) {....} ret = rte_eth_rx_queue_setup(..., rx_conf, mp); Same for TX. Konstantin