Commit 6712e299 authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'tracing/ftrace' into auto-ftrace-next

parents ec1bb60b b2613e37
...@@ -89,6 +89,7 @@ void ftrace_enable_daemon(void); ...@@ -89,6 +89,7 @@ void ftrace_enable_daemon(void);
/* totally disable ftrace - can not re-enable after this */ /* totally disable ftrace - can not re-enable after this */
void ftrace_kill(void); void ftrace_kill(void);
void ftrace_kill_atomic(void);
static inline void tracer_disable(void) static inline void tracer_disable(void)
{ {
......
...@@ -11,7 +11,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ ...@@ -11,7 +11,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \
notifier.o ksysfs.o pm_qos_params.o sched_clock.o notifier.o ksysfs.o pm_qos_params.o sched_clock.o
CFLAGS_REMOVE_sched.o = -pg -mno-spe CFLAGS_REMOVE_sched.o = -mno-spe
ifdef CONFIG_FTRACE ifdef CONFIG_FTRACE
# Do not trace debug files and internal ftrace files # Do not trace debug files and internal ftrace files
......
...@@ -1601,6 +1601,23 @@ core_initcall(ftrace_dynamic_init); ...@@ -1601,6 +1601,23 @@ core_initcall(ftrace_dynamic_init);
# define ftrace_force_shutdown() do { } while (0) # define ftrace_force_shutdown() do { } while (0)
#endif /* CONFIG_DYNAMIC_FTRACE */ #endif /* CONFIG_DYNAMIC_FTRACE */
/**
* ftrace_kill_atomic - kill ftrace from critical sections
*
* This function should be used by panic code. It stops ftrace
* but in a not so nice way. If you need to simply kill ftrace
* from a non-atomic section, use ftrace_kill.
*/
void ftrace_kill_atomic(void)
{
ftrace_disabled = 1;
ftrace_enabled = 0;
#ifdef CONFIG_DYNAMIC_FTRACE
ftraced_suspend = -1;
#endif
clear_ftrace_function();
}
/** /**
* ftrace_kill - totally shutdown ftrace * ftrace_kill - totally shutdown ftrace
* *
......
...@@ -96,6 +96,9 @@ static DEFINE_PER_CPU(struct trace_array_cpu, max_data); ...@@ -96,6 +96,9 @@ static DEFINE_PER_CPU(struct trace_array_cpu, max_data);
/* tracer_enabled is used to toggle activation of a tracer */ /* tracer_enabled is used to toggle activation of a tracer */
static int tracer_enabled = 1; static int tracer_enabled = 1;
/* function tracing enabled */
int ftrace_function_enabled;
/* /*
* trace_nr_entries is the number of entries that is allocated * trace_nr_entries is the number of entries that is allocated
* for a buffer. Note, the number of entries is always rounded * for a buffer. Note, the number of entries is always rounded
...@@ -134,6 +137,7 @@ static notrace void no_trace_init(struct trace_array *tr) ...@@ -134,6 +137,7 @@ static notrace void no_trace_init(struct trace_array *tr)
{ {
int cpu; int cpu;
ftrace_function_enabled = 0;
if(tr->ctrl) if(tr->ctrl)
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
tracing_reset(tr->data[cpu]); tracing_reset(tr->data[cpu]);
...@@ -1027,7 +1031,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip) ...@@ -1027,7 +1031,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip)
long disabled; long disabled;
int cpu; int cpu;
if (unlikely(!tracer_enabled)) if (unlikely(!ftrace_function_enabled))
return; return;
if (skip_trace(ip)) if (skip_trace(ip))
...@@ -1052,11 +1056,15 @@ static struct ftrace_ops trace_ops __read_mostly = ...@@ -1052,11 +1056,15 @@ static struct ftrace_ops trace_ops __read_mostly =
void tracing_start_function_trace(void) void tracing_start_function_trace(void)
{ {
ftrace_function_enabled = 0;
register_ftrace_function(&trace_ops); register_ftrace_function(&trace_ops);
if (tracer_enabled)
ftrace_function_enabled = 1;
} }
void tracing_stop_function_trace(void) void tracing_stop_function_trace(void)
{ {
ftrace_function_enabled = 0;
unregister_ftrace_function(&trace_ops); unregister_ftrace_function(&trace_ops);
} }
#endif #endif
...@@ -1383,7 +1391,7 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter) ...@@ -1383,7 +1391,7 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter)
"server", "server",
#elif defined(CONFIG_PREEMPT_VOLUNTARY) #elif defined(CONFIG_PREEMPT_VOLUNTARY)
"desktop", "desktop",
#elif defined(CONFIG_PREEMPT_DESKTOP) #elif defined(CONFIG_PREEMPT)
"preempt", "preempt",
#else #else
"unknown", "unknown",
...@@ -1892,8 +1900,10 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) ...@@ -1892,8 +1900,10 @@ __tracing_open(struct inode *inode, struct file *file, int *ret)
m->private = iter; m->private = iter;
/* stop the trace while dumping */ /* stop the trace while dumping */
if (iter->tr->ctrl) if (iter->tr->ctrl) {
tracer_enabled = 0; tracer_enabled = 0;
ftrace_function_enabled = 0;
}
if (iter->trace && iter->trace->open) if (iter->trace && iter->trace->open)
iter->trace->open(iter); iter->trace->open(iter);
...@@ -1926,8 +1936,14 @@ int tracing_release(struct inode *inode, struct file *file) ...@@ -1926,8 +1936,14 @@ int tracing_release(struct inode *inode, struct file *file)
iter->trace->close(iter); iter->trace->close(iter);
/* reenable tracing if it was previously enabled */ /* reenable tracing if it was previously enabled */
if (iter->tr->ctrl) if (iter->tr->ctrl) {
tracer_enabled = 1; tracer_enabled = 1;
/*
* It is safe to enable function tracing even if it
* isn't used
*/
ftrace_function_enabled = 1;
}
mutex_unlock(&trace_types_lock); mutex_unlock(&trace_types_lock);
seq_release(inode, file); seq_release(inode, file);
......
...@@ -223,8 +223,6 @@ void trace_function(struct trace_array *tr, ...@@ -223,8 +223,6 @@ void trace_function(struct trace_array *tr,
unsigned long parent_ip, unsigned long parent_ip,
unsigned long flags); unsigned long flags);
void tracing_start_function_trace(void);
void tracing_stop_function_trace(void);
void tracing_start_cmdline_record(void); void tracing_start_cmdline_record(void);
void tracing_stop_cmdline_record(void); void tracing_stop_cmdline_record(void);
int register_tracer(struct tracer *type); int register_tracer(struct tracer *type);
...@@ -241,6 +239,14 @@ void update_max_tr_single(struct trace_array *tr, ...@@ -241,6 +239,14 @@ void update_max_tr_single(struct trace_array *tr,
extern cycle_t ftrace_now(int cpu); extern cycle_t ftrace_now(int cpu);
#ifdef CONFIG_FTRACE
void tracing_start_function_trace(void);
void tracing_stop_function_trace(void);
#else
# define tracing_start_function_trace() do { } while (0)
# define tracing_stop_function_trace() do { } while (0)
#endif
#ifdef CONFIG_CONTEXT_SWITCH_TRACER #ifdef CONFIG_CONTEXT_SWITCH_TRACER
typedef void typedef void
(*tracer_switch_func_t)(void *private, (*tracer_switch_func_t)(void *private,
......
...@@ -28,7 +28,10 @@ static void function_reset(struct trace_array *tr) ...@@ -28,7 +28,10 @@ static void function_reset(struct trace_array *tr)
static void start_function_trace(struct trace_array *tr) static void start_function_trace(struct trace_array *tr)
{ {
tr->cpu = get_cpu();
function_reset(tr); function_reset(tr);
put_cpu();
tracing_start_cmdline_record(); tracing_start_cmdline_record();
tracing_start_function_trace(); tracing_start_function_trace();
} }
......
...@@ -227,14 +227,14 @@ void tracing_stop_cmdline_record(void) ...@@ -227,14 +227,14 @@ void tracing_stop_cmdline_record(void)
static void start_sched_trace(struct trace_array *tr) static void start_sched_trace(struct trace_array *tr)
{ {
sched_switch_reset(tr); sched_switch_reset(tr);
tracer_enabled = 1;
tracing_start_cmdline_record(); tracing_start_cmdline_record();
tracer_enabled = 1;
} }
static void stop_sched_trace(struct trace_array *tr) static void stop_sched_trace(struct trace_array *tr)
{ {
tracing_stop_cmdline_record();
tracer_enabled = 0; tracer_enabled = 0;
tracing_stop_cmdline_record();
} }
static void sched_switch_trace_init(struct trace_array *tr) static void sched_switch_trace_init(struct trace_array *tr)
......
...@@ -352,9 +352,10 @@ static void start_wakeup_tracer(struct trace_array *tr) ...@@ -352,9 +352,10 @@ static void start_wakeup_tracer(struct trace_array *tr)
*/ */
smp_wmb(); smp_wmb();
tracer_enabled = 1;
register_ftrace_function(&trace_ops); register_ftrace_function(&trace_ops);
tracer_enabled = 1;
return; return;
fail_deprobe_wake_new: fail_deprobe_wake_new:
marker_probe_unregister("kernel_sched_wakeup_new", marker_probe_unregister("kernel_sched_wakeup_new",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment