Message ID | 20250509-jag-mv_ctltables_iter2-v1-1-d0ad83f5f4c3@kernel.org |
---|---|
State | New |
Headers | show |
Series | sysctl: Move sysctls to their respective subsystems (second batch) | expand |
On 5/9/25 14:54, Joel Granados wrote: > Move module sysctl (modprobe_path and modules_disabled) out of sysctl.c > and into the modules subsystem. Make the modprobe_path variable static > as it no longer needs to be exported. Remove module.h from the includes > in sysctl as it no longer uses any module exported variables. > > This is part of a greater effort to move ctl tables into their > respective subsystems which will reduce the merge conflicts in > kernel/sysctl.c. > > Signed-off-by: Joel Granados <joel.granados@kernel.org> > [...] > --- a/kernel/module/kmod.c > +++ b/kernel/module/kmod.c > @@ -60,7 +60,7 @@ static DEFINE_SEMAPHORE(kmod_concurrent_max, MAX_KMOD_CONCURRENT); > /* > modprobe_path is set via /proc/sys. > */ > -char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; > +static char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; > > static void free_modprobe_argv(struct subprocess_info *info) > { > @@ -177,3 +177,33 @@ int __request_module(bool wait, const char *fmt, ...) > return ret; > } > EXPORT_SYMBOL(__request_module); > + > +#ifdef CONFIG_MODULES > +static const struct ctl_table kmod_sysctl_table[] = { > + { > + .procname = "modprobe", > + .data = &modprobe_path, > + .maxlen = KMOD_PATH_LEN, > + .mode = 0644, > + .proc_handler = proc_dostring, > + }, > + { > + .procname = "modules_disabled", > + .data = &modules_disabled, > + .maxlen = sizeof(int), > + .mode = 0644, > + /* only handle a transition from default "0" to "1" */ > + .proc_handler = proc_dointvec_minmax, > + .extra1 = SYSCTL_ONE, > + .extra2 = SYSCTL_ONE, > + }, This is minor.. but the file kernel/module/kmod.c contains the logic to request direct modprobe invocation by the kernel. Registering the modprobe_path sysctl here is appropriate. However, the modules_disabled setting affects the entire module loader so I don't think it's best to register it here. I suggest keeping a single table for the module sysctl values but moving it to kernel/module/main.c. This means the variable modprobe_path must retain external linkage, on the other hand, modules_disabled can be made static.
On 5/15/25 12:04, Joel Granados wrote: > On Thu, May 15, 2025 at 10:04:53AM +0200, Petr Pavlu wrote: >> On 5/9/25 14:54, Joel Granados wrote: >>> Move module sysctl (modprobe_path and modules_disabled) out of sysctl.c >>> and into the modules subsystem. Make the modprobe_path variable static >>> as it no longer needs to be exported. Remove module.h from the includes >>> in sysctl as it no longer uses any module exported variables. >>> >>> This is part of a greater effort to move ctl tables into their >>> respective subsystems which will reduce the merge conflicts in >>> kernel/sysctl.c. >>> >>> Signed-off-by: Joel Granados <joel.granados@kernel.org> >>> [...] >>> --- a/kernel/module/kmod.c >>> +++ b/kernel/module/kmod.c >>> @@ -60,7 +60,7 @@ static DEFINE_SEMAPHORE(kmod_concurrent_max, MAX_KMOD_CONCURRENT); >>> /* >>> modprobe_path is set via /proc/sys. >>> */ >>> -char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; >>> +static char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; >>> >>> static void free_modprobe_argv(struct subprocess_info *info) >>> { >>> @@ -177,3 +177,33 @@ int __request_module(bool wait, const char *fmt, ...) >>> return ret; >>> } >>> EXPORT_SYMBOL(__request_module); >>> + >>> +#ifdef CONFIG_MODULES >>> +static const struct ctl_table kmod_sysctl_table[] = { >>> + { >>> + .procname = "modprobe", >>> + .data = &modprobe_path, >>> + .maxlen = KMOD_PATH_LEN, >>> + .mode = 0644, >>> + .proc_handler = proc_dostring, >>> + }, >>> + { >>> + .procname = "modules_disabled", >>> + .data = &modules_disabled, >>> + .maxlen = sizeof(int), >>> + .mode = 0644, >>> + /* only handle a transition from default "0" to "1" */ >>> + .proc_handler = proc_dointvec_minmax, >>> + .extra1 = SYSCTL_ONE, >>> + .extra2 = SYSCTL_ONE, >>> + }, >> >> This is minor.. but the file kernel/module/kmod.c contains the logic to >> request direct modprobe invocation by the kernel. Registering the >> modprobe_path sysctl here is appropriate. However, the modules_disabled >> setting affects the entire module loader so I don't think it's best to >> register it here. >> >> I suggest keeping a single table for the module sysctl values but moving >> it to kernel/module/main.c. This means the variable modprobe_path must >> retain external linkage, on the other hand, modules_disabled can be made >> static. > > Like this?: > [...] Let's also move the KMOD_PATH_LEN definition and the modprobe_path declaration from include/linux/kmod.h to kernel/module/internal.h, as they are now fully internal to the module loader, and use "module" instead of "kmod" in the sysctl registration to avoid confusion with the modprobe logic. The adjusted patch is below. Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>
diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 68f69362d427caaaefc2565127a7a4158433e5f5..cc32e56dae44896f74a9faf0e97f432f133869b9 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -17,7 +17,6 @@ #define KMOD_PATH_LEN 256 #ifdef CONFIG_MODULES -extern char modprobe_path[]; /* for sysctl */ /* modprobe exit status on success, -ve on error. Return value * usually useless though. */ extern __printf(2, 3) diff --git a/kernel/module/kmod.c b/kernel/module/kmod.c index 25f25381251281a390b273cd8a734c92b960113a..5701629adc27b4bb5080db75f0e69f9f55e9d2ad 100644 --- a/kernel/module/kmod.c +++ b/kernel/module/kmod.c @@ -60,7 +60,7 @@ static DEFINE_SEMAPHORE(kmod_concurrent_max, MAX_KMOD_CONCURRENT); /* modprobe_path is set via /proc/sys. */ -char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; +static char modprobe_path[KMOD_PATH_LEN] = CONFIG_MODPROBE_PATH; static void free_modprobe_argv(struct subprocess_info *info) { @@ -177,3 +177,33 @@ int __request_module(bool wait, const char *fmt, ...) return ret; } EXPORT_SYMBOL(__request_module); + +#ifdef CONFIG_MODULES +static const struct ctl_table kmod_sysctl_table[] = { + { + .procname = "modprobe", + .data = &modprobe_path, + .maxlen = KMOD_PATH_LEN, + .mode = 0644, + .proc_handler = proc_dostring, + }, + { + .procname = "modules_disabled", + .data = &modules_disabled, + .maxlen = sizeof(int), + .mode = 0644, + /* only handle a transition from default "0" to "1" */ + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ONE, + .extra2 = SYSCTL_ONE, + }, +}; + +static int __init init_kmod_sysctl(void) +{ + register_sysctl_init("kernel", kmod_sysctl_table); + return 0; +} + +subsys_initcall(init_kmod_sysctl); +#endif diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 9b4f0cff76eaddc823065ea587760156576a8686..473133d9651eac4ef44b8b63a44b77189818ac08 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -19,7 +19,6 @@ * Removed it and replaced it with older style, 03/23/00, Bill Wendling */ -#include <linux/module.h> #include <linux/sysctl.h> #include <linux/bitmap.h> #include <linux/printk.h> @@ -1616,25 +1615,6 @@ static const struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif -#ifdef CONFIG_MODULES - { - .procname = "modprobe", - .data = &modprobe_path, - .maxlen = KMOD_PATH_LEN, - .mode = 0644, - .proc_handler = proc_dostring, - }, - { - .procname = "modules_disabled", - .data = &modules_disabled, - .maxlen = sizeof(int), - .mode = 0644, - /* only handle a transition from default "0" to "1" */ - .proc_handler = proc_dointvec_minmax, - .extra1 = SYSCTL_ONE, - .extra2 = SYSCTL_ONE, - }, -#endif #ifdef CONFIG_UEVENT_HELPER { .procname = "hotplug",
Move module sysctl (modprobe_path and modules_disabled) out of sysctl.c and into the modules subsystem. Make the modprobe_path variable static as it no longer needs to be exported. Remove module.h from the includes in sysctl as it no longer uses any module exported variables. This is part of a greater effort to move ctl tables into their respective subsystems which will reduce the merge conflicts in kernel/sysctl.c. Signed-off-by: Joel Granados <joel.granados@kernel.org> --- include/linux/kmod.h | 1 - kernel/module/kmod.c | 32 +++++++++++++++++++++++++++++++- kernel/sysctl.c | 20 -------------------- 3 files changed, 31 insertions(+), 22 deletions(-)