From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Ananyev, Konstantin" Subject: Re: [PATCH v2 3/4] app/testpmd: add command for queue setup Date: Wed, 14 Mar 2018 17:36:20 +0000 Message-ID: <2601191342CEEE43887BDE71AB9772589E28FCF5@irsmsx105.ger.corp.intel.com> References: <20180212045314.171616-1-qi.z.zhang@intel.com> <20180302041306.90324-1-qi.z.zhang@intel.com> <20180302041306.90324-4-qi.z.zhang@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Cc: "dev@dpdk.org" , "Xing, Beilei" , "Wu, Jingjing" , "Lu, Wenzhuo" , "Zhang, Qi Z" To: "Zhang, Qi Z" , "thomas@monjalon.net" Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 289075F45 for ; Wed, 14 Mar 2018 18:36:23 +0100 (CET) In-Reply-To: <20180302041306.90324-4-qi.z.zhang@intel.com> Content-Language: en-US List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Qi Zhang > Sent: Friday, March 2, 2018 4:13 AM > To: thomas@monjalon.net > Cc: dev@dpdk.org; Xing, Beilei ; Wu, Jingjing ; Lu, Wenzhuo ; > Zhang, Qi Z > Subject: [dpdk-dev] [PATCH v2 3/4] app/testpmd: add command for queue set= up >=20 > Add new command to setup queue: > queue setup (rx|tx) (port_id) (queue_idx) (ring_size) >=20 > rte_eth_[rx|tx]_queue_setup will be called corresponsively >=20 > Signed-off-by: Qi Zhang > --- > app/test-pmd/cmdline.c | 136 ++++++++++++++++++++++= ++++++ > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++ > 2 files changed, 143 insertions(+) >=20 > 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" >=20 > + "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 =3D { > }, > }; >=20 > +/* 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 =3D > + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, queue, "queue")= ; > +cmdline_parse_token_string_t cmd_queue_setup_setup =3D > + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, setup, "setup")= ; > +cmdline_parse_token_string_t cmd_queue_setup_rxtx =3D > + TOKEN_STRING_INITIALIZER(struct cmd_queue_setup_result, rxtx, "rx#tx"); > +cmdline_parse_token_num_t cmd_queue_setup_port_id =3D > + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, port_id, UINT16); > +cmdline_parse_token_num_t cmd_queue_setup_queue_idx =3D > + TOKEN_NUM_INITIALIZER(struct cmd_queue_setup_result, queue_idx, UINT16)= ; > +cmdline_parse_token_num_t cmd_queue_setup_ring_size =3D > + 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 =3D parsed_result; > + struct rte_port *port; > + struct rte_mempool *mp; > + uint8_t rx =3D 1; > + int ret; > + > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > + return; > + > + if (!strcmp(res->rxtx, "tx")) > + rx =3D 0; > + > + if (rx && res->ring_size <=3D rx_free_thresh) { > + printf("Invalid ring_size, must >=3D rx_free_thresh: %d\n", > + rx_free_thresh); > + return; > + } > + > + if (rx && res->queue_idx >=3D nb_rxq) { > + printf("Invalid rx queue index, must < nb_rxq: %d\n", > + nb_rxq); > + return; > + } > + > + if (!rx && res->queue_idx >=3D nb_txq) { > + printf("Invalid tx queue index, must < nb_txq: %d\n", > + nb_txq); > + return; > + } > + > + port =3D &ports[res->port_id]; > + if (rx) { > + if (numa_support && > + (rxring_numa[res->port_id] !=3D NUMA_NO_CONFIG)) { > + mp =3D mbuf_pool_find(rxring_numa[res->port_id]); > + if (mp =3D=3D NULL) { > + printf("Failed to setup RX queue: " > + "No mempool allocation" > + " on the socket %d\n", > + rxring_numa[res->port_id]); > + return; > + } > + ret =3D 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 =3D ...; rx_conf =3D ...;=20 } else { mp =3D ...; rx_conf =3D ...; } If (mp =3D=3D NILL) {....} ret =3D rte_eth_rx_queue_setup(..., rx_conf, mp); Same for TX. Konstantin