From patchwork Mon Apr 2 02:59:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 36837 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 224605F38; Mon, 2 Apr 2018 04:59:38 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id DFE814F94 for ; Mon, 2 Apr 2018 04:59:34 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Apr 2018 19:59:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,393,1517904000"; d="scan'208";a="30272656" Received: from dpdk51.sh.intel.com ([10.67.110.184]) by orsmga008.jf.intel.com with ESMTP; 01 Apr 2018 19:59:32 -0700 From: Qi Zhang To: thomas@monjalon.net, konstantin.ananyev@intel.com Cc: dev@dpdk.org, beilei.xing@intel.com, jingjing.wu@intel.com, wenzhuo.lu@intel.com, Qi Zhang Date: Mon, 2 Apr 2018 10:59:34 +0800 Message-Id: <20180402025935.33312-3-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180402025935.33312-1-qi.z.zhang@intel.com> References: <20180212045314.171616-1-qi.z.zhang@intel.com> <20180402025935.33312-1-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH v5 2/3] app/testpmd: add command for queue setup X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- v5: - fix command description. v4: - fix missing offload in command line. v3: - add offload parameter to queue setup command. - couple code refactory. app/test-pmd/cmdline.c | 129 ++++++++++++++++++++++++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++ 2 files changed, 136 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index d1dc1de6c..449c7c634 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 rx or tx queue.\n\n" + , list_pkt_forwarding_modes() ); } @@ -16030,6 +16033,131 @@ 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 ", + .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, + (void *)&cmd_queue_setup_offloads, + NULL, + }, +}; + /* ******************************************************************************** */ /* list of instructions */ @@ -16272,6 +16400,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 rx or tx queue:: + + testpmd> queue setup (rx|tx) (port_id) (queue_idx) (ring_size) (offloads) + Port Functions --------------