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 | 41 ++++++++++++-------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/doc/guides/rel_notes/release_26_07.rst b/doc/guides/rel_notes/release_26_07.rst index 5d7aa8d1bf..55d3b44527 100644 --- a/doc/guides/rel_notes/release_26_07.rst +++ b/doc/guides/rel_notes/release_26_07.rst @@ -114,6 +114,10 @@ New Features Added no-IOMMU mode for devices without or not enabling IOMMU/SVA. +* **Added unplug operation support to VMBUS bus.** + + 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 a6e3a24a7c..cd6e851e4c 100644 --- a/drivers/bus/vmbus/vmbus_common.c +++ b/drivers/bus/vmbus/vmbus_common.c @@ -144,34 +144,29 @@ 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; + return ret; + } - rte_vmbus_unmap_device(dev); - rte_intr_instance_free(dev->intr_handle); + rte_vmbus_unmap_device(dev); + rte_intr_instance_free(dev->intr_handle); + dev->intr_handle = NULL; - dev->device.driver = NULL; - rte_bus_remove_device(bus, &dev->device); - free(dev); - } + return 0; +} - return error; +static void +vmbus_free_device(struct rte_device *dev) +{ + free(RTE_BUS_DEVICE(dev, struct rte_vmbus_device)); } static int @@ -222,10 +217,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 = vmbus_free_device, + .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

