driver core: bus: move bus notifier logic into bus.c
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 11 Jan 2023 09:23:31 +0000 (10:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 08:00:48 +0000 (09:00 +0100)
The logic to touch the bus notifier was open-coded in numberous places
in the driver core.  Clean that up by creating a local bus_notify()
function and have everyone call this function instead, making the
reading of the caller code simpler and easier to maintain over time.

Reviewed-by: Rafael J. Wysocki <rafael@kernel.org>
Link: https://lore.kernel.org/r/20230111092331.3946745-2-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/base.h
drivers/base/bus.c
drivers/base/core.c
drivers/base/dd.c

index 2eb722d..3d1da10 100644 (file)
@@ -130,6 +130,7 @@ struct kobject *virtual_device_parent(struct device *dev);
 extern int bus_add_device(struct device *dev);
 extern void bus_probe_device(struct device *dev);
 extern void bus_remove_device(struct device *dev);
+void bus_notify(struct device *dev, enum bus_notifier_event value);
 
 extern int bus_add_driver(struct device_driver *drv);
 extern void bus_remove_driver(struct device_driver *drv);
index 428c26c..cf1b8f0 100644 (file)
@@ -850,6 +850,14 @@ int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
 }
 EXPORT_SYMBOL_GPL(bus_unregister_notifier);
 
+void bus_notify(struct device *dev, enum bus_notifier_event value)
+{
+       struct bus_type *bus = dev->bus;
+
+       if (bus)
+               blocking_notifier_call_chain(&bus->p->bus_notifier, value, dev);
+}
+
 struct kset *bus_get_kset(struct bus_type *bus)
 {
        return &bus->p->subsys;
index 506289e..110dbd4 100644 (file)
@@ -3453,10 +3453,7 @@ int device_add(struct device *dev)
        /* Notify clients of device addition.  This call must come
         * after dpm_sysfs_add() and before kobject_uevent().
         */
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_ADD_DEVICE, dev);
-
+       bus_notify(dev, BUS_NOTIFY_ADD_DEVICE);
        kobject_uevent(&dev->kobj, KOBJ_ADD);
 
        /*
@@ -3637,9 +3634,7 @@ void device_del(struct device *dev)
         * before dpm_sysfs_remove().
         */
        noio_flag = memalloc_noio_save();
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_DEL_DEVICE, dev);
+       bus_notify(dev, BUS_NOTIFY_DEL_DEVICE);
 
        dpm_sysfs_remove(dev);
        if (parent)
@@ -3670,9 +3665,7 @@ void device_del(struct device *dev)
        device_platform_notify_remove(dev);
        device_links_purge(dev);
 
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_REMOVED_DEVICE, dev);
+       bus_notify(dev, BUS_NOTIFY_REMOVED_DEVICE);
        kobject_uevent(&dev->kobj, KOBJ_REMOVE);
        glue_dir = get_glue_dir(dev);
        kobject_del(&dev->kobj);
index 69daf9d..817ef27 100644 (file)
@@ -411,10 +411,7 @@ static void driver_bound(struct device *dev)
        driver_deferred_probe_del(dev);
        driver_deferred_probe_trigger();
 
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_BOUND_DRIVER, dev);
-
+       bus_notify(dev, BUS_NOTIFY_BOUND_DRIVER);
        kobject_uevent(&dev->kobj, KOBJ_BIND);
 }
 
@@ -433,9 +430,7 @@ static int driver_sysfs_add(struct device *dev)
 {
        int ret;
 
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_BIND_DRIVER, dev);
+       bus_notify(dev, BUS_NOTIFY_BIND_DRIVER);
 
        ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj,
                                kobject_name(&dev->kobj));
@@ -500,9 +495,8 @@ int device_bind_driver(struct device *dev)
                device_links_force_bind(dev);
                driver_bound(dev);
        }
-       else if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
+       else
+               bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
        return ret;
 }
 EXPORT_SYMBOL_GPL(device_bind_driver);
@@ -693,9 +687,7 @@ dev_groups_failed:
 probe_failed:
        driver_sysfs_remove(dev);
 sysfs_failed:
-       if (dev->bus)
-               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                            BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
+       bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
        if (dev->bus && dev->bus->dma_cleanup)
                dev->bus->dma_cleanup(dev);
 pinctrl_bind_failed:
@@ -1241,10 +1233,7 @@ static void __device_release_driver(struct device *dev, struct device *parent)
 
                driver_sysfs_remove(dev);
 
-               if (dev->bus)
-                       blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                                    BUS_NOTIFY_UNBIND_DRIVER,
-                                                    dev);
+               bus_notify(dev, BUS_NOTIFY_UNBIND_DRIVER);
 
                pm_runtime_put_sync(dev);
 
@@ -1258,11 +1247,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
 
                klist_remove(&dev->p->knode_driver);
                device_pm_check_callbacks(dev);
-               if (dev->bus)
-                       blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
-                                                    BUS_NOTIFY_UNBOUND_DRIVER,
-                                                    dev);
 
+               bus_notify(dev, BUS_NOTIFY_UNBOUND_DRIVER);
                kobject_uevent(&dev->kobj, KOBJ_UNBIND);
        }
 }