diff options
Diffstat (limited to 'kernel/trace/trace_boot.c')
| -rw-r--r-- | kernel/trace/trace_boot.c | 36 | 
1 files changed, 14 insertions, 22 deletions
diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c index 366c8c333e1..7a30fc4c364 100644 --- a/kernel/trace/trace_boot.c +++ b/kernel/trace/trace_boot.c @@ -11,6 +11,7 @@  #include <linux/kallsyms.h>  #include "trace.h" +#include "trace_output.h"  static struct trace_array *boot_trace;  static bool pre_initcalls_finished; @@ -27,13 +28,13 @@ void start_boot_trace(void)  void enable_boot_trace(void)  { -	if (pre_initcalls_finished) +	if (boot_trace && pre_initcalls_finished)  		tracing_start_sched_switch_record();  }  void disable_boot_trace(void)  { -	if (pre_initcalls_finished) +	if (boot_trace && pre_initcalls_finished)  		tracing_stop_sched_switch_record();  } @@ -42,6 +43,9 @@ static int boot_trace_init(struct trace_array *tr)  	int cpu;  	boot_trace = tr; +	if (!tr) +		return 0; +  	for_each_cpu(cpu, cpu_possible_mask)  		tracing_reset(tr, cpu); @@ -128,10 +132,9 @@ void trace_boot_call(struct boot_trace_call *bt, initcall_t fn)  {  	struct ring_buffer_event *event;  	struct trace_boot_call *entry; -	unsigned long irq_flags;  	struct trace_array *tr = boot_trace; -	if (!pre_initcalls_finished) +	if (!tr || !pre_initcalls_finished)  		return;  	/* Get its name now since this function could @@ -140,18 +143,13 @@ void trace_boot_call(struct boot_trace_call *bt, initcall_t fn)  	sprint_symbol(bt->func, (unsigned long)fn);  	preempt_disable(); -	event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), -					 &irq_flags); +	event = trace_buffer_lock_reserve(tr, TRACE_BOOT_CALL, +					  sizeof(*entry), 0, 0);  	if (!event)  		goto out;  	entry	= ring_buffer_event_data(event); -	tracing_generic_entry_update(&entry->ent, 0, 0); -	entry->ent.type = TRACE_BOOT_CALL;  	entry->boot_call = *bt; -	ring_buffer_unlock_commit(tr->buffer, event, irq_flags); - -	trace_wake_up(); - +	trace_buffer_unlock_commit(tr, event, 0, 0);   out:  	preempt_enable();  } @@ -160,27 +158,21 @@ void trace_boot_ret(struct boot_trace_ret *bt, initcall_t fn)  {  	struct ring_buffer_event *event;  	struct trace_boot_ret *entry; -	unsigned long irq_flags;  	struct trace_array *tr = boot_trace; -	if (!pre_initcalls_finished) +	if (!tr || !pre_initcalls_finished)  		return;  	sprint_symbol(bt->func, (unsigned long)fn);  	preempt_disable(); -	event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), -					 &irq_flags); +	event = trace_buffer_lock_reserve(tr, TRACE_BOOT_RET, +					  sizeof(*entry), 0, 0);  	if (!event)  		goto out;  	entry	= ring_buffer_event_data(event); -	tracing_generic_entry_update(&entry->ent, 0, 0); -	entry->ent.type = TRACE_BOOT_RET;  	entry->boot_ret = *bt; -	ring_buffer_unlock_commit(tr->buffer, event, irq_flags); - -	trace_wake_up(); - +	trace_buffer_unlock_commit(tr, event, 0, 0);   out:  	preempt_enable();  }  |