From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id ACCD810BA9 for ; Thu, 30 Mar 2017 10:55:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1490864122; x=1522400122; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=Ip2N20GSGj+OmCbb+UR/ovbWeVA3hwtfFiUJRqeTxTE=; b=DDvUV8FgG5trAew1Z6EWWPbGZURudaMgqWZj9Ue2ns0Lz2rEegRinA8a qZXyN+Wo2Klw7Qt6WjTw+V5EsHltpw==; Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Mar 2017 01:55:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,246,1486454400"; d="scan'208";a="82637428" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga006.fm.intel.com with ESMTP; 30 Mar 2017 01:55:06 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 30 Mar 2017 01:55:05 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.253]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.42]) with mapi id 14.03.0248.002; Thu, 30 Mar 2017 16:55:04 +0800 From: "Wu, Jingjing" To: "Zhao1, Wei" , "dev@dpdk.org" CC: "Zhao1, Wei" , "Lu, Wenzhuo" Thread-Topic: [dpdk-dev] [PATCH v3 3/3] app/testpmd: add port reset command into testpmd Thread-Index: AQHSp5ubB3KY35fBAUiWw7aAPoDSY6GtFQWA Date: Thu, 30 Mar 2017 08:55:03 +0000 Message-ID: <9BB6961774997848B5B42BEC655768F810D1B58F@SHSMSX103.ccr.corp.intel.com> References: <1490688547-4831-1-git-send-email-wei.zhao1@intel.com> <1490688547-4831-4-git-send-email-wei.zhao1@intel.com> In-Reply-To: <1490688547-4831-4-git-send-email-wei.zhao1@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v3 3/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: , X-List-Received-Date: Thu, 30 Mar 2017 08:55:22 -0000 > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wei Zhao > Sent: Tuesday, March 28, 2017 4:09 PM > To: dev@dpdk.org > Cc: Zhao1, Wei ; Lu, Wenzhuo > Subject: [dpdk-dev] [PATCH v3 3/3] app/testpmd: add port reset command in= to > testpmd >=20 > Add port reset command into testpmd project, it is the interface for user= to > reset port. > And also it is not limit to be used only in vf reset, but also for pf por= t reset.But > this patch set only realted to vf reset feature. >=20 > Signed-off-by: Wei Zhao > Signed-off-by: Wenzhuo Lu > --- > app/test-pmd/cmdline.c | 17 ++++++++++---- app/test-pmd/testpmd.c | 63 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > app/test-pmd/testpmd.h | 1 + > 3 files changed, 77 insertions(+), 4 deletions(-) >=20 > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index > 47f935d..6cbdcc8 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -599,6 +599,9 @@ static void cmd_help_long_parsed(void *parsed_result, > "port close (port_id|all)\n" > " Close all ports or port_id.\n\n" >=20 > + "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" >=20 > @@ -909,6 +912,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"); > } > @@ -918,14 +923,15 @@ cmdline_parse_token_string_t > cmd_operate_port_all_cmd =3D > "port"); > cmdline_parse_token_string_t cmd_operate_port_all_port =3D > 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 =3D > TOKEN_STRING_INITIALIZER(struct cmd_operate_port_result, value, > "all"); >=20 > cmdline_parse_inst_t cmd_operate_port =3D { > .f =3D cmd_operate_port_parsed, > .data =3D NULL, > - .help_str =3D "port start|stop|close all: Start/Stop/Close all ports", > + .help_str =3D "port start|stop|close|reset all: Start/Stop/Close/" > + "Reset all ports", > .tokens =3D { > (void *)&cmd_operate_port_all_cmd, > (void *)&cmd_operate_port_all_port, > @@ -953,6 +959,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"); > } > @@ -962,7 +970,7 @@ cmdline_parse_token_string_t > cmd_operate_specific_port_cmd =3D > keyword, "port"); > cmdline_parse_token_string_t cmd_operate_specific_port_port =3D > 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 =3D > TOKEN_NUM_INITIALIZER(struct cmd_operate_specific_port_result, > value, UINT8); > @@ -970,7 +978,8 @@ cmdline_parse_token_num_t > cmd_operate_specific_port_id =3D cmdline_parse_inst_t > cmd_operate_specific_port =3D { > .f =3D cmd_operate_specific_port_parsed, > .data =3D NULL, > - .help_str =3D "port start|stop|close : Start/Stop/Close port_i= d", > + .help_str =3D "port start|stop|close|reset : Start/Stop/Close/= " > + "Reset port_id", > .tokens =3D { > (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 > 484c19b..a053562 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. */ >=20 > unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; /**< CPU ids configuratio= n. > */ > portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; /**< Port ids configurati= on. > */ > +volatile char reset_ports[RTE_MAX_ETHPORTS] =3D {0}; /**< Portr reset > +falg. */ >=20 > struct fwd_stream **fwd_streams; /**< For each RX queue of each port. */ > streamid_t nb_fwd_streams; /**< Is equal to (nb_ports * nb_rxq). *= / > @@ -1305,6 +1306,17 @@ port_is_closed(portid_t port_id) > return 1; > } >=20 > +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 =3D=3D RTE_ETH_EVENT_INTR_RESET ? "RESET interrupt" : > + "unknown event", port_id); > + reset_ports[port_id] =3D 1; It's better to add rte_wmb() after change the reset_ports. > +} > + > int > start_port(portid_t pid) > { > @@ -1350,6 +1362,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 =3D 0; > /* setup tx queues */ > @@ -1559,6 +1575,53 @@ close_port(portid_t pid) } >=20 > void > +reset_port(portid_t pid) > +{ > + portid_t pi; > + struct rte_port *port; > + > + if (port_id_is_invalid(pid, ENABLED_WARN)) > + return; > + > + printf("Reset ports...\n"); > + > + FOREACH_PORT(pi, ports) { > + if (pid !=3D pi && pid !=3D (portid_t)RTE_PORT_ALL) > + continue; > + > + if (port_is_forwarding(pi) !=3D 0 && test_done =3D=3D 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 =3D &ports[pi]; > + if (rte_atomic16_cmpset(&(port->port_status), > + RTE_PORT_STOPPED, RTE_PORT_HANDLING) =3D=3D 1) { > + printf("Port %d is not stopped\n", pi); > + continue; > + } > + > + rte_eth_dev_reset(pi); > + reset_ports[pi] =3D 0; It's better to add rte_wmb() after change the reset_ports. > + } > + > + printf("Done\n"); > +} > + > +void > attach_port(char *identifier) > { > portid_t pi =3D 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); > -- > 2.9.3