Add .unplug callback to handle driver removal, device unmapping, and
interrupt cleanup. This enables use of the generic bus cleanup helper.

The cleanup function was already performing these operations, so it
seems safe to expose them through the unplug operation.

Signed-off-by: David Marchand <[email protected]>
---
 doc/guides/rel_notes/release_26_07.rst |  4 +++
 drivers/bus/vmbus/vmbus_common.c       | 37 ++++++++++----------------
 2 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/doc/guides/rel_notes/release_26_07.rst 
b/doc/guides/rel_notes/release_26_07.rst
index 966f6501b4..38e4dd87b3 100644
--- a/doc/guides/rel_notes/release_26_07.rst
+++ b/doc/guides/rel_notes/release_26_07.rst
@@ -118,6 +118,10 @@ New Features
 
   Implemented device unplug operation to allow runtime removal of DPAA devices.
 
+* **bus/vmbus: Added unplug operation support.**
+
+  Implemented device unplug operation to allow runtime removal of VMBUS 
devices.
+
 * **Added selective Rx in ethdev API.**
 
   Some parts of packets may be discarded in Rx
diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c
index 4c4170a4b5..419eb9b895 100644
--- a/drivers/bus/vmbus/vmbus_common.c
+++ b/drivers/bus/vmbus/vmbus_common.c
@@ -146,34 +146,23 @@ rte_vmbus_probe(void)
 }
 
 static int
-rte_vmbus_cleanup(struct rte_bus *bus)
+vmbus_unplug_device(struct rte_device *rte_dev)
 {
-       struct rte_vmbus_device *dev;
-       int error = 0;
-
-       RTE_BUS_FOREACH_DEV(dev, bus) {
-               const struct rte_vmbus_driver *drv;
-               int ret;
-
-               if (!rte_dev_is_probed(&dev->device))
-                       continue;
-               drv = RTE_BUS_DRIVER(dev->device.driver, *drv);
-               if (drv->remove == NULL)
-                       continue;
+       const struct rte_vmbus_driver *drv = RTE_BUS_DRIVER(rte_dev->driver, 
*drv);
+       struct rte_vmbus_device *dev = RTE_BUS_DEVICE(rte_dev, *dev);
+       int ret = 0;
 
+       if (drv->remove != NULL) {
                ret = drv->remove(dev);
                if (ret < 0)
-                       error = -1;
-
-               rte_vmbus_unmap_device(dev);
-               rte_intr_instance_free(dev->intr_handle);
-
-               dev->device.driver = NULL;
-               rte_bus_remove_device(bus, &dev->device);
-               free(dev);
+                       return ret;
        }
 
-       return error;
+       rte_vmbus_unmap_device(dev);
+       rte_intr_instance_free(dev->intr_handle);
+       dev->intr_handle = NULL;
+
+       return 0;
 }
 
 static int
@@ -224,10 +213,12 @@ rte_vmbus_unregister(struct rte_vmbus_driver *driver)
 struct rte_bus rte_vmbus_bus = {
        .scan = rte_vmbus_scan,
        .probe = rte_bus_generic_probe,
-       .cleanup = rte_vmbus_cleanup,
+       .free_device = free,
+       .cleanup = rte_bus_generic_cleanup,
        .find_device = rte_bus_generic_find_device,
        .match = vmbus_bus_match,
        .probe_device = vmbus_probe_device,
+       .unplug_device = vmbus_unplug_device,
        .parse = vmbus_parse,
        .dev_compare = vmbus_dev_compare,
 };
-- 
2.53.0

Reply via email to