[dpdk-stable] patch 'app/testpmd: fix asynchronic port removal' has been queued to stable release 18.02.2

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue May 15 15:46:48 CEST 2018


Hi,

FYI, your patch has been queued to stable release 18.02.2

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 05/16/18. So please
shout if anyone has objections.

Thanks.

Luca Boccassi

---
>From 157baa268d911d22b9496e77e0b165b8fca21396 Mon Sep 17 00:00:00 2001
From: Matan Azrad <matan at mellanox.com>
Date: Thu, 3 May 2018 10:31:48 +0000
Subject: [PATCH] app/testpmd: fix asynchronic port removal

[ upstream commit 3b97888ab2a8405bcbe198abdcc8ac98ee0f0e96 ]

When a removable device is plugged-out, a RMV interrupt is invoked and
the application can catch the event in order to stop the device
management.

The Testpmd wrong behavior in this case is to detach the removed device
using the EAL detach API.

The EAL API does not invalidate the ethdev port and the port keeps
appearing as valid from the ethdev point of view.

Thus, the next operations for the ethtev port X may trigger an invalid
rte_device access. For example, calling "show port info X" may cause
segfault.

Moreover, the removed port is not removed from the Testpmd data-path
structures. Therefore, the invalid device may still be used by the
Testpmd data-path.

Call the Testpmd detach_port() function which uses the ethdev detach
API, and prepare the Testpmd forward ports database for a new
forwarding session without the detached port.

Fixes: 284c908cc588 ("app/testpmd: request device removal interrupt")

Signed-off-by: Matan Azrad <matan at mellanox.com>
---
 app/test-pmd/testpmd.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 3c92e899b..9ab44813d 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2027,21 +2027,23 @@ check_all_ports_link_status(uint32_t port_mask)
 static void
 rmv_event_callback(void *arg)
 {
+	int need_to_start = 0;
 	int org_no_link_check = no_link_check;
-	struct rte_eth_dev *dev;
 	portid_t port_id = (intptr_t)arg;
 
 	RTE_ETH_VALID_PORTID_OR_RET(port_id);
-	dev = &rte_eth_devices[port_id];
 
+	if (!test_done && port_is_forwarding(port_id)) {
+		need_to_start = 1;
+		stop_packet_forwarding();
+	}
 	no_link_check = 1;
 	stop_port(port_id);
 	no_link_check = org_no_link_check;
 	close_port(port_id);
-	printf("removing device %s\n", dev->device->name);
-	if (rte_eal_dev_detach(dev->device))
-		TESTPMD_LOG(ERR, "Failed to detach device %s\n",
-			dev->device->name);
+	detach_port(port_id);
+	if (need_to_start)
+		start_packet_forwarding(0);
 }
 
 /* This function is used by the interrupt thread */
-- 
2.14.2



More information about the stable mailing list