aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2008-01-25 15:08:33 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-25 15:08:33 -0500
commit21aa9280b9f4e9e68d3fa8990df6c9d7fd71f994 (patch)
treedbf9011a8ba89037dc7807d50daa645bf1b2e2b7 /kernel/module.c
parent5a52dd50091b6a6e710a1293db741028f8cc5aac (diff)
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: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/kernel/module.c b/kernel/module.c
index dcb8a2cbf75e..5bbf225ca07a 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2357,21 +2357,30 @@ static void m_stop(struct seq_file *m, void *p)
2357 mutex_unlock(&module_mutex); 2357 mutex_unlock(&module_mutex);
2358} 2358}
2359 2359
2360static char *taint_flags(unsigned int taints, char *buf) 2360static char *module_flags(struct module *mod, char *buf)
2361{ 2361{
2362 int bx = 0; 2362 int bx = 0;
2363 2363
2364 if (taints) { 2364 if (mod->taints ||
2365 mod->state == MODULE_STATE_GOING ||
2366 mod->state == MODULE_STATE_COMING) {
2365 buf[bx++] = '('; 2367 buf[bx++] = '(';
2366 if (taints & TAINT_PROPRIETARY_MODULE) 2368 if (mod->taints & TAINT_PROPRIETARY_MODULE)
2367 buf[bx++] = 'P'; 2369 buf[bx++] = 'P';
2368 if (taints & TAINT_FORCED_MODULE) 2370 if (mod->taints & TAINT_FORCED_MODULE)
2369 buf[bx++] = 'F'; 2371 buf[bx++] = 'F';
2370 /* 2372 /*
2371 * TAINT_FORCED_RMMOD: could be added. 2373 * TAINT_FORCED_RMMOD: could be added.
2372 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't 2374 * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't
2373 * apply to modules. 2375 * apply to modules.
2374 */ 2376 */
2377
2378 /* Show a - for module-is-being-unloaded */
2379 if (mod->state == MODULE_STATE_GOING)
2380 buf[bx++] = '-';
2381 /* Show a + for module-is-being-loaded */
2382 if (mod->state == MODULE_STATE_COMING)
2383 buf[bx++] = '+';
2375 buf[bx++] = ')'; 2384 buf[bx++] = ')';
2376 } 2385 }
2377 buf[bx] = '\0'; 2386 buf[bx] = '\0';
@@ -2398,7 +2407,7 @@ static int m_show(struct seq_file *m, void *p)
2398 2407
2399 /* Taints info */ 2408 /* Taints info */
2400 if (mod->taints) 2409 if (mod->taints)
2401 seq_printf(m, " %s", taint_flags(mod->taints, buf)); 2410 seq_printf(m, " %s", module_flags(mod, buf));
2402 2411
2403 seq_printf(m, "\n"); 2412 seq_printf(m, "\n");
2404 return 0; 2413 return 0;
@@ -2493,7 +2502,7 @@ void print_modules(void)
2493 2502
2494 printk("Modules linked in:"); 2503 printk("Modules linked in:");
2495 list_for_each_entry(mod, &modules, list) 2504 list_for_each_entry(mod, &modules, list)
2496 printk(" %s%s", mod->name, taint_flags(mod->taints, buf)); 2505 printk(" %s%s", mod->name, module_flags(mod, buf));
2497 printk("\n"); 2506 printk("\n");
2498} 2507}
2499 2508