[dpdk-dev,v4,5/5] app/testpmd: enhance command to test NIC reset

Message ID 1498748282-69914-6-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Wei Dai June 29, 2017, 2:58 p.m. UTC
  When PF is reset, a message will show it and all its
VF need to be reset.
User can run the command "port reset port_id"
to reset the VF port and to keep same port id without
any configuration. Then user can run "port stop port_id"
and "port start port_id" to reconfigure its forwarding
mode and parmaters as previous ones.
To avoid crash, current forwarding should be stopped
before running "port reset port_id".

Signed-off-by: Wei Dai <wei.dai@intel.com>
---
 app/test-pmd/cmdline.c | 10 ++++++---
 app/test-pmd/testpmd.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++---
 app/test-pmd/testpmd.h |  1 +
 3 files changed, 66 insertions(+), 6 deletions(-)
  

Comments

Jingjing Wu June 30, 2017, 8:57 a.m. UTC | #1
> -----Original Message-----
> From: Dai, Wei
> Sent: Thursday, June 29, 2017 10:58 PM
> To: thomas@monjalon.net; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Zhang, Helin <helin.zhang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; yuan.pntel.com
> Cc: dev@dpdk.org; Dai, Wei <wei.dai@intel.com>
> Subject: [PATCH v4 5/5] app/testpmd: enhance command to test NIC reset
> 
> When PF is reset, a message will show it and all its
> VF need to be reset.
> User can run the command "port reset port_id"
> to reset the VF port and to keep same port id without
> any configuration. Then user can run "port stop port_id"
> and "port start port_id" to reconfigure its forwarding
> mode and parmaters as previous ones.
> To avoid crash, current forwarding should be stopped
> before running "port reset port_id".
> 
> Signed-off-by: Wei Dai <wei.dai@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
  
Jingjing Wu June 30, 2017, 9:09 a.m. UTC | #2
> -----Original Message-----
> From: Dai, Wei
> Sent: Thursday, June 29, 2017 10:58 PM
> To: thomas@monjalon.net; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Zhang, Helin <helin.zhang@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>; yuan.pntel.com
> Cc: dev@dpdk.org; Dai, Wei <wei.dai@intel.com>
> Subject: [PATCH v4 5/5] app/testpmd: enhance command to test NIC reset
> 
> When PF is reset, a message will show it and all its
> VF need to be reset.
> User can run the command "port reset port_id"
> to reset the VF port and to keep same port id without
> any configuration. Then user can run "port stop port_id"
> and "port start port_id" to reconfigure its forwarding
> mode and parmaters as previous ones.
> To avoid crash, current forwarding should be stopped
> before running "port reset port_id".
> 
> Signed-off-by: Wei Dai <wei.dai@intel.com>
> ---
>  app/test-pmd/cmdline.c | 10 ++++++---
>  app/test-pmd/testpmd.c | 61
> +++++++++++++++++++++++++++++++++++++++++++++++---
>  app/test-pmd/testpmd.h |  1 +
>  3 files changed, 66 insertions(+), 6 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index ff8ffd2..58ba6e4 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -950,6 +950,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");
>  }
> @@ -959,7 +961,7 @@ 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");
> 
> @@ -994,6 +996,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");
>  }
> @@ -1003,7 +1007,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);
> @@ -1011,7 +1015,7 @@ 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 <port_id>: Start/Stop/Close port_id",
> +	.help_str = "port start|stop|close|reset <port_id>: 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 b29328a..7773879 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -1403,6 +1403,7 @@ start_port(portid_t pid)
>  	queueid_t qi;
>  	struct rte_port *port;
>  	struct ether_addr mac_addr;
> +	struct rte_eth_dev_info dev_info;
>  	enum rte_eth_event_type event_type;
> 
>  	if (port_id_is_invalid(pid, ENABLED_WARN))
> @@ -1424,9 +1425,14 @@ start_port(portid_t pid)
> 
>  		if (port->need_reconfig > 0) {
>  			port->need_reconfig = 0;
> -
> -			printf("Configuring Port %d (socket %u)\n", pi,
> -					port->socket_id);
> +			rte_eth_dev_info_get(pi, &dev_info);
> +			printf("Configuring Port %d (socket %u) with "
> +				"PCI Address: " PCI_PRI_FMT "\n",
> +				pi, port->socket_id,
> +				dev_info.pci_dev->addr.domain,
> +				dev_info.pci_dev->addr.bus,
> +				dev_info.pci_dev->addr.devid,
> +				dev_info.pci_dev->addr.function);
I'm OK with the command change, but could you remove the
PCI print from here. The same reason as your patch 4/5.

Thanks
Jingjing
  
Wei Dai June 30, 2017, 9:15 a.m. UTC | #3
Adding PCI address info here is to let user confirm mapping between PCI address and port id is kept after reset.
As this is only for test purpose,  are you OK for other part except these PCI address printf ?

> -----Original Message-----
> From: Wu, Jingjing
> Sent: Friday, June 30, 2017 5:10 PM
> To: Dai, Wei <wei.dai@intel.com>; thomas@monjalon.net; Lu, Wenzhuo
> <wenzhuo.lu@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Zhang, Helin <helin.zhang@intel.com>;
> Peng, Yuan <yuan.peng@intel.com>
> Cc: dev@dpdk.org
> Subject: RE: [PATCH v4 5/5] app/testpmd: enhance command to test NIC reset
> 
> 
> 
> > -----Original Message-----
> > From: Dai, Wei
> > Sent: Thursday, June 29, 2017 10:58 PM
> > To: thomas@monjalon.net; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Ananyev,
> > Konstantin <konstantin.ananyev@intel.com>; Zhang, Helin
> > <helin.zhang@intel.com>; Wu, Jingjing <jingjing.wu@intel.com>;
> > yuan.pntel.com
> > Cc: dev@dpdk.org; Dai, Wei <wei.dai@intel.com>
> > Subject: [PATCH v4 5/5] app/testpmd: enhance command to test NIC reset
> >
> > When PF is reset, a message will show it and all its VF need to be
> > reset.
> > User can run the command "port reset port_id"
> > to reset the VF port and to keep same port id without any
> > configuration. Then user can run "port stop port_id"
> > and "port start port_id" to reconfigure its forwarding mode and
> > parmaters as previous ones.
> > To avoid crash, current forwarding should be stopped before running
> > "port reset port_id".
> >
> > Signed-off-by: Wei Dai <wei.dai@intel.com>
> > ---
> >  app/test-pmd/cmdline.c | 10 ++++++---  app/test-pmd/testpmd.c | 61
> > +++++++++++++++++++++++++++++++++++++++++++++++---
> >  app/test-pmd/testpmd.h |  1 +
> >  3 files changed, 66 insertions(+), 6 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > ff8ffd2..58ba6e4 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> > @@ -950,6 +950,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");
> >  }
> > @@ -959,7 +961,7 @@ 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");
> >
> > @@ -994,6 +996,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");
> >  }
> > @@ -1003,7 +1007,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);
> > @@ -1011,7 +1015,7 @@ 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 <port_id>: Start/Stop/Close port_id",
> > +	.help_str = "port start|stop|close|reset <port_id>:
> > +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
> > b29328a..7773879 100644
> > --- a/app/test-pmd/testpmd.c
> > +++ b/app/test-pmd/testpmd.c
> > @@ -1403,6 +1403,7 @@ start_port(portid_t pid)
> >  	queueid_t qi;
> >  	struct rte_port *port;
> >  	struct ether_addr mac_addr;
> > +	struct rte_eth_dev_info dev_info;
> >  	enum rte_eth_event_type event_type;
> >
> >  	if (port_id_is_invalid(pid, ENABLED_WARN)) @@ -1424,9 +1425,14 @@
> > start_port(portid_t pid)
> >
> >  		if (port->need_reconfig > 0) {
> >  			port->need_reconfig = 0;
> > -
> > -			printf("Configuring Port %d (socket %u)\n", pi,
> > -					port->socket_id);
> > +			rte_eth_dev_info_get(pi, &dev_info);
> > +			printf("Configuring Port %d (socket %u) with "
> > +				"PCI Address: " PCI_PRI_FMT "\n",
> > +				pi, port->socket_id,
> > +				dev_info.pci_dev->addr.domain,
> > +				dev_info.pci_dev->addr.bus,
> > +				dev_info.pci_dev->addr.devid,
> > +				dev_info.pci_dev->addr.function);
> I'm OK with the command change, but could you remove the PCI print from
> here. The same reason as your patch 4/5.
> 
> Thanks
> Jingjing
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ff8ffd2..58ba6e4 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -950,6 +950,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");
 }
