Remove in-kernel init_module/cleanup_module stubs
PATCH 1/1 Remove in-kernel init_module/cleanup_module stubs
This patch removes the default stubs for init_module and cleanup_module, and checks for NULL instead. It changes modpost to only create references to those functions if they actually exist.
--
Brian Gerst
kernel/module.c +10 -20
@@ -89,13 +89,6 @@return try_module_get (mod); } -/* Stub function for modules which don't have an initfn */ -int init_module (void ) -{ -return 0 ; -} -EXPORT_SYMBOL (init_module); -/* A thread that wants to hold a reference to a module only while it * is running can call ths to safely exit. * nfsd and lockd use this.
@@ -529,12 +522,6 @@/* This exists whether we can unload or not */ static void free_module (struct module *mod); -/* Stub function for modules which don't have an exitfn */ -void cleanup_module (void ) -{ -} -EXPORT_SYMBOL (cleanup_module); -static void wait_for_zero_refcount (struct module *mod) {/* Since we might sleep for some time, drop the semaphore first */
@@ -589,7 +576,7 @@ }/* If it has an init func, it must have an exit func to unload */ -if ((mod->init != init_module && mod->exit == cleanup_module) +if ((mod->init !=NULL && mod->exit ==NULL ) || mod->unsafe) { forced =try_force (flags);if (!forced) {
@@ -610,9 +597,11 @@wait_for_zero_refcount (mod);/* Final destruction now noone is using it. */ -up (&module_mutex); - mod->exit (); -down (&module_mutex); +if (mod->exit !=NULL ) { +up (&module_mutex); + mod->exit (); +down (&module_mutex); + }free_module (mod); out:
@@ -639,7 +628,7 @@seq_printf (m,"[unsafe]," ); } -if (mod->init != init_module && mod->exit == cleanup_module) { +if (mod->init !=NULL && mod->exit ==NULL ) { printed_something =1 ;seq_printf (m,"[permanent]," ); }
@@ -1836,7 +1825,7 @@ const char __user *uargs) {struct module *mod; -int ret; +int ret =0 ;/* Must have permission */ if (!capable (CAP_SYS_MODULE ))
@@ -1875,7 +1864,8 @@up (¬ify_mutex);/* Start the module */ - ret = mod->init (); +if (mod->init !=NULL ) + ret = mod->init ();if (ret <0 ) {/* Init routine failed: abort. Try to protect us from buggy refcounters. */
scripts/mod/modpost.c +13 -16
@@ -376,6 +376,10 @@add_exported_symbol (symname +strlen (KSYMTAB_PFX ), mod,NULL ); } +if (strcmp (symname,MODULE_SYMBOL_PREFIX "init_module" ) ==0 ) + mod->has_init =1 ; +if (strcmp (symname,MODULE_SYMBOL_PREFIX "cleanup_module" ) ==0 ) + mod->has_cleanup =1 ;break ; } }
@@ -410,9 +414,6 @@if (is_vmlinux (modname)) {unsigned int fake_crc =0 ; have_vmlinux =1 ; -/* May not have this if !CONFIG_MODULE_UNLOAD: fake it. -If it appears, we'll get the real CRC. */ -add_exported_symbol ("cleanup_module" , mod, &fake_crc);add_exported_symbol ("struct_module" , mod, &fake_crc); mod->skip =1 ; }
@@ -431,14 +432,8 @@* never passed as an argument to an exported function, so * the automatic versioning doesn't pick it up, but it's really * important anyhow */ -if (modversions) { +if (modversions) mod->unres =alloc_symbol ("struct_module" , mod->unres); - -/* Always version init_module and cleanup_module, in -* case module doesn't have its own. */ - mod->unres =alloc_symbol ("init_module" , mod->unres); - mod->unres =alloc_symbol ("cleanup_module" , mod->unres); - } }#define SZ 500
@@ -479,7 +474,7 @@/* Header for the generated file */ void -add_header (struct buffer *b) +add_header (struct buffer *b,struct module *mod) {buf_printf (b,"#include <linux/module.h>\n" );buf_printf (b,"#include <linux/vermagic.h>\n" );
@@ -491,10 +486,12 @@buf_printf (b,"struct module __this_module\n" );buf_printf (b,"__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n" );buf_printf (b," .name = __stringify(KBUILD_MODNAME),\n" ); -buf_printf (b," .init = init_module,\n" ); -buf_printf (b,"#ifdef CONFIG_MODULE_UNLOAD\n" ); -buf_printf (b," .exit = cleanup_module,\n" ); -buf_printf (b,"#endif\n" ); +if (mod->has_init) +buf_printf (b," .init = init_module,\n" ); +if (mod->has_cleanup) +buf_printf (b,"#ifdef CONFIG_MODULE_UNLOAD\n" +" .exit = cleanup_module,\n" +"#endif\n" );buf_printf (b,"};\n" ); }
@@ -723,7 +720,7 @@ buf.pos =0 ; -add_header (&buf); +add_header (&buf, mod);add_versions (&buf, mod);add_depends (&buf, mod, modules);add_moddevtable (&buf, mod);
scripts/mod/modpost.h +2 -0
@@ -74,6 +74,8 @@struct symbol *unres;int seen;int skip; +int has_init; +int has_cleanup;struct buffer dev_table_buf; };