From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id D00B210BAB for ; Thu, 30 Mar 2017 11:00:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1490864452; x=1522400452; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=zyuyl2sxgwmIn01ymzWzoWC+BHWpcf+5LrNSb3wKkxs=; b=eoGVU/KHkp4boJouGF1qor66JwDihy7dQuKJ78IwFZzDqkN+6bl34VZB 2nT90oItnvEvvqtcPOiiEcwGlhceDA==; Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Mar 2017 02:00:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,246,1486454400"; d="scan'208";a="82638925" Received: from kmsmsx154.gar.corp.intel.com ([172.21.73.14]) by fmsmga006.fm.intel.com with ESMTP; 30 Mar 2017 02:00:46 -0700 Received: from pgsmsx109.gar.corp.intel.com (10.221.44.109) by KMSMSX154.gar.corp.intel.com (172.21.73.14) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 30 Mar 2017 16:58:34 +0800 Received: from pgsmsx103.gar.corp.intel.com ([169.254.2.72]) by PGSMSX109.gar.corp.intel.com ([169.254.14.172]) with mapi id 14.03.0248.002; Thu, 30 Mar 2017 16:58:33 +0800 From: "Zhao1, Wei" To: "Wu, Jingjing" , "dev@dpdk.org" CC: "Lu, Wenzhuo" Thread-Topic: [dpdk-dev] [PATCH v3 3/3] app/testpmd: add port reset command into testpmd Thread-Index: AQHSqTNTMEH5jmn9UUSApa1NCJYKBKGtFOmQ Date: Thu, 30 Mar 2017 08:58:32 +0000 Message-ID: References: <1490688547-4831-1-git-send-email-wei.zhao1@intel.com> <1490688547-4831-4-git-send-email-wei.zhao1@intel.com> <9BB6961774997848B5B42BEC655768F810D1B58F@SHSMSX103.ccr.corp.intel.com> In-Reply-To: <9BB6961774997848B5B42BEC655768F810D1B58F@SHSMSX103.ccr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [172.30.20.205] 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 09:00:53 -0000 HI, jingjing Ok, I will commit a v4 version. > -----Original Message----- > From: Wu, Jingjing > Sent: Thursday, March 30, 2017 4:55 PM > To: Zhao1, Wei ; dev@dpdk.org > Cc: Zhao1, Wei ; Lu, Wenzhuo > > Subject: RE: [dpdk-dev] [PATCH v3 3/3] app/testpmd: add port reset > command into testpmd >=20 >=20 >=20 > > -----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 > > into testpmd > > > > 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 > > port reset.But this patch set only realted to vf reset feature. > > > > 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(-) > > > > 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" > > > > + "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" > > > > @@ -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"); > > > > 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_id", > > + .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. */ > > > > 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] =3D {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).= */ > > @@ -1305,6 +1306,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 =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) } > > > > 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. >=20 > > + } > > + > > + 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