Skip to content

Commit

Permalink
tracing/fastboot: Enable boot tracing only during initcalls
Browse files Browse the repository at this point in the history
Impact: modify boot tracer

We used to disable the initcall tracing at a specified time (IE: end
of builtin initcalls). But we don't need it anymore. It will be
stopped when initcalls are finished.

However we want two things:

_Start this tracing only after pre-smp initcalls are finished.

_Since we are planning to trace sched_switches at the same time, we
want to enable them only during the initcall execution.

For this purpose, this patch introduce two functions to enable/disable
the sched_switch tracing during boot.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Nov 4, 2008
1 parent 7a895f5 commit 71566a0
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 15 deletions.
24 changes: 22 additions & 2 deletions include/linux/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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


Expand Down
4 changes: 3 additions & 1 deletion init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
28 changes: 16 additions & 12 deletions kernel/trace/trace_boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,42 +13,46 @@
#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 enable_boot_trace(void)
{
}

void stop_boot_trace(void)
void disable_boot_trace(void)
{
trace_boot_enabled = 0;
}

void reset_boot_trace(struct trace_array *tr)
{
stop_boot_trace();
disable_boot_trace();
}

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);
}

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)
Expand Down Expand Up @@ -99,7 +103,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
Expand Down

0 comments on commit 71566a0

Please sign in to comment.