Skip to content

Commit

Permalink
init: don't lose initcall return values
Browse files Browse the repository at this point in the history
There is an ability to lose an initcall return value if it happened with irq
disabled or imbalanced preemption (and if we debug initcall).

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Cyrill Gorcunov authored and Linus Torvalds committed May 13, 2008
1 parent 67d7671 commit e662e1c
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,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;

Expand All @@ -724,22 +723,23 @@ static void __init do_initcalls(void)
(unsigned long long) delta.tv64 >> 20);
}

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]) {
print_fn_descriptor_symbol(KERN_WARNING "initcall %s()",
(unsigned long) *call);
printk(" returned with %s\n", msg);
printk(" returned with %s\n", msgbuf);
}
}

Expand Down

0 comments on commit e662e1c

Please sign in to comment.