On 9/3/2019 4:39 AM, kirankum...@marvell.com wrote: > From: Kiran Kumar K <kirankum...@marvell.com> > > Adding support to check TX and RX descriptor status.
+1 to the command > > Signed-off-by: Kiran Kumar K <kirankum...@marvell.com> > --- > app/test-pmd/cmdline.c | 111 ++++++++++++++++++++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 ++ > 2 files changed, 119 insertions(+) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index b6bc34b4d..c22d041c3 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -18728,6 +18728,115 @@ cmdline_parse_inst_t cmd_show_tx_metadata = { > }, > }; > > +/* *** display rx/tx descriptor status *** */ > +struct cmd_show_rx_tx_desc_status_result { > + cmdline_fixed_string_t cmd_show; > + cmdline_fixed_string_t cmd_port; > + cmdline_fixed_string_t cmd_keyword; > + cmdline_fixed_string_t cmd_status; > + portid_t cmd_pid; > + portid_t cmd_qid; > + portid_t cmd_did; > +}; > + > +static void > +cmd_show_rx_tx_desc_status_parsed(void *parsed_result, > + __attribute__((unused)) struct cmdline *cl, > + __attribute__((unused)) void *data) > +{ > + struct cmd_show_rx_tx_desc_status_result *res = parsed_result; > + int rc; > + > + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { > + printf("invalid port id %u\n", res->cmd_pid); > + return; > + } > + > + if (!strcmp(res->cmd_keyword, "rx")) { > + rc = rte_eth_rx_descriptor_status(res->cmd_pid, res->cmd_qid, > + res->cmd_did); > + if (rc < 0) { > + printf("Invalid queueid = %d\n", res->cmd_qid); > + return; > + } > + if (rc == RTE_ETH_RX_DESC_AVAIL) > + printf("Desc status = AVAILABLE\n"); > + else if (rc == RTE_ETH_RX_DESC_DONE) > + printf("Desc status = DONE\n"); > + else > + printf("Desc status = UNAVAILABLE\n"); > + } else if (!strcmp(res->cmd_keyword, "tx")) { > + rc = rte_eth_tx_descriptor_status(res->cmd_pid, res->cmd_qid, > + res->cmd_did); > + if (rc < 0) { > + printf("Invalid queueid = %d\n", res->cmd_qid); > + return; > + } > + if (rc == RTE_ETH_TX_DESC_FULL) > + printf("Desc status = FULL\n"); > + else if (rc == RTE_ETH_TX_DESC_DONE) > + printf("Desc status = DONE\n"); > + else > + printf("Desc status = UNAVAILABLE\n"); > + } > +} > + > +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_show = > + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_show, "show"); > +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_port = > + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_port, "port"); > +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_pid = > + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_pid, UINT16); > +cmdline_parse_token_string_t cmd_show_rx_desc_status_keyword = > + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_keyword, "rx"); > +cmdline_parse_token_string_t cmd_show_tx_desc_status_keyword = > + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_keyword, "tx"); > +cmdline_parse_token_string_t cmd_show_rx_tx_desc_status_status = > + TOKEN_STRING_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_status, "status"); > +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_qid = > + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_qid, UINT16); > +cmdline_parse_token_num_t cmd_show_rx_tx_desc_status_did = > + TOKEN_NUM_INITIALIZER(struct cmd_show_rx_tx_desc_status_result, > + cmd_did, UINT16); > +cmdline_parse_inst_t cmd_show_rx_desc_status = { > + .f = cmd_show_rx_tx_desc_status_parsed, > + .data = NULL, > + .help_str = "show port <port_id> rx <queue_id> <desc_id> status", > + .tokens = { > + (void *)&cmd_show_rx_tx_desc_status_show, > + (void *)&cmd_show_rx_tx_desc_status_port, > + (void *)&cmd_show_rx_tx_desc_status_pid, > + (void *)&cmd_show_rx_desc_status_keyword, > + (void *)&cmd_show_rx_tx_desc_status_qid, > + (void *)&cmd_show_rx_tx_desc_status_did, > + (void *)&cmd_show_rx_tx_desc_status_status, > + NULL, > + }, > +}; > + > +cmdline_parse_inst_t cmd_show_tx_desc_status = { > + .f = cmd_show_rx_tx_desc_status_parsed, > + .data = NULL, > + .help_str = "show port <port_id> tx <queue_id> <desc_id> status", Please add new command to the help string, in 'cmd_help_long_parsed()' > + .tokens = { > + (void *)&cmd_show_rx_tx_desc_status_show, > + (void *)&cmd_show_rx_tx_desc_status_port, > + (void *)&cmd_show_rx_tx_desc_status_pid, > + (void *)&cmd_show_tx_desc_status_keyword, > + (void *)&cmd_show_rx_tx_desc_status_qid, > + (void *)&cmd_show_rx_tx_desc_status_did, > + (void *)&cmd_show_rx_tx_desc_status_status, > + NULL, > + }, > +}; Instead of creating two 'cmdline_parse_inst_t', you can use 'TOKEN_STRING_INITIALIZER' with '#' to add multiple value, like "rxq#txq", there are multiple sample in testpmd. > + > /* > ******************************************************************************** > */ > > /* list of instructions */ > @@ -19016,6 +19125,8 @@ cmdline_parse_ctx_t main_ctx[] = { > #endif > (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific, > (cmdline_parse_inst_t *)&cmd_show_tx_metadata, > + (cmdline_parse_inst_t *)&cmd_show_rx_desc_status, > + (cmdline_parse_inst_t *)&cmd_show_tx_desc_status, > (cmdline_parse_inst_t *)&cmd_set_raw, > NULL, > }; > diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index 67f4339ca..a708c5ccf 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -254,6 +254,14 @@ Display information for a given port's RX/TX queue:: > > testpmd> show (rxq|txq) info (port_id) (queue_id) > > +show desc status(rxq|txq) > +~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +Display information for a given port's RX/TX descriptor status:: > + > + testpmd> show port (port_id) (rx|tx) (queue_id) (desc_id) status Better to use 'rxq' or 'txq' for consistency. and some variables has keyword before them, like "port 0", some doesn't like <desc_id>, I think better to add a keyword for 'desc_id', something like 'desc' perhaps. > + > + > show config > ~~~~~~~~~~~ > >