Messages in this thread Patch in this message | | | Date | Thu, 24 Apr 2008 22:21:01 +0400 | From | Cyrill Gorcunov <> | Subject | [PATCH] init - dont loose initcall code returned |
| |
There is an ability to loose initcall returned code if it happened with irq disabled or imbalanced preemption (and if we debug initcall)
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com> ---
Please review carefully - *ANY* comments are welcome!
Index: linux-2.6.git/init/main.c =================================================================== --- linux-2.6.git.orig/init/main.c 2008-04-24 12:30:17.000000000 +0400 +++ linux-2.6.git/init/main.c 2008-04-24 22:13:22.000000000 +0400 @@ -698,7 +698,6 @@ static void __init do_initcalls(void) for (call = __initcall_start; call < __initcall_end; call++) { ktime_t t0, t1, delta; - char *msg = NULL; char msgbuf[40]; int result; @@ -727,23 +726,22 @@ static void __init do_initcalls(void) (unsigned long) *call); } - if (result && result != -ENODEV && initcall_debug) { - sprintf(msgbuf, "error code %d", result); - msg = msgbuf; - } + msgbuf[0] = 0; + if (result && result != -ENODEV && initcall_debug) + sprintf(msgbuf, "error code %d ", result); if (preempt_count() != count) { - msg = "preemption imbalance"; + strncat(msgbuf, "preemption imbalance", sizeof(msgbuf)); preempt_count() = count; } if (irqs_disabled()) { - msg = "disabled interrupts"; + strncat(msgbuf, "disabled interrupts", sizeof(msgbuf)); local_irq_enable(); } - if (msg) { + if (msgbuf[0]) { printk(KERN_WARNING "initcall at 0x%p", *call); print_fn_descriptor_symbol(": %s()", (unsigned long) *call); - printk(": returned with %s\n", msg); + printk(": returned with %s\n", msgbuf); } }
| |