From patchwork Fri Mar 3 04:56:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhao1, Wei" X-Patchwork-Id: 21175 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 92CEA6CB4; Fri, 3 Mar 2017 06:03:43 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id E7F0D2B93 for ; Fri, 3 Mar 2017 06:03:13 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 Mar 2017 21:03:12 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,235,1484035200"; d="scan'208";a="830405468" Received: from dpdk1.bj.intel.com ([172.16.182.84]) by FMSMGA003.fm.intel.com with ESMTP; 02 Mar 2017 21:03:11 -0800 From: Wei Zhao To: dev@dpdk.org Cc: Wei Zhao , Wenzhuo Lu Date: Fri, 3 Mar 2017 12:56:22 +0800 Message-Id: <1488516984-34702-2-git-send-email-wei.zhao1@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1488516984-34702-1-git-send-email-wei.zhao1@intel.com> References: <1488516984-34702-1-git-send-email-wei.zhao1@intel.com> Subject: [dpdk-dev] [PATCH 1/3] app/testpmd: add port reset command into testpmd 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 vf port reset command into testpmd project, it is the interface for user to reset vf port. Signed-off-by: Wei Zhao Signed-off-by: Wenzhuo Lu --- app/test-pmd/cmdline.c | 17 ++++++++++--- app/test-pmd/testpmd.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ app/test-pmd/testpmd.h | 1 + 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 43fc636..59db672 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -596,6 +596,9 @@ static void cmd_help_long_parsed(void *parsed_result, "port close (port_id|all)\n" " Close all ports or port_id.\n\n" + "port reset (port_id|all)\n" + " Reset all ports or port_id.\n\n" + "port attach (ident)\n" " Attach physical or virtual dev by pci address or virtual device name\n\n" @@ -906,6 +909,8 @@ static void cmd_operate_port_parsed(void *parsed_result, stop_port(RTE_PORT_ALL); else if (!strcmp(res->name, "close")) close_port(RTE_PORT_ALL); + else if (!strcmp(res->name, "reset")) + reset_port(RTE_PORT_ALL); else printf("Unknown parameter\n"); } @@ -915,14 +920,15 @@ cmdline_parse_token_string_t cmd_operate_port_all_cmd = "port"); cmdline_parse_token_string_t cmd_operate_port_all_port = TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, name, - "start#stop#close"); + "start#stop#close#reset"); cmdline_parse_token_string_t cmd_operate_port_all_all = TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, value, "all"); cmdline_parse_inst_t cmd_operate_port = { .f = cmd_operate_port_parsed, .data = NULL, - .help_str = "port start|stop|close all: Start/Stop/Close all ports", + .help_str = "port start|stop|close|reset all: Start/Stop/Close/" + "Reset all ports", .tokens = { (void *)&cmd_operate_port_all_cmd, (void *)&cmd_operate_port_all_port, @@ -950,6 +956,8 @@ static void cmd_operate_specific_port_parsed(void *parsed_result, stop_port(res->value); else if (!strcmp(res->name, "close")) close_port(res->value); + else if (!strcmp(res->name, "reset")) + reset_port(res->value); else printf("Unknown parameter\n"); } @@ -959,7 +967,7 @@ cmdline_parse_token_string_t cmd_operate_specific_port_cmd = keyword, "port"); cmdline_parse_token_string_t cmd_operate_specific_port_port = TOKEN_STRING_INITIALIZER(struct cmd_operate_specific_port_result, - name, "start#stop#close"); + name, "start#stop#close#reset"); cmdline_parse_token_num_t cmd_operate_specific_port_id = TOKEN_NUM_INITIALIZER(struct cmd_operate_specific_port_result, value, UINT8); @@ -967,7 +975,8 @@ cmdline_parse_token_num_t cmd_operate_specific_port_id = cmdline_parse_inst_t cmd_operate_specific_port = { .f = cmd_operate_specific_port_parsed, .data = NULL, - .help_str = "port start|stop|close : Start/Stop/Close port_id", + .help_str = "port start|stop|close|reset : Start/Stop/Close/" + "Reset port_id", .tokens = { (void *)&cmd_operate_specific_port_cmd, (void *)&cmd_operate_specific_port_port, diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index bfb2f8e..12b7aaa 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -137,6 +137,7 @@ portid_t nb_fwd_ports; /**< Number of forwarding ports. */ unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; /**< CPU ids configuration. */ portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; /**< Port ids configuration. */ +volatile char reset_ports[RTE_MAX_ETHPORTS] = {0}; /**< Portr reset falg. */ struct fwd_stream **fwd_streams; /**< For each RX queue of each port. */ streamid_t nb_fwd_streams; /**< Is equal to (nb_ports * nb_rxq). */ @@ -601,6 +602,7 @@ init_config(void) if (init_fwd_streams() < 0) rte_exit(EXIT_FAILURE, "FAIL from init_fwd_streams()\n"); + fwd_config_setup(); } @@ -1305,6 +1307,17 @@ port_is_closed(portid_t port_id) return 1; } +static void +reset_event_callback(uint8_t port_id, enum rte_eth_event_type type, void *param) +{ + RTE_SET_USED(param); + + printf("Event type: %s on port %d\n", + type == RTE_ETH_EVENT_INTR_RESET ? "RESET interrupt" : + "unknown event", port_id); + reset_ports[port_id] = 1; +} + int start_port(portid_t pid) { @@ -1350,6 +1363,10 @@ start_port(portid_t pid) return -1; } } + + /* register reset interrupt callback */ + rte_eth_dev_callback_register(pi, RTE_ETH_EVENT_INTR_RESET, + reset_event_callback, NULL); if (port->need_reconfig_queues > 0) { port->need_reconfig_queues = 0; /* setup tx queues */ @@ -1559,6 +1576,56 @@ close_port(portid_t pid) } void +reset_port(portid_t pid) +{ + portid_t pi; + struct rte_port *port; + + if (port_id_is_invalid(pid, ENABLED_WARN)) + return; + + printf("Closing ports...\n"); + + FOREACH_PORT(pi, ports) { + if (pid != pi && pid != (portid_t)RTE_PORT_ALL) + continue; + + if (port_is_forwarding(pi) != 0 && test_done == 0) { + printf("Please remove port %d from forwarding " + "configuration.\n", pi); + continue; + } + + if (port_is_bonding_slave(pi)) { + printf("Please remove port %d from " + "bonded device.\n", pi); + continue; + } + + if (!reset_ports[pi]) { + printf("vf must get reset port %d info from " + "pf before reset.\n", pi); + continue; + } + + port = &ports[pi]; + if (rte_atomic16_cmpset(&(port->port_status), + RTE_PORT_STARTED, RTE_PORT_HANDLING) == 1) { + printf("Port %d is not started\n", pi); + continue; + } + + reset_ports[pi] = 0; + + if (rte_atomic16_cmpset(&(port->port_status), + RTE_PORT_HANDLING, RTE_PORT_STARTED) == 0) + printf("Port %d cannot be set to started\n", pi); + } + + printf("Done\n"); +} + +void attach_port(char *identifier) { portid_t pi = 0; diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 8cf2860..0c7e44c 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -586,6 +586,7 @@ int init_port_dcb_config(portid_t pid, enum dcb_mode_enable dcb_mode, int start_port(portid_t pid); void stop_port(portid_t pid); void close_port(portid_t pid); +void reset_port(portid_t pid); void attach_port(char *identifier); void detach_port(uint8_t port_id); int all_ports_stopped(void);