Skip to content

Commit

Permalink
Split up 'do_initcalls()' into two simpler functions
Browse files Browse the repository at this point in the history
One function to just loop over the entries, one function to actually do
the call and the associated debugging code.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Linus Torvalds committed May 16, 2008
1 parent a442ac5 commit e0df154
Showing 1 changed file with 41 additions and 36 deletions.
77 changes: 41 additions & 36 deletions init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -693,52 +693,57 @@ static int __init initcall_debug_setup(char *str)
}
__setup("initcall_debug", initcall_debug_setup);

extern initcall_t __initcall_start[], __initcall_end[];

static void __init do_initcalls(void)
static void __init do_one_initcall(initcall_t fn)
{
initcall_t *call;
int count = preempt_count();
ktime_t t0, t1, delta;
char msgbuf[40];
int result;

for (call = __initcall_start; call < __initcall_end; call++) {
ktime_t t0, t1, delta;
char msgbuf[40];
int result;

if (initcall_debug) {
print_fn_descriptor_symbol("calling %s\n", *call);
t0 = ktime_get();
}
if (initcall_debug) {
print_fn_descriptor_symbol("calling %s\n", fn);
t0 = ktime_get();
}

result = (*call)();
result = fn();

if (initcall_debug) {
t1 = ktime_get();
delta = ktime_sub(t1, t0);
if (initcall_debug) {
t1 = ktime_get();
delta = ktime_sub(t1, t0);

print_fn_descriptor_symbol("initcall %s", *call);
printk(" returned %d after %Ld msecs\n", result,
(unsigned long long) delta.tv64 >> 20);
}
print_fn_descriptor_symbol("initcall %s", fn);
printk(" returned %d after %Ld msecs\n", result,
(unsigned long long) delta.tv64 >> 20);
}

msgbuf[0] = 0;
msgbuf[0] = 0;

if (result && result != -ENODEV && initcall_debug)
sprintf(msgbuf, "error code %d ", result);
if (result && result != -ENODEV && initcall_debug)
sprintf(msgbuf, "error code %d ", result);

if (preempt_count() != count) {
strncat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
preempt_count() = count;
}
if (irqs_disabled()) {
strncat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
local_irq_enable();
}
if (msgbuf[0]) {
print_fn_descriptor_symbol(KERN_WARNING "initcall %s", *call);
printk(" returned with %s\n", msgbuf);
}
if (preempt_count() != count) {
strncat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
preempt_count() = count;
}
if (irqs_disabled()) {
strncat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
local_irq_enable();
}
if (msgbuf[0]) {
print_fn_descriptor_symbol(KERN_WARNING "initcall %s", fn);
printk(" returned with %s\n", msgbuf);
}
}


extern initcall_t __initcall_start[], __initcall_end[];

static void __init do_initcalls(void)
{
initcall_t *call;

for (call = __initcall_start; call < __initcall_end; call++)
do_one_initcall(*call);

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
Expand Down

0 comments on commit e0df154

Please sign in to comment.