Tested-by: Peng, Yuan <yuan.p...@intel.com> - Tested commit bbe569daa7e99b36d44b12bb3d23ddfbc26d383c+the 5 patches. - OS: 4.8.6-300.fc25.x86_64 - GCC: gcc version 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC) - CPU: Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz - NIC: Ethernet controller [0200]: Intel Corporation Ethernet Controller 10G X550T [8086:1563] (rev 01) - Default x86_64-native-linuxapp-gcc configuration - Prerequisites: - Total 1cases, 1 passed, 0 failed
Steps: DUT: 1. echo 2 >/sys/bus/pci/devices/0000:83:00.0/sriov_numvfs ./usertools/dpdk-devbind.py -b vfio-pci 83:10.0 83:10.2 ./x86_64-native-linuxapp-gcc/app/testpmd -c 0x3 -n 4 -- -i 2.testpmd> set verbose 1 testpmd> set fwd mac testpmd> start tester: scapy sendp([Ether(dst="02:09:C0:63:DA:4B")/IP()/UDP()], iface="ens6f0", count=1) dut: testpmd>show port stats all port0 can fwd the packet normally testpmd>show port info all show port number, PCI addr and MAC addr 3. ifconfig ens801f0 down Port 0: Interrupt reset event Port 1: Interrupt reset event ifconfig ens801f0 up 4.testpmd> stop 5. testpmd> port reset all Resetting ports... Finish resetting Port 0 with PCI Address: 0000:83:10.0 Finish resetting Port 1 with PCI Address: 0000:83:10.2 Done 6. testpmd> port stop all Stopping ports... Checking link statuses... Done testpmd> port start all Configuring Port 0 (socket 1) with PCI Address: 0000:83:10.0 Port 0: 02:09:C0:63:DA:4B Configuring Port 1 (socket 1) with PCI Address: 0000:83:10.2 Port 1: 02:09:C0:37:93:6F Checking link statuses... Done 7. testpmd> show port info all confirm same mapping of port id and PCI address. 8.testpmd> start Tester: scapy sendp([Ether(dst="02:09:C0:63:DA:4B")/IP()/UDP()], iface="ens6f0", count=1) dut: testpmd>show port stats all port0 can fwd the packet normally 9.repeat step3 to step8, the same result. -----Original Message----- From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Wei Dai Sent: Thursday, June 29, 2017 10:58 PM To: tho...@monjalon.net; Lu, Wenzhuo <wenzhuo...@intel.com>; Ananyev, Konstantin <konstantin.anan...@intel.com>; Zhang, Helin <helin.zh...@intel.com>; Wu, Jingjing <jingjing...@intel.com>; yuan.pntel....@dpdk.org Cc: dev@dpdk.org; Dai, Wei <wei....@intel.com> Subject: [dpdk-dev] [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....@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); /* 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); -- 2.7.4