Commit 39295279 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull modules fixes from Petr Pavlu:
 "A single series to properly handle the module_kobject creation.

  This fixes a problem with missing /sys/module/<module>/drivers for
  built-in modules"

* tag 'modules-6.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/modules/linux:
  drivers: base: handle module_kobject creation
  kernel: globalize lookup_or_create_module_kobject()
  kernel: refactor lookup_or_create_module_kobject()
  kernel: param: rename locate_module_kobject
parents b6ea1680 f95bbfe1
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -42,16 +42,13 @@ int module_add_driver(struct module *mod, const struct device_driver *drv)
	if (mod)
		mk = &mod->mkobj;
	else if (drv->mod_name) {
		struct kobject *mkobj;

		/* Lookup built-in module entry in /sys/modules */
		mkobj = kset_find_obj(module_kset, drv->mod_name);
		if (mkobj) {
			mk = container_of(mkobj, struct module_kobject, kobj);
		/* Lookup or create built-in module entry in /sys/modules */
		mk = lookup_or_create_module_kobject(drv->mod_name);
		if (mk) {
			/* remember our module structure */
			drv->p->mkobj = mk;
			/* kset_find_obj took a reference */
			kobject_put(mkobj);
			/* lookup_or_create_module_kobject took a reference */
			kobject_put(&mk->kobj);
		}
	}

+2 −0
Original line number Diff line number Diff line
@@ -162,6 +162,8 @@ extern void cleanup_module(void);
#define __INITRODATA_OR_MODULE __INITRODATA
#endif /*CONFIG_MODULES*/

struct module_kobject *lookup_or_create_module_kobject(const char *name);

/* Generic info of form tag = "info" */
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)

+22 −25
Original line number Diff line number Diff line
@@ -760,27 +760,25 @@ void destroy_params(const struct kernel_param *params, unsigned num)
			params[i].ops->free(params[i].arg);
}

static struct module_kobject * __init locate_module_kobject(const char *name)
struct module_kobject __modinit * lookup_or_create_module_kobject(const char *name)
{
	struct module_kobject *mk;
	struct kobject *kobj;
	int err;

	kobj = kset_find_obj(module_kset, name);
	if (kobj) {
		mk = to_module_kobject(kobj);
	} else {
	if (kobj)
		return to_module_kobject(kobj);

	mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
		BUG_ON(!mk);
	if (!mk)
		return NULL;

	mk->mod = THIS_MODULE;
	mk->kobj.kset = module_kset;
		err = kobject_init_and_add(&mk->kobj, &module_ktype, NULL,
					   "%s", name);
#ifdef CONFIG_MODULES
		if (!err)
	err = kobject_init_and_add(&mk->kobj, &module_ktype, NULL, "%s", name);
	if (IS_ENABLED(CONFIG_MODULES) && !err)
		err = sysfs_create_file(&mk->kobj, &module_uevent.attr);
#endif
	if (err) {
		kobject_put(&mk->kobj);
		pr_crit("Adding module '%s' to sysfs failed (%d), the system may be unstable.\n",
@@ -790,7 +788,6 @@ static struct module_kobject * __init locate_module_kobject(const char *name)

	/* So that we hold reference in both cases. */
	kobject_get(&mk->kobj);
	}

	return mk;
}
@@ -802,7 +799,7 @@ static void __init kernel_add_sysfs_param(const char *name,
	struct module_kobject *mk;
	int err;

	mk = locate_module_kobject(name);
	mk = lookup_or_create_module_kobject(name);
	if (!mk)
		return;

@@ -873,7 +870,7 @@ static void __init version_sysfs_builtin(void)
	int err;

	for (vattr = __start___modver; vattr < __stop___modver; vattr++) {
		mk = locate_module_kobject(vattr->module_name);
		mk = lookup_or_create_module_kobject(vattr->module_name);
		if (mk) {
			err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr);
			WARN_ON_ONCE(err);