Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79c81d22 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'tracing/fastboot' into tracing/ftrace

parents 3299b4dd 79a9d461
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -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];
@@ -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


+3 −1
Original line number Diff line number Diff line
@@ -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();
@@ -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;
@@ -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;
}
+2 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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:
+23 −13
Original line number Diff line number Diff line
@@ -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)
@@ -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)
@@ -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