Offering: HULK hulk inclusion category: bugfix bugzilla: NA This reverts commit d9b8147764580ff2d0d158ea02445c521ce9c7f2. Fixes: d9b814776458 ("driver core: generalize driver_override in struct device") Signed-off-by: Lin Ruifeng <linruifeng4@huawei.com> --- drivers/base/bus.c | 49 +---------------------------- drivers/base/core.c | 3 -- drivers/base/dd.c | 61 ------------------------------------ include/linux/device.h | 70 ------------------------------------------ 4 files changed, 1 insertion(+), 182 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 44abd34a3243..f45506c56c33 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -457,41 +457,6 @@ int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, } EXPORT_SYMBOL_GPL(bus_for_each_drv); -static ssize_t driver_override_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int ret; - - ret = __device_set_driver_override(dev, buf, count); - if (ret) - return ret; - - return count; -} - -static ssize_t driver_override_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int ret; - - spin_lock(&dev->driver_override.lock); - ret = sysfs_emit(buf, "%s\n", dev->driver_override.name); - spin_unlock(&dev->driver_override.lock); - - return ret; -} -static DEVICE_ATTR_RW(driver_override); - -static struct attribute *driver_override_dev_attrs[] = { - &dev_attr_driver_override.attr, - NULL, -}; - -static const struct attribute_group driver_override_dev_group = { - .attrs = driver_override_dev_attrs, -}; - /** * bus_add_device - add device to bus * @dev: device being added @@ -510,17 +475,10 @@ int bus_add_device(struct device *dev) error = device_add_groups(dev, bus->dev_groups); if (error) goto out_put; - - if (dev->bus->driver_override) { - error = device_add_group(dev, &driver_override_dev_group); - if (error) - goto out_groups; - } - error = sysfs_create_link(&bus->p->devices_kset->kobj, &dev->kobj, dev_name(dev)); if (error) - goto out_override; + goto out_groups; error = sysfs_create_link(&dev->kobj, &dev->bus->p->subsys.kobj, "subsystem"); if (error) @@ -531,9 +489,6 @@ int bus_add_device(struct device *dev) out_subsys: sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev)); -out_override: - if (dev->bus->driver_override) - device_remove_group(dev, &driver_override_dev_group); out_groups: device_remove_groups(dev, bus->dev_groups); out_put: @@ -592,8 +547,6 @@ void bus_remove_device(struct device *dev) sysfs_remove_link(&dev->kobj, "subsystem"); sysfs_remove_link(&dev->bus->p->devices_kset->kobj, dev_name(dev)); - if (dev->bus->driver_override) - device_remove_group(dev, &driver_override_dev_group); device_remove_groups(dev, dev->bus->dev_groups); if (klist_node_attached(&dev->p->knode_bus)) klist_del(&dev->p->knode_bus); diff --git a/drivers/base/core.c b/drivers/base/core.c index 99a76b1ff5e5..a06e0cc4183e 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -1069,8 +1069,6 @@ static void device_release(struct kobject *kobj) */ devres_release_all(dev); - kfree(dev->driver_override.name); - if (dev->release) dev->release(dev); else if (dev->type && dev->type->release) @@ -1684,7 +1682,6 @@ void device_initialize(struct device *dev) kobject_init(&dev->kobj, &device_ktype); INIT_LIST_HEAD(&dev->dma_pools); mutex_init(&dev->mutex); - spin_lock_init(&dev->driver_override.lock); lockdep_set_novalidate_class(&dev->mutex); spin_lock_init(&dev->devres_lock); INIT_LIST_HEAD(&dev->devres_head); diff --git a/drivers/base/dd.c b/drivers/base/dd.c index a323b4356ebe..432a5645bac3 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -27,7 +27,6 @@ #include <linux/async.h> #include <linux/pm_runtime.h> #include <linux/pinctrl/devinfo.h> -#include <linux/slab.h> #include "base.h" #include "power/power.h" @@ -307,66 +306,6 @@ static void __exit deferred_probe_exit(void) } __exitcall(deferred_probe_exit); -int __device_set_driver_override(struct device *dev, const char *s, size_t len) -{ - const char *new, *old; - char *cp; - - if (!s) - return -EINVAL; - - /* - * The stored value will be used in sysfs show callback (sysfs_emit()), - * which has a length limit of PAGE_SIZE and adds a trailing newline. - * Thus we can store one character less to avoid truncation during sysfs - * show. - */ - if (len >= (PAGE_SIZE - 1)) - return -EINVAL; - - /* - * Compute the real length of the string in case userspace sends us a - * bunch of \0 characters like python likes to do. - */ - len = strlen(s); - - if (!len) { - /* Empty string passed - clear override */ - spin_lock(&dev->driver_override.lock); - old = dev->driver_override.name; - dev->driver_override.name = NULL; - spin_unlock(&dev->driver_override.lock); - kfree(old); - - return 0; - } - - cp = strnchr(s, len, '\n'); - if (cp) - len = cp - s; - - new = kstrndup(s, len, GFP_KERNEL); - if (!new) - return -ENOMEM; - - spin_lock(&dev->driver_override.lock); - old = dev->driver_override.name; - if (cp != s) { - dev->driver_override.name = new; - spin_unlock(&dev->driver_override.lock); - } else { - /* "\n" passed - clear override */ - dev->driver_override.name = NULL; - spin_unlock(&dev->driver_override.lock); - - kfree(new); - } - kfree(old); - - return 0; -} -EXPORT_SYMBOL_GPL(__device_set_driver_override); - /** * device_is_bound() - Check if device is bound to a driver * @dev: device to check diff --git a/include/linux/device.h b/include/linux/device.h index f6aef1f7171e..2bcd6f4974b9 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -101,9 +101,6 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *); * @p: The private data of the driver core, only the driver core can * touch this. * @lock_key: Lock class key for use by the lock validator - * @driver_override: Set to true if this bus supports the driver_override - * mechanism, which allows userspace to force a specific - * driver to bind to a device via a sysfs attribute. * @need_parent_lock: When probing or removing a device on this bus, the * device core should lock the device's parent. * @@ -147,7 +144,6 @@ struct bus_type { struct subsys_private *p; struct lock_class_key lock_key; - bool driver_override; bool need_parent_lock; }; @@ -929,8 +925,6 @@ struct dev_links_info { * on. This shrinks the "Board Support Packages" (BSPs) and * minimizes board-specific #ifdefs in drivers. * @driver_data: Private pointer for driver specific info. - * @driver_override: Driver name to force a match. Do not touch directly; use - * device_set_driver_override() instead. * @links: Links to suppliers and consumers of this device. * @power: For device power management. * See Documentation/driver-api/pm/devices.rst for details. @@ -1005,10 +999,6 @@ struct device { core doesn't touch it */ void *driver_data; /* Driver data, set and get with dev_set/get_drvdata */ - struct { - const char *name; - spinlock_t lock; - } driver_override; struct dev_links_info links; struct dev_pm_info power; struct dev_pm_domain *pm_domain; @@ -1127,66 +1117,6 @@ static inline struct device *kobj_to_dev(struct kobject *kobj) return container_of(kobj, struct device, kobj); } -int __device_set_driver_override(struct device *dev, const char *s, size_t len); - -/** -+ * device_set_driver_override() - Helper to set or clear driver override. -+ * @dev: Device to change -+ * @s: NUL-terminated string, new driver name to force a match, pass empty -+ * string to clear it ("" or "\n", where the latter is only for sysfs -+ * interface). -+ * -+ * Helper to set or clear driver override of a device. -+ * -+ * Returns: 0 on success or a negative error code on failure. -+ */ -static inline int device_set_driver_override(struct device *dev, const char *s) -{ - return __device_set_driver_override(dev, s, s ? strlen(s) : 0); -} - -/** -+ * device_has_driver_override() - Check if a driver override has been set. -+ * @dev: device to check -+ * -+ * Returns true if a driver override has been set for this device. -+ */ -static inline bool device_has_driver_override(struct device *dev) -{ - int ret; - - spin_lock(&dev->driver_override.lock); - ret = !!dev->driver_override.name; - spin_unlock(&dev->driver_override.lock); - - return ret; -} - -/** -+ * device_match_driver_override() - Match a driver against the device's driver_override. -+ * @dev: device to check -+ * @drv: driver to match against -+ * -+ * Returns > 0 if a driver override is set and matches the given driver, 0 if a -+ * driver override is set but does not match, or < 0 if a driver override is not -+ * set at all. -+ */ -static inline int device_match_driver_override(struct device *dev, - const struct device_driver *drv) -{ - int ret; - - spin_lock(&dev->driver_override.lock); - if (dev->driver_override.name) { - ret = !strcmp(dev->driver_override.name, drv->name); - spin_unlock(&dev->driver_override.lock); - return ret; - } - spin_unlock(&dev->driver_override.lock); - - return -1; -} - /* Get the wakeup routines, which depend on struct device */ #include <linux/pm_wakeup.h> -- 2.43.0