Skip to content

Commit

Permalink
kernel: refactor lookup_or_create_module_kobject()
Browse files Browse the repository at this point in the history
In the unlikely event of the allocation failing, it is better to let
the machine boot with a not fully populated sysfs than to kill it with
this BUG_ON(). All callers are already prepared for
lookup_or_create_module_kobject() returning NULL.

This is also preparation for calling this function from non __init
code, where using BUG_ON for allocation failure handling is not
acceptable.

Since we are here, also start using IS_ENABLED instead of #ifdef
construct.

Suggested-by: Thomas Weißschuh <linux@weissschuh.net>
Suggested-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Signed-off-by: Shyam Saini <shyamsaini@linux.microsoft.com>
Link: https://lore.kernel.org/r/20250227184930.34163-3-shyamsaini@linux.microsoft.com
Signed-off-by: Petr Pavlu <petr.pavlu@suse.com>
  • Loading branch information
Shyam Saini authored and Petr Pavlu committed Apr 16, 2025
1 parent bbc9462 commit 1c7777f
Showing 1 changed file with 19 additions and 22 deletions.
41 changes: 19 additions & 22 deletions kernel/params.c
Original file line number Diff line number Diff line change
Expand Up @@ -767,31 +767,28 @@ static struct module_kobject * __init lookup_or_create_module_kobject(const char
int err;

kobj = kset_find_obj(module_kset, name);
if (kobj) {
mk = to_module_kobject(kobj);
} else {
mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
BUG_ON(!mk);

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 = 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",
name, err);
return NULL;
}
if (kobj)
return to_module_kobject(kobj);

/* So that we hold reference in both cases. */
kobject_get(&mk->kobj);
mk = kzalloc(sizeof(struct module_kobject), GFP_KERNEL);
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);
if (IS_ENABLED(CONFIG_MODULES) && !err)
err = sysfs_create_file(&mk->kobj, &module_uevent.attr);
if (err) {
kobject_put(&mk->kobj);
pr_crit("Adding module '%s' to sysfs failed (%d), the system may be unstable.\n",
name, err);
return NULL;
}

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

return mk;
}

Expand Down

0 comments on commit 1c7777f

Please sign in to comment.