@@ -959,7 +961,7 @@  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");
 
@@ -994,6 +996,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");
 }
@@ -1003,7 +1007,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);
@@ -1011,7 +1015,7 @@  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 <port_id>: Start/Stop/Close port_id",
+	.help_str = "port start|stop|close|reset <port_id>: 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 b29328a..7773879 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -1403,6 +1403,7 @@  start_port(portid_t pid)
 	queueid_t qi;
 	struct rte_port *port;
 	struct ether_addr mac_addr;
+	struct rte_eth_dev_info dev_info;
 	enum rte_eth_event_type event_type;
 
 	if (port_id_is_invalid(pid, ENABLED_WARN))
@@ -1424,9 +1425,14 @@  start_port(portid_t pid)
 
 		if (port->need_reconfig > 0) {
 			port->need_reconfig = 0;
-
-			printf("Configuring Port %d (socket %u)\n", pi,
-					port->socket_id);
+			rte_eth_dev_info_get(pi, &dev_info);
+			printf("Configuring Port %d (socket %u) with "
+				"PCI Address: " PCI_PRI_FMT "\n",
+				pi, port->socket_id,
+				dev_info.pci_dev->addr.domain,
+				dev_info.pci_dev->addr.bus,
+				dev_info.pci_dev->addr.devid,
+				dev_info.pci_dev->addr.function);
 			/* configure port */
 			diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq,
 						&(port->dev_conf));
@@ -1665,6 +1671,55 @@  close_port(portid_t pid)
 }
 
 void
+reset_port(portid_t pid)
+{
+	int diag;
+	portid_t pi;
+	struct rte_port *port;
+	struct rte_eth_dev_info dev_info;
+
+	if (port_id_is_invalid(pid, ENABLED_WARN))
+		return;
+
+	printf("Resetting ports...\n");
+
+	RTE_ETH_FOREACH_DEV(pi) {
+		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;
+		}
+
+		diag = rte_eth_dev_reset(pi);
+		if (diag == 0) {
+			port = &ports[pi];
+			port->need_reconfig = 1;
+			port->need_reconfig_queues = 1;
+			rte_eth_dev_info_get(pi, &dev_info);
+			printf("Finish resetting Port %d with PCI Address: "
+			       PCI_PRI_FMT "\n", pi,
+			       dev_info.pci_dev->addr.domain,
+			       dev_info.pci_dev->addr.bus,
+			       dev_info.pci_dev->addr.devid,
+			       dev_info.pci_dev->addr.function);
+		} else {
+			printf("Failed to reset port %d. diag=%d\n", pi, diag);
+		}
+	}
+
+	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 364502d..e4c704a 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -596,6 +596,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);