Commit 9cc61e5f authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

driver core: bus: move dev_root out of struct bus_type

Now that all accesses of dev_root is through the bus_get_dev_root()
call, move the pointer out of struct bus_type and into the private
dynamic structure, subsys_private.

With this change, there is no modifiable portions of struct bus_type so
it can be marked as a constant structure and moved to read-only memory.

Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Link: https://lore.kernel.org/r/20230313182918.1312597-22-gregkh@linuxfoundation.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bf6479db
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
* on this bus. * on this bus.
* @bus - pointer back to the struct bus_type that this structure is associated * @bus - pointer back to the struct bus_type that this structure is associated
* with. * with.
* @dev_root: Default device to use as the parent.
* *
* @glue_dirs - "glue" directory to put in-between the parent device to * @glue_dirs - "glue" directory to put in-between the parent device to
* avoid namespace conflicts * avoid namespace conflicts
...@@ -49,6 +50,7 @@ struct subsys_private { ...@@ -49,6 +50,7 @@ struct subsys_private {
struct blocking_notifier_head bus_notifier; struct blocking_notifier_head bus_notifier;
unsigned int drivers_autoprobe:1; unsigned int drivers_autoprobe:1;
struct bus_type *bus; struct bus_type *bus;
struct device *dev_root;
struct kset glue_dirs; struct kset glue_dirs;
struct class *class; struct class *class;
......
...@@ -935,8 +935,8 @@ void bus_unregister(const struct bus_type *bus) ...@@ -935,8 +935,8 @@ void bus_unregister(const struct bus_type *bus)
return; return;
pr_debug("bus: '%s': unregistering\n", bus->name); pr_debug("bus: '%s': unregistering\n", bus->name);
if (bus->dev_root) if (sp->dev_root)
device_unregister(bus->dev_root); device_unregister(sp->dev_root);
bus_kobj = &sp->subsys.kobj; bus_kobj = &sp->subsys.kobj;
sysfs_remove_groups(bus_kobj, bus->bus_groups); sysfs_remove_groups(bus_kobj, bus->bus_groups);
...@@ -1198,6 +1198,7 @@ static int subsys_register(struct bus_type *subsys, ...@@ -1198,6 +1198,7 @@ static int subsys_register(struct bus_type *subsys,
const struct attribute_group **groups, const struct attribute_group **groups,
struct kobject *parent_of_root) struct kobject *parent_of_root)
{ {
struct subsys_private *sp;
struct device *dev; struct device *dev;
int err; int err;
...@@ -1205,6 +1206,12 @@ static int subsys_register(struct bus_type *subsys, ...@@ -1205,6 +1206,12 @@ static int subsys_register(struct bus_type *subsys,
if (err < 0) if (err < 0)
return err; return err;
sp = bus_to_subsys(subsys);
if (!sp) {
err = -EINVAL;
goto err_sp;
}
dev = kzalloc(sizeof(struct device), GFP_KERNEL); dev = kzalloc(sizeof(struct device), GFP_KERNEL);
if (!dev) { if (!dev) {
err = -ENOMEM; err = -ENOMEM;
...@@ -1223,7 +1230,8 @@ static int subsys_register(struct bus_type *subsys, ...@@ -1223,7 +1230,8 @@ static int subsys_register(struct bus_type *subsys,
if (err < 0) if (err < 0)
goto err_dev_reg; goto err_dev_reg;
subsys->dev_root = dev; sp->dev_root = dev;
subsys_put(sp);
return 0; return 0;
err_dev_reg: err_dev_reg:
...@@ -1232,6 +1240,8 @@ static int subsys_register(struct bus_type *subsys, ...@@ -1232,6 +1240,8 @@ static int subsys_register(struct bus_type *subsys,
err_name: err_name:
kfree(dev); kfree(dev);
err_dev: err_dev:
subsys_put(sp);
err_sp:
bus_unregister(subsys); bus_unregister(subsys);
return err; return err;
} }
...@@ -1349,9 +1359,15 @@ bool bus_is_registered(const struct bus_type *bus) ...@@ -1349,9 +1359,15 @@ bool bus_is_registered(const struct bus_type *bus)
*/ */
struct device *bus_get_dev_root(const struct bus_type *bus) struct device *bus_get_dev_root(const struct bus_type *bus)
{ {
if (bus) struct subsys_private *sp = bus_to_subsys(bus);
return get_device(bus->dev_root); struct device *dev_root;
return NULL;
if (!sp)
return NULL;
dev_root = get_device(sp->dev_root);
subsys_put(sp);
return dev_root;
} }
EXPORT_SYMBOL_GPL(bus_get_dev_root); EXPORT_SYMBOL_GPL(bus_get_dev_root);
......
...@@ -26,7 +26,6 @@ struct fwnode_handle; ...@@ -26,7 +26,6 @@ struct fwnode_handle;
* *
* @name: The name of the bus. * @name: The name of the bus.
* @dev_name: Used for subsystems to enumerate devices like ("foo%u", dev->id). * @dev_name: Used for subsystems to enumerate devices like ("foo%u", dev->id).
* @dev_root: Default device to use as the parent.
* @bus_groups: Default attributes of the bus. * @bus_groups: Default attributes of the bus.
* @dev_groups: Default attributes of the devices on the bus. * @dev_groups: Default attributes of the devices on the bus.
* @drv_groups: Default attributes of the device drivers on the bus. * @drv_groups: Default attributes of the device drivers on the bus.
...@@ -82,7 +81,6 @@ struct fwnode_handle; ...@@ -82,7 +81,6 @@ struct fwnode_handle;
struct bus_type { struct bus_type {
const char *name; const char *name;
const char *dev_name; const char *dev_name;
struct device *dev_root;
const struct attribute_group **bus_groups; const struct attribute_group **bus_groups;
const struct attribute_group **dev_groups; const struct attribute_group **dev_groups;
const struct attribute_group **drv_groups; const struct attribute_group **drv_groups;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment