Loading include/linux/ftrace.h +22 −2 Original line number Diff line number Diff line Loading @@ -234,6 +234,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } #endif /* * Structure which defines the trace of an initcall. * You don't have to fill the func field since it is * only used internally by the tracer. */ struct boot_trace { pid_t caller; char func[KSYM_NAME_LEN]; Loading @@ -244,13 +249,28 @@ struct boot_trace { }; #ifdef CONFIG_BOOT_TRACER /* Append the trace on the ring-buffer */ extern void trace_boot(struct boot_trace *it, initcall_t fn); /* Tells the tracer that smp_pre_initcall is finished. * So we can start the tracing */ extern void start_boot_trace(void); extern void stop_boot_trace(void); /* Resume the tracing of other necessary events * such as sched switches */ extern void enable_boot_trace(void); /* Suspend this tracing. Actually, only sched_switches tracing have * to be suspended. Initcalls doesn't need it.) */ extern void disable_boot_trace(void); #else static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } static inline void start_boot_trace(void) { } static inline void stop_boot_trace(void) { } static inline void enable_boot_trace(void) { } static inline void disable_boot_trace(void) { } #endif Loading init/main.c +3 −1 Original line number Diff line number Diff line Loading @@ -711,6 +711,7 @@ int do_one_initcall(initcall_t fn) it.caller = task_pid_nr(current); printk("calling %pF @ %i\n", fn, it.caller); it.calltime = ktime_get(); enable_boot_trace(); } it.result = fn(); Loading @@ -722,6 +723,7 @@ int do_one_initcall(initcall_t fn) printk("initcall %pF returned %d after %Ld usecs\n", fn, it.result, it.duration); trace_boot(&it, fn); disable_boot_trace(); } msgbuf[0] = 0; Loading Loading @@ -882,7 +884,7 @@ static int __init kernel_init(void * unused) * we're essentially up and running. Get rid of the * initmem segments and start the user-mode stuff.. */ stop_boot_trace(); init_post(); return 0; } kernel/trace/trace.c +2 −0 Original line number Diff line number Diff line Loading @@ -3285,6 +3285,8 @@ __init static int tracer_alloc_buffers(void) register_tracer(&nop_trace); #ifdef CONFIG_BOOT_TRACER /* We don't want to launch sched_switch tracer yet */ global_trace.ctrl = 0; register_tracer(&boot_tracer); current_trace = &boot_tracer; current_trace->init(&global_trace); Loading kernel/trace/trace.h +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct ftrace_entry { unsigned long parent_ip; }; extern struct tracer boot_tracer; extern struct tracer sched_switch_trace; /* Used by the boot tracer */ /* * Context switch trace entry - which task (and prio) we switched from/to: Loading kernel/trace/trace_boot.c +23 −13 Original line number Diff line number Diff line Loading @@ -13,23 +13,33 @@ #include "trace.h" static struct trace_array *boot_trace; static int trace_boot_enabled; static bool pre_initcalls_finished; /* Should be started after do_pre_smp_initcalls() in init/main.c */ /* Tells the boot tracer that the pre_smp_initcalls are finished. * So we are ready . * It doesn't enable sched events tracing however. * You have to call enable_boot_trace to do so. */ void start_boot_trace(void) { trace_boot_enabled = 1; pre_initcalls_finished = true; } void stop_boot_trace(void) void enable_boot_trace(void) { trace_boot_enabled = 0; if (pre_initcalls_finished) tracing_start_cmdline_record(); } void reset_boot_trace(struct trace_array *tr) void disable_boot_trace(void) { stop_boot_trace(); if (pre_initcalls_finished) tracing_stop_cmdline_record(); } static void reset_boot_trace(struct trace_array *tr) { sched_switch_trace.reset(tr); } static void boot_trace_init(struct trace_array *tr) Loading @@ -37,18 +47,18 @@ static void boot_trace_init(struct trace_array *tr) int cpu; boot_trace = tr; trace_boot_enabled = 0; for_each_cpu_mask(cpu, cpu_possible_map) tracing_reset(tr, cpu); sched_switch_trace.init(tr); } static void boot_trace_ctrl_update(struct trace_array *tr) { if (tr->ctrl) start_boot_trace(); enable_boot_trace(); else stop_boot_trace(); disable_boot_trace(); } static enum print_line_t initcall_print_line(struct trace_iterator *iter) Loading Loading @@ -99,7 +109,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn) unsigned long irq_flags; struct trace_array *tr = boot_trace; if (!trace_boot_enabled) if (!pre_initcalls_finished) return; /* Get its name now since this function could Loading Loading
include/linux/ftrace.h +22 −2 Original line number Diff line number Diff line Loading @@ -234,6 +234,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } #endif /* * Structure which defines the trace of an initcall. * You don't have to fill the func field since it is * only used internally by the tracer. */ struct boot_trace { pid_t caller; char func[KSYM_NAME_LEN]; Loading @@ -244,13 +249,28 @@ struct boot_trace { }; #ifdef CONFIG_BOOT_TRACER /* Append the trace on the ring-buffer */ extern void trace_boot(struct boot_trace *it, initcall_t fn); /* Tells the tracer that smp_pre_initcall is finished. * So we can start the tracing */ extern void start_boot_trace(void); extern void stop_boot_trace(void); /* Resume the tracing of other necessary events * such as sched switches */ extern void enable_boot_trace(void); /* Suspend this tracing. Actually, only sched_switches tracing have * to be suspended. Initcalls doesn't need it.) */ extern void disable_boot_trace(void); #else static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } static inline void start_boot_trace(void) { } static inline void stop_boot_trace(void) { } static inline void enable_boot_trace(void) { } static inline void disable_boot_trace(void) { } #endif Loading
init/main.c +3 −1 Original line number Diff line number Diff line Loading @@ -711,6 +711,7 @@ int do_one_initcall(initcall_t fn) it.caller = task_pid_nr(current); printk("calling %pF @ %i\n", fn, it.caller); it.calltime = ktime_get(); enable_boot_trace(); } it.result = fn(); Loading @@ -722,6 +723,7 @@ int do_one_initcall(initcall_t fn) printk("initcall %pF returned %d after %Ld usecs\n", fn, it.result, it.duration); trace_boot(&it, fn); disable_boot_trace(); } msgbuf[0] = 0; Loading Loading @@ -882,7 +884,7 @@ static int __init kernel_init(void * unused) * we're essentially up and running. Get rid of the * initmem segments and start the user-mode stuff.. */ stop_boot_trace(); init_post(); return 0; }
kernel/trace/trace.c +2 −0 Original line number Diff line number Diff line Loading @@ -3285,6 +3285,8 @@ __init static int tracer_alloc_buffers(void) register_tracer(&nop_trace); #ifdef CONFIG_BOOT_TRACER /* We don't want to launch sched_switch tracer yet */ global_trace.ctrl = 0; register_tracer(&boot_tracer); current_trace = &boot_tracer; current_trace->init(&global_trace); Loading
kernel/trace/trace.h +1 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ struct ftrace_entry { unsigned long parent_ip; }; extern struct tracer boot_tracer; extern struct tracer sched_switch_trace; /* Used by the boot tracer */ /* * Context switch trace entry - which task (and prio) we switched from/to: Loading
kernel/trace/trace_boot.c +23 −13 Original line number Diff line number Diff line Loading @@ -13,23 +13,33 @@ #include "trace.h" static struct trace_array *boot_trace; static int trace_boot_enabled; static bool pre_initcalls_finished; /* Should be started after do_pre_smp_initcalls() in init/main.c */ /* Tells the boot tracer that the pre_smp_initcalls are finished. * So we are ready . * It doesn't enable sched events tracing however. * You have to call enable_boot_trace to do so. */ void start_boot_trace(void) { trace_boot_enabled = 1; pre_initcalls_finished = true; } void stop_boot_trace(void) void enable_boot_trace(void) { trace_boot_enabled = 0; if (pre_initcalls_finished) tracing_start_cmdline_record(); } void reset_boot_trace(struct trace_array *tr) void disable_boot_trace(void) { stop_boot_trace(); if (pre_initcalls_finished) tracing_stop_cmdline_record(); } static void reset_boot_trace(struct trace_array *tr) { sched_switch_trace.reset(tr); } static void boot_trace_init(struct trace_array *tr) Loading @@ -37,18 +47,18 @@ static void boot_trace_init(struct trace_array *tr) int cpu; boot_trace = tr; trace_boot_enabled = 0; for_each_cpu_mask(cpu, cpu_possible_map) tracing_reset(tr, cpu); sched_switch_trace.init(tr); } static void boot_trace_ctrl_update(struct trace_array *tr) { if (tr->ctrl) start_boot_trace(); enable_boot_trace(); else stop_boot_trace(); disable_boot_trace(); } static enum print_line_t initcall_print_line(struct trace_iterator *iter) Loading Loading @@ -99,7 +109,7 @@ void trace_boot(struct boot_trace *it, initcall_t fn) unsigned long irq_flags; struct trace_array *tr = boot_trace; if (!trace_boot_enabled) if (!pre_initcalls_finished) return; /* Get its name now since this function could Loading