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

Message ID 1544773540-89825-4-git-send-email-jia.guo@intel.com (mailing list archive)
State Rejected, archived
Delegated to: Thomas Monjalon
Headers
Series use a common eal device event for hot-unplug |

Checks

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

Commit Message

Guo, Jia Dec. 14, 2018, 7:45 a.m. UTC
  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;