diff options
-rw-r--r-- | init/main.c | 77 |
1 files changed, 41 insertions, 36 deletions
diff --git a/init/main.c b/init/main.c index c62215146a80..b8bcf6da8a77 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -693,52 +693,57 @@ static int __init initcall_debug_setup(char *str) | |||
693 | } | 693 | } |
694 | __setup("initcall_debug", initcall_debug_setup); | 694 | __setup("initcall_debug", initcall_debug_setup); |
695 | 695 | ||
696 | extern initcall_t __initcall_start[], __initcall_end[]; | 696 | static void __init do_one_initcall(initcall_t fn) |
697 | |||
698 | static void __init do_initcalls(void) | ||
699 | { | 697 | { |
700 | initcall_t *call; | ||
701 | int count = preempt_count(); | 698 | int count = preempt_count(); |
699 | ktime_t t0, t1, delta; | ||
700 | char msgbuf[40]; | ||
701 | int result; | ||
702 | 702 | ||
703 | for (call = __initcall_start; call < __initcall_end; call++) { | 703 | if (initcall_debug) { |
704 | ktime_t t0, t1, delta; | 704 | print_fn_descriptor_symbol("calling %s\n", fn); |
705 | char msgbuf[40]; | 705 | t0 = ktime_get(); |
706 | int result; | 706 | } |
707 | |||
708 | if (initcall_debug) { | ||
709 | print_fn_descriptor_symbol("calling %s\n", *call); | ||
710 | t0 = ktime_get(); | ||
711 | } | ||
712 | 707 | ||
713 | result = (*call)(); | 708 | result = fn(); |
714 | 709 | ||
715 | if (initcall_debug) { | 710 | if (initcall_debug) { |
716 | t1 = ktime_get(); | 711 | t1 = ktime_get(); |
717 | delta = ktime_sub(t1, t0); | 712 | delta = ktime_sub(t1, t0); |
718 | 713 | ||
719 | print_fn_descriptor_symbol("initcall %s", *call); | 714 | print_fn_descriptor_symbol("initcall %s", fn); |
720 | printk(" returned %d after %Ld msecs\n", result, | 715 | printk(" returned %d after %Ld msecs\n", result, |
721 | (unsigned long long) delta.tv64 >> 20); | 716 | (unsigned long long) delta.tv64 >> 20); |
722 | } | 717 | } |
723 | 718 | ||
724 | msgbuf[0] = 0; | 719 | msgbuf[0] = 0; |
725 | 720 | ||
726 | if (result && result != -ENODEV && initcall_debug) | 721 | if (result && result != -ENODEV && initcall_debug) |
727 | sprintf(msgbuf, "error code %d ", result); | 722 | sprintf(msgbuf, "error code %d ", result); |
728 | 723 | ||
729 | if (preempt_count() != count) { | 724 | if (preempt_count() != count) { |
730 | strncat(msgbuf, "preemption imbalance ", sizeof(msgbuf)); | 725 | strncat(msgbuf, "preemption imbalance ", sizeof(msgbuf)); |
731 | preempt_count() = count; | 726 | preempt_count() = count; |
732 | } | ||
733 | if (irqs_disabled()) { | ||
734 | strncat(msgbuf, "disabled interrupts ", sizeof(msgbuf)); | ||
735 | local_irq_enable(); | ||
736 | } | ||
737 | if (msgbuf[0]) { | ||
738 | print_fn_descriptor_symbol(KERN_WARNING "initcall %s", *call); | ||
739 | printk(" returned with %s\n", msgbuf); | ||
740 | } | ||
741 | } | 727 | } |
728 | if (irqs_disabled()) { | ||
729 | strncat(msgbuf, "disabled interrupts ", sizeof(msgbuf)); | ||
730 | local_irq_enable(); | ||
731 | } | ||
732 | if (msgbuf[0]) { | ||
733 | print_fn_descriptor_symbol(KERN_WARNING "initcall %s", fn); | ||
734 | printk(" returned with %s\n", msgbuf); | ||
735 | } | ||
736 | } | ||
737 | |||
738 | |||
739 | extern initcall_t __initcall_start[], __initcall_end[]; | ||
740 | |||
741 | static void __init do_initcalls(void) | ||
742 | { | ||
743 | initcall_t *call; | ||
744 | |||
745 | for (call = __initcall_start; call < __initcall_end; call++) | ||
746 | do_one_initcall(*call); | ||
742 | 747 | ||
743 | /* Make sure there is no pending stuff from the initcall sequence */ | 748 | /* Make sure there is no pending stuff from the initcall sequence */ |
744 | flush_scheduled_work(); | 749 | flush_scheduled_work(); |