Peter Zijlstra wrote: > On Wed, 2009-12-23 at 15:19 -0600, Jason Wessel wrote: > >> diff --git a/kernel/module.c b/kernel/module.c >> index e96b8ed..25f6a7b 100644 >> --- a/kernel/module.c >> +++ b/kernel/module.c >> @@ -79,6 +80,10 @@ EXPORT_TRACEPOINT_SYMBOL(module_get); >> DEFINE_MUTEX(module_mutex); >> EXPORT_SYMBOL_GPL(module_mutex); >> static LIST_HEAD(modules); >> +#ifdef CONFIG_KGDB_KDB >> +struct list_head *kdb_modules = &modules; /* kdb needs the list of >> modules */ >> +#endif /* CONFIG_KGDB_KDB */ >> + >> Above we export "modules" so that kdb can emulate lsmod. The remainder was a port from the original kdb, and should not been needed. The preempt_disable and preempt_enable should be able to be safely called while the system in the kgdb exception context, so this chunk of code is going to get axed and re-tested. Thanks, Jason. >> >> /* Block module loading/unloading? */ >> int modules_disabled = 0; >> @@ -2654,8 +2659,14 @@ int module_get_kallsym(unsigned int symnum, >> unsigned long *value, char *type, >> char *name, char *module_name, int *exported) >> { >> struct module *mod; >> +#ifdef CONFIG_KGDB_KDB >> + int get_lock = !KDB_IS_RUNNING(); >> +#else >> +#define get_lock 1 >> +#endif >> >> - preempt_disable(); >> + if (get_lock) >> + preempt_disable(); >> list_for_each_entry_rcu(mod, &modules, list) { >> if (symnum < mod->num_symtab) { >> *value = mod->symtab[symnum].st_value; >> @@ -2664,12 +2675,14 @@ int module_get_kallsym(unsigned int symnum, >> unsigned long *value, char *type, >> KSYM_NAME_LEN); >> strlcpy(module_name, mod->name, >> MODULE_NAME_LEN); >> *exported = is_exported(name, *value, mod); >> - preempt_enable(); >> + if (get_lock) >> + preempt_enable(); >> return 0; >> } >> symnum -= mod->num_symtab; >> } >> - preempt_enable(); >> + if (get_lock) >> + preempt_enable(); >> return -ERANGE; >> } >> -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html