[3/3] testpmd: remove device detach into eal

Message ID 1544773540-89825-4-git-send-email-jia.guo@intel.com
State New
Delegated to: Thomas Monjalon
Headers show
Series
  • use a common eal device event for hot-unplug
Related show

Checks

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

Commit Message

Jeff Guo Dec. 14, 2018, 7:45 a.m.
Assume that eal detect the removal event and handle hot-unplug, so device
detach should be located in eal framework, the sequence should be eal
detect and handle hot-unplug event at first, then eal notify app to finish
pre-detach prepare, such as stop forwarding and clean ports, finally device
be detached safely in eal. This patch aim to remove the invoke of device
detach from app callback to eal device event handler.

Signed-off-by: Jeff Guo <jia.guo@intel.com>
---
 app/test-pmd/testpmd.c                |  1 -
 drivers/bus/pci/pci_common.c          |  7 +++++++
 lib/librte_eal/linuxapp/eal/eal_dev.c | 16 +++++++++++++++-
 3 files changed, 22 insertions(+), 2 deletions(-)

Patch

diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index bd44b21..f15035c 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -2538,7 +2538,6 @@  rmv_port_callback(void *arg)
 	stop_port(port_id);
 	no_link_check = org_no_link_check;
 	close_port(port_id);
-	detach_port_device(port_id);
 	if (need_to_start)
 		start_packet_forwarding(0);
 }
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index 6276e5d..565f8cf 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -465,6 +465,13 @@  pci_hot_unplug_handler(struct rte_device *dev)
 		 */
 		rte_dev_event_callback_process(dev->name,
 					       RTE_DEV_EVENT_REMOVE);
+		ret = rte_dev_remove(dev);
+		if (ret) {
+			RTE_LOG(ERR, EAL, "Failed to remove device %s\n",
+				dev->name);
+			return -1;
+		}
+		RTE_LOG(INFO, EAL, "Success to remove device %s\n", dev->name);
 		break;
 #endif
 	case RTE_KDRV_IGB_UIO:
diff --git a/lib/librte_eal/linuxapp/eal/eal_dev.c b/lib/librte_eal/linuxapp/eal/eal_dev.c
index 2830c86..f4a75f8 100644
--- a/lib/librte_eal/linuxapp/eal/eal_dev.c
+++ b/lib/librte_eal/linuxapp/eal/eal_dev.c
@@ -275,8 +275,22 @@  dev_uev_handler(__rte_unused void *param)
 					"for device (%s)\n", dev->name);
 			}
 			rte_spinlock_unlock(&failure_handle_lock);
+
+			rte_dev_event_callback_process(uevent.devname,
+						       uevent.type);
+			ret = rte_dev_remove(dev);
+			if (ret) {
+				RTE_LOG(ERR, EAL,
+					"Failed to remove device %s\n",
+					dev->name);
+				return;
+			}
+			RTE_LOG(INFO, EAL, "Success to remove device %s\n",
+				dev->name);
+		} else {
+			rte_dev_event_callback_process(uevent.devname,
+						       uevent.type);
 		}
-		rte_dev_event_callback_process(uevent.devname, uevent.type);
 	}
 
 	return;