module: initialize module dynamic debug later
Subsystems (2)
PATCH 1/1 module: initialize module dynamic debug later
We should initialize the module dynamic debug datastructures only after determining that the module is not loaded yet. This fixes a bug that introduced in 2.6.35-rc2, where when a trying to load a module twice, we also load it's dynamic printing data twice which causes all sorts of nasty issues. Also handle the dynamic debug cleanup later on failure.
--- include/linux/dynamic_debug.h | 4 ++-- kernel/module.c | 23 +++++++++++++++-------- lib/dynamic_debug.c | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-)
include/linux/dynamic_debug.h +2 -2
@@ -40,7 +40,7 @@ int ddebug_add_module(struct _ddebug *ta const char *modname);#if defined(CONFIG_DYNAMIC_DEBUG ) -extern int ddebug_remove_module (char *mod_name); +extern int ddebug_remove_module (const char *mod_name);#define __dynamic_dbg_enabled (dd) ({ \ int __ret = 0; \
@@ -73,7 +73,7 @@ extern int ddebug_remove_module(char *mo#else -static inline int ddebug_remove_module (char *mod) +static inline int ddebug_remove_module (const char *mod) {return 0 ; }
kernel/module.c +15 -8
@@ -2062,6 +2062,12 @@ static void dynamic_debug_setup(struct _#endif } +static void dynamic_debug_remove (struct _ddebug *debug) +{ +if (debug) +ddebug_remove_module (debug->modname); +} +static void *module_alloc_update_bounds (unsigned long size) {void *ret =module_alloc (size);
@@ -2124,6 +2130,8 @@ static noinline struct module *load_moduvoid *ptr =NULL ;/* Stops spurious gcc warning */ unsigned long symoffs, stroffs, *strmap;void __percpu *percpu; +struct _ddebug *debug =NULL ; +unsigned int num_debug =0 ;mm_segment_t old_fs;
@@ -2476,15 +2484,9 @@ static noinline struct module *load_modukfree (strmap); strmap =NULL ; -if (!mod->taints) { -struct _ddebug *debug; -unsigned int num_debug; - +if (!mod->taints) debug =section_objs (hdr, sechdrs, secstrings,"__verbose" ,sizeof (*debug), &num_debug); -if (debug) -dynamic_debug_setup (debug, num_debug); - } err =module_finalize (hdr, sechdrs, mod);if (err <0 )
@@ -2526,10 +2528,13 @@ static noinline struct module *load_modu goto unlock; } +if (debug) +dynamic_debug_setup (debug, num_debug); +/* Find duplicate symbols */ err =verify_export_symbols (mod);if (err <0 ) - goto unlock; + goto ddebug;list_add_rcu (&mod->list, &modules);mutex_unlock (&module_mutex);
@@ -2557,6 +2562,8 @@ static noinline struct module *load_modumutex_lock (&module_mutex);/* Unlink carefully: kallsyms could be walking list. */ list_del_rcu (&mod->list); + ddebug: +dynamic_debug_remove (debug); unlock:mutex_unlock (&module_mutex);synchronize_sched ();
lib/dynamic_debug.c +1 -1
@@ -692,7 +692,7 @@ static void ddebug_table_free(struct dde* Called in response to a module being unloaded. Removes * any ddebug_table's which point at the module. */ -int ddebug_remove_module (char *mod_name) +int ddebug_remove_module (const char *mod_name) {struct ddebug_table *dt, *nextdt;int ret = -ENOENT ;
Quoted 9 lines · Rusty Russell
We should initialize the module dynamic debug datastructures only after determining that the module is not loaded yet. This fixes a bug that introduced in 2.6.35-rc2, where when a trying to load a module twice, we also load it's dynamic printing data twice which causes all sorts of nasty issues. Also handle the dynamic debug cleanup later on failure.
Signed-off-by Yehuda Sadeh <[email protected]>Signed-off-by Rusty Russell <[email protected]> (removed a #ifdef)
Is this missing a
From: Yehuda Sadeh <[email protected]>
author attribution by any chance? The sign-offs imply so.
Linus
PATCH 1/1 module: initialize module dynamic debug later
From: Yehuda Sadeh <[email protected]>
We should initialize the module dynamic debug datastructures only after determining that the module is not loaded yet. This fixes a bug that introduced in 2.6.35-rc2, where when a trying to load a module twice, we also load it's dynamic printing data twice which causes all sorts of nasty issues. Also handle the dynamic debug cleanup later on failure.
--- include/linux/dynamic_debug.h | 4 ++-- kernel/module.c | 23 +++++++++++++++-------- lib/dynamic_debug.c | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-)
include/linux/dynamic_debug.h +2 -2
@@ -40,7 +40,7 @@ int ddebug_add_module(struct _ddebug *ta const char *modname);#if defined(CONFIG_DYNAMIC_DEBUG ) -extern int ddebug_remove_module (char *mod_name); +extern int ddebug_remove_module (const char *mod_name);#define __dynamic_dbg_enabled (dd) ({ \ int __ret = 0; \
@@ -73,7 +73,7 @@ extern int ddebug_remove_module(char *mo#else -static inline int ddebug_remove_module (char *mod) +static inline int ddebug_remove_module (const char *mod) {return 0 ; }
kernel/module.c +15 -8
@@ -2062,6 +2062,12 @@ static void dynamic_debug_setup(struct _#endif } +static void dynamic_debug_remove (struct _ddebug *debug) +{ +if (debug) +ddebug_remove_module (debug->modname); +} +static void *module_alloc_update_bounds (unsigned long size) {void *ret =module_alloc (size);
@@ -2124,6 +2130,8 @@ static noinline struct module *load_moduvoid *ptr =NULL ;/* Stops spurious gcc warning */ unsigned long symoffs, stroffs, *strmap;void __percpu *percpu; +struct _ddebug *debug =NULL ; +unsigned int num_debug =0 ;mm_segment_t old_fs;
@@ -2476,15 +2484,9 @@ static noinline struct module *load_modukfree (strmap); strmap =NULL ; -if (!mod->taints) { -struct _ddebug *debug; -unsigned int num_debug; - +if (!mod->taints) debug =section_objs (hdr, sechdrs, secstrings,"__verbose" ,sizeof (*debug), &num_debug); -if (debug) -dynamic_debug_setup (debug, num_debug); - } err =module_finalize (hdr, sechdrs, mod);if (err <0 )
@@ -2526,10 +2528,13 @@ static noinline struct module *load_modu goto unlock; } +if (debug) +dynamic_debug_setup (debug, num_debug); +/* Find duplicate symbols */ err =verify_export_symbols (mod);if (err <0 ) - goto unlock; + goto ddebug;list_add_rcu (&mod->list, &modules);mutex_unlock (&module_mutex);
@@ -2557,6 +2562,8 @@ static noinline struct module *load_modumutex_lock (&module_mutex);/* Unlink carefully: kallsyms could be walking list. */ list_del_rcu (&mod->list); + ddebug: +dynamic_debug_remove (debug); unlock:mutex_unlock (&module_mutex);synchronize_sched ();
lib/dynamic_debug.c +1 -1
@@ -692,7 +692,7 @@ static void ddebug_table_free(struct dde* Called in response to a module being unloaded. Removes * any ddebug_table's which point at the module. */ -int ddebug_remove_module (char *mod_name) +int ddebug_remove_module (const char *mod_name) {struct ddebug_table *dt, *nextdt;int ret = -ENOENT ;
Quoted 5 lines · Linus Torvalds
Is this missing a
From: Yehuda Sadeh <[email protected]>
author attribution by any chance? The sign-offs imply so.
Yep, thanks, re-sent.
Cheers,
Rusty.