提交 21aa9280 编写于 作者: A Arjan van de Ven 提交者: Ingo Molnar

debug: show being-loaded/being-unloaded indicator for modules

It's rather common that an oops/WARN_ON/BUG happens during the load or
unload of a module. Unfortunatly, it's not always easy to see directly
which module is being loaded/unloaded from the oops itself. Worse,
it's not even always possible to ask the bug reporter, since there
are so many components (udev etc) that auto-load modules that there's
a good chance that even the reporter doesn't know which module this is.

This patch extends the existing "show if it's tainting" print code,
which is used as part of printing the modules in the oops/BUG/WARN_ON
to include a "+" for "being loaded" and a "-" for "being unloaded".

As a result this extension, the "taint_flags()" function gets renamed to
"module_flags()" (and takes a module struct as argument, not a taint
flags int).
Signed-off-by: NArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 5a52dd50
...@@ -2357,21 +2357,30 @@ static void m_stop(struct seq_file *m, void *p) ...@@ -2357,21 +2357,30 @@ static void m_stop(struct seq_file *m, void *p)
mutex_unlock(&module_mutex); mutex_unlock(&module_mutex);
} }
static char *taint_flags(unsigned int taints, char *buf) static char *module_flags(struct module *mod, char *buf)
{ {
int bx = 0; int bx = 0;
if (taints) { if (mod->taints ||
mod->state == MODULE_STATE_GOING ||
mod->state == MODULE_STATE_COMING) {
buf[bx++] = '('; buf[bx++] = '(';
if (taints & TAINT_PROPRIETARY_MODULE) if (mod->taints & TAINT_PROPRIETARY_MODULE)
buf[bx++] = 'P'; buf[bx++] = 'P';
if (taints & TAINT_FORCED_MODULE) if (mod->taints & TAINT_FORCED_MODULE)
buf[bx++] = 'F'; buf[bx++] = 'F';
/* /*
* TAINT_FORCED_RMMOD: could be added. * TAINT_FORCED_RMMOD: could be added.
* TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
* apply to modules. * apply to modules.
*/ */
/* Show a - for module-is-being-unloaded */
if (mod->state == MODULE_STATE_GOING)
buf[bx++] = '-';
/* Show a + for module-is-being-loaded */
if (mod->state == MODULE_STATE_COMING)
buf[bx++] = '+';
buf[bx++] = ')'; buf[bx++] = ')';
} }
buf[bx] = '\0'; buf[bx] = '\0';
...@@ -2398,7 +2407,7 @@ static int m_show(struct seq_file *m, void *p) ...@@ -2398,7 +2407,7 @@ static int m_show(struct seq_file *m, void *p)
/* Taints info */ /* Taints info */
if (mod->taints) if (mod->taints)
seq_printf(m, " %s", taint_flags(mod->taints, buf)); seq_printf(m, " %s", module_flags(mod, buf));
seq_printf(m, "\n"); seq_printf(m, "\n");
return 0; return 0;
...@@ -2493,7 +2502,7 @@ void print_modules(void) ...@@ -2493,7 +2502,7 @@ void print_modules(void)
printk("Modules linked in:"); printk("Modules linked in:");
list_for_each_entry(mod, &modules, list) list_for_each_entry(mod, &modules, list)
printk(" %s%s", mod->name, taint_flags(mod->taints, buf)); printk(" %s%s", mod->name, module_flags(mod, buf));
printk("\n"); printk("\n");
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册