Skip to content

Commit 3330dc1

Browse files
WallaceITakpm00
authored andcommitted
init/main.c: log initcall level when initcall_debug is used
When initcall_debug is specified on the command line, the start and return point for each initcall is printed. However, no information on the initcall level is reported. Add to the initcall_debug infrastructure an additional print that informs when a new initcall level is entered. This is particularly useful when debugging dependency chains and/or working on boot time reduction. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Francesco Valla <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Tim Bird <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 3ca55ca commit 3330dc1

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

init/main.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,12 @@ trace_initcall_finish_cb(void *data, initcall_t fn, int ret)
12141214
fn, ret, (unsigned long long)ktime_us_delta(rettime, *calltime));
12151215
}
12161216

1217+
static __init_or_module void
1218+
trace_initcall_level_cb(void *data, const char *level)
1219+
{
1220+
printk(KERN_DEBUG "entering initcall level: %s\n", level);
1221+
}
1222+
12171223
static ktime_t initcall_calltime;
12181224

12191225
#ifdef TRACEPOINTS_ENABLED
@@ -1225,10 +1231,12 @@ static void __init initcall_debug_enable(void)
12251231
&initcall_calltime);
12261232
ret |= register_trace_initcall_finish(trace_initcall_finish_cb,
12271233
&initcall_calltime);
1234+
ret |= register_trace_initcall_level(trace_initcall_level_cb, NULL);
12281235
WARN(ret, "Failed to register initcall tracepoints\n");
12291236
}
12301237
# define do_trace_initcall_start trace_initcall_start
12311238
# define do_trace_initcall_finish trace_initcall_finish
1239+
# define do_trace_initcall_level trace_initcall_level
12321240
#else
12331241
static inline void do_trace_initcall_start(initcall_t fn)
12341242
{
@@ -1242,6 +1250,12 @@ static inline void do_trace_initcall_finish(initcall_t fn, int ret)
12421250
return;
12431251
trace_initcall_finish_cb(&initcall_calltime, fn, ret);
12441252
}
1253+
static inline void do_trace_initcall_level(const char *level)
1254+
{
1255+
if (!initcall_debug)
1256+
return;
1257+
trace_initcall_level_cb(NULL, level);
1258+
}
12451259
#endif /* !TRACEPOINTS_ENABLED */
12461260

12471261
int __init_or_module do_one_initcall(initcall_t fn)
@@ -1314,7 +1328,7 @@ static void __init do_initcall_level(int level, char *command_line)
13141328
level, level,
13151329
NULL, ignore_unknown_bootoption);
13161330

1317-
trace_initcall_level(initcall_level_names[level]);
1331+
do_trace_initcall_level(initcall_level_names[level]);
13181332
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
13191333
do_one_initcall(initcall_from_entry(fn));
13201334
}
@@ -1358,7 +1372,7 @@ static void __init do_pre_smp_initcalls(void)
13581372
{
13591373
initcall_entry_t *fn;
13601374

1361-
trace_initcall_level("early");
1375+
do_trace_initcall_level("early");
13621376
for (fn = __initcall_start; fn < __initcall0_start; fn++)
13631377
do_one_initcall(initcall_from_entry(fn));
13641378
}

0 commit comments

Comments
 (0)