summaryrefslogtreecommitdiffstats
path: root/kernel/params.c
diff options
context:
space:
mode:
authorRasmus Villemoes <linux@rasmusvillemoes.dk>2022-10-26 00:13:56 +0200
committerLuis Chamberlain <mcgrof@kernel.org>2022-11-11 10:19:52 -0800
commit96a1a2412acba8c057c041833641d9b7dbf52170 (patch)
tree13dc35e8462f2f60cbe91e2991097898d1f7be12 /kernel/params.c
parent89a6b5917650edd1542194fd5b5ada64fb94a790 (diff)
downloadlinux-96a1a2412acba8c057c041833641d9b7dbf52170.tar.gz
linux-96a1a2412acba8c057c041833641d9b7dbf52170.tar.bz2
linux-96a1a2412acba8c057c041833641d9b7dbf52170.zip
kernel/params.c: defer most of param_sysfs_init() to late_initcall time
param_sysfs_init(), and in particular param_sysfs_builtin() is rather time-consuming; for my board, it currently takes about 30ms. That amounts to about 3% of the time budget I have from U-Boot hands over control to linux and linux must assume responsibility for keeping the external watchdog happy. We must still continue to initialize module_kset at subsys_initcall time, since otherwise any request_module() would fail in mod_sysfs_init(). However, the bulk of the work in param_sysfs_builtin(), namely populating /sys/module/*/version and/or /sys/module/*/parameters/ for builtin modules, can be deferred to late_initcall time - there's no userspace yet anyway to observe contents of /sys or the lack thereof. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Diffstat (limited to 'kernel/params.c')
-rw-r--r--kernel/params.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/kernel/params.c b/kernel/params.c
index 8d4e9a3f0df2..a06f80c56f19 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -953,7 +953,11 @@ struct kobj_type module_ktype = {
};
/*
- * param_sysfs_init - wrapper for built-in params support
+ * param_sysfs_init - create "module" kset
+ *
+ * This must be done before the initramfs is unpacked and
+ * request_module() thus becomes possible, because otherwise the
+ * module load would fail in mod_sysfs_init.
*/
static int __init param_sysfs_init(void)
{
@@ -964,11 +968,24 @@ static int __init param_sysfs_init(void)
return -ENOMEM;
}
+ return 0;
+}
+subsys_initcall(param_sysfs_init);
+
+/*
+ * param_sysfs_builtin_init - add sysfs version and parameter
+ * attributes for built-in modules
+ */
+static int __init param_sysfs_builtin_init(void)
+{
+ if (!module_kset)
+ return -ENOMEM;
+
version_sysfs_builtin();
param_sysfs_builtin();
return 0;
}
-subsys_initcall(param_sysfs_init);
+late_initcall(param_sysfs_builtin_init);
#endif /* CONFIG_SYSFS */