Commit 6d9b3fa5 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt

tracing: Move tracing_max_latency into trace_array

In preparation for letting the latency tracers be used by instances,
remove the global tracing_max_latency variable and add a max_latency
field to the trace_array that the latency tracers will now use.
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 4104d326
...@@ -982,8 +982,6 @@ static arch_spinlock_t ftrace_max_lock = ...@@ -982,8 +982,6 @@ static arch_spinlock_t ftrace_max_lock =
unsigned long __read_mostly tracing_thresh; unsigned long __read_mostly tracing_thresh;
#ifdef CONFIG_TRACER_MAX_TRACE #ifdef CONFIG_TRACER_MAX_TRACE
unsigned long __read_mostly tracing_max_latency;
/* /*
* Copy the new maximum trace into the separate maximum-trace * Copy the new maximum trace into the separate maximum-trace
* structure. (this way the maximum trace is permanently saved, * structure. (this way the maximum trace is permanently saved,
...@@ -1000,7 +998,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) ...@@ -1000,7 +998,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
max_buf->cpu = cpu; max_buf->cpu = cpu;
max_buf->time_start = data->preempt_timestamp; max_buf->time_start = data->preempt_timestamp;
max_data->saved_latency = tracing_max_latency; max_data->saved_latency = tr->max_latency;
max_data->critical_start = data->critical_start; max_data->critical_start = data->critical_start;
max_data->critical_end = data->critical_end; max_data->critical_end = data->critical_end;
...@@ -6328,6 +6326,11 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer) ...@@ -6328,6 +6326,11 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer)
trace_create_file("tracing_on", 0644, d_tracer, trace_create_file("tracing_on", 0644, d_tracer,
tr, &rb_simple_fops); tr, &rb_simple_fops);
#ifdef CONFIG_TRACER_MAX_TRACE
trace_create_file("tracing_max_latency", 0644, d_tracer,
&tr->max_latency, &tracing_max_lat_fops);
#endif
if (ftrace_create_function_files(tr, d_tracer)) if (ftrace_create_function_files(tr, d_tracer))
WARN(1, "Could not allocate function filter files"); WARN(1, "Could not allocate function filter files");
...@@ -6353,11 +6356,6 @@ static __init int tracer_init_debugfs(void) ...@@ -6353,11 +6356,6 @@ static __init int tracer_init_debugfs(void)
init_tracer_debugfs(&global_trace, d_tracer); init_tracer_debugfs(&global_trace, d_tracer);
#ifdef CONFIG_TRACER_MAX_TRACE
trace_create_file("tracing_max_latency", 0644, d_tracer,
&tracing_max_latency, &tracing_max_lat_fops);
#endif
trace_create_file("tracing_thresh", 0644, d_tracer, trace_create_file("tracing_thresh", 0644, d_tracer,
&tracing_thresh, &tracing_max_lat_fops); &tracing_thresh, &tracing_max_lat_fops);
......
...@@ -190,6 +190,7 @@ struct trace_array { ...@@ -190,6 +190,7 @@ struct trace_array {
*/ */
struct trace_buffer max_buffer; struct trace_buffer max_buffer;
bool allocated_snapshot; bool allocated_snapshot;
unsigned long max_latency;
#endif #endif
int buffer_disabled; int buffer_disabled;
#ifdef CONFIG_FTRACE_SYSCALLS #ifdef CONFIG_FTRACE_SYSCALLS
...@@ -599,8 +600,6 @@ extern unsigned long nsecs_to_usecs(unsigned long nsecs); ...@@ -599,8 +600,6 @@ extern unsigned long nsecs_to_usecs(unsigned long nsecs);
extern unsigned long tracing_thresh; extern unsigned long tracing_thresh;
#ifdef CONFIG_TRACER_MAX_TRACE #ifdef CONFIG_TRACER_MAX_TRACE
extern unsigned long tracing_max_latency;
void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu); void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu);
void update_max_tr_single(struct trace_array *tr, void update_max_tr_single(struct trace_array *tr,
struct task_struct *tsk, int cpu); struct task_struct *tsk, int cpu);
......
...@@ -170,7 +170,7 @@ irqsoff_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set) ...@@ -170,7 +170,7 @@ irqsoff_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
for_each_possible_cpu(cpu) for_each_possible_cpu(cpu)
per_cpu(tracing_cpu, cpu) = 0; per_cpu(tracing_cpu, cpu) = 0;
tracing_max_latency = 0; tr->max_latency = 0;
tracing_reset_online_cpus(&irqsoff_trace->trace_buffer); tracing_reset_online_cpus(&irqsoff_trace->trace_buffer);
return start_irqsoff_tracer(irqsoff_trace, set); return start_irqsoff_tracer(irqsoff_trace, set);
...@@ -297,13 +297,13 @@ static void irqsoff_print_header(struct seq_file *s) ...@@ -297,13 +297,13 @@ static void irqsoff_print_header(struct seq_file *s)
/* /*
* Should this new latency be reported/recorded? * Should this new latency be reported/recorded?
*/ */
static int report_latency(cycle_t delta) static int report_latency(struct trace_array *tr, cycle_t delta)
{ {
if (tracing_thresh) { if (tracing_thresh) {
if (delta < tracing_thresh) if (delta < tracing_thresh)
return 0; return 0;
} else { } else {
if (delta <= tracing_max_latency) if (delta <= tr->max_latency)
return 0; return 0;
} }
return 1; return 1;
...@@ -327,13 +327,13 @@ check_critical_timing(struct trace_array *tr, ...@@ -327,13 +327,13 @@ check_critical_timing(struct trace_array *tr,
pc = preempt_count(); pc = preempt_count();
if (!report_latency(delta)) if (!report_latency(tr, delta))
goto out; goto out;
raw_spin_lock_irqsave(&max_trace_lock, flags); raw_spin_lock_irqsave(&max_trace_lock, flags);
/* check if we are still the max latency */ /* check if we are still the max latency */
if (!report_latency(delta)) if (!report_latency(tr, delta))
goto out_unlock; goto out_unlock;
__trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc); __trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc);
...@@ -346,7 +346,7 @@ check_critical_timing(struct trace_array *tr, ...@@ -346,7 +346,7 @@ check_critical_timing(struct trace_array *tr,
data->critical_end = parent_ip; data->critical_end = parent_ip;
if (likely(!is_tracing_stopped())) { if (likely(!is_tracing_stopped())) {
tracing_max_latency = delta; tr->max_latency = delta;
update_max_tr_single(tr, current, cpu); update_max_tr_single(tr, current, cpu);
} }
...@@ -605,7 +605,7 @@ static void __irqsoff_tracer_init(struct trace_array *tr) ...@@ -605,7 +605,7 @@ static void __irqsoff_tracer_init(struct trace_array *tr)
set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1); set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1); set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
tracing_max_latency = 0; tr->max_latency = 0;
irqsoff_trace = tr; irqsoff_trace = tr;
/* make sure that the tracer is visible */ /* make sure that the tracer is visible */
smp_wmb(); smp_wmb();
......
...@@ -218,7 +218,7 @@ wakeup_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set) ...@@ -218,7 +218,7 @@ wakeup_set_flag(struct trace_array *tr, u32 old_flags, u32 bit, int set)
stop_func_tracer(tr, !set); stop_func_tracer(tr, !set);
wakeup_reset(wakeup_trace); wakeup_reset(wakeup_trace);
tracing_max_latency = 0; tr->max_latency = 0;
return start_func_tracer(tr, set); return start_func_tracer(tr, set);
} }
...@@ -344,13 +344,13 @@ static void wakeup_print_header(struct seq_file *s) ...@@ -344,13 +344,13 @@ static void wakeup_print_header(struct seq_file *s)
/* /*
* Should this new latency be reported/recorded? * Should this new latency be reported/recorded?
*/ */
static int report_latency(cycle_t delta) static int report_latency(struct trace_array *tr, cycle_t delta)
{ {
if (tracing_thresh) { if (tracing_thresh) {
if (delta < tracing_thresh) if (delta < tracing_thresh)
return 0; return 0;
} else { } else {
if (delta <= tracing_max_latency) if (delta <= tr->max_latency)
return 0; return 0;
} }
return 1; return 1;
...@@ -418,11 +418,11 @@ probe_wakeup_sched_switch(void *ignore, ...@@ -418,11 +418,11 @@ probe_wakeup_sched_switch(void *ignore,
T1 = ftrace_now(cpu); T1 = ftrace_now(cpu);
delta = T1-T0; delta = T1-T0;
if (!report_latency(delta)) if (!report_latency(wakeup_trace, delta))
goto out_unlock; goto out_unlock;
if (likely(!is_tracing_stopped())) { if (likely(!is_tracing_stopped())) {
tracing_max_latency = delta; wakeup_trace->max_latency = delta;
update_max_tr(wakeup_trace, wakeup_task, wakeup_cpu); update_max_tr(wakeup_trace, wakeup_task, wakeup_cpu);
} }
...@@ -609,7 +609,7 @@ static int __wakeup_tracer_init(struct trace_array *tr) ...@@ -609,7 +609,7 @@ static int __wakeup_tracer_init(struct trace_array *tr)
set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1); set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1); set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
tracing_max_latency = 0; tr->max_latency = 0;
wakeup_trace = tr; wakeup_trace = tr;
ftrace_init_array_ops(tr, wakeup_tracer_call); ftrace_init_array_ops(tr, wakeup_tracer_call);
start_wakeup_tracer(tr); start_wakeup_tracer(tr);
......
...@@ -807,7 +807,7 @@ trace_selftest_startup_function_graph(struct tracer *trace, ...@@ -807,7 +807,7 @@ trace_selftest_startup_function_graph(struct tracer *trace,
int int
trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
{ {
unsigned long save_max = tracing_max_latency; unsigned long save_max = tr->max_latency;
unsigned long count; unsigned long count;
int ret; int ret;
...@@ -819,7 +819,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) ...@@ -819,7 +819,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
} }
/* reset the max latency */ /* reset the max latency */
tracing_max_latency = 0; tr->max_latency = 0;
/* disable interrupts for a bit */ /* disable interrupts for a bit */
local_irq_disable(); local_irq_disable();
udelay(100); udelay(100);
...@@ -846,7 +846,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) ...@@ -846,7 +846,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
ret = -1; ret = -1;
} }
tracing_max_latency = save_max; tr->max_latency = save_max;
return ret; return ret;
} }
...@@ -856,7 +856,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr) ...@@ -856,7 +856,7 @@ trace_selftest_startup_irqsoff(struct tracer *trace, struct trace_array *tr)
int int
trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
{ {
unsigned long save_max = tracing_max_latency; unsigned long save_max = tr->max_latency;
unsigned long count; unsigned long count;
int ret; int ret;
...@@ -881,7 +881,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) ...@@ -881,7 +881,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
} }
/* reset the max latency */ /* reset the max latency */
tracing_max_latency = 0; tr->max_latency = 0;
/* disable preemption for a bit */ /* disable preemption for a bit */
preempt_disable(); preempt_disable();
udelay(100); udelay(100);
...@@ -908,7 +908,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) ...@@ -908,7 +908,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
ret = -1; ret = -1;
} }
tracing_max_latency = save_max; tr->max_latency = save_max;
return ret; return ret;
} }
...@@ -918,7 +918,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr) ...@@ -918,7 +918,7 @@ trace_selftest_startup_preemptoff(struct tracer *trace, struct trace_array *tr)
int int
trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *tr) trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *tr)
{ {
unsigned long save_max = tracing_max_latency; unsigned long save_max = tr->max_latency;
unsigned long count; unsigned long count;
int ret; int ret;
...@@ -943,7 +943,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * ...@@ -943,7 +943,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *
} }
/* reset the max latency */ /* reset the max latency */
tracing_max_latency = 0; tr->max_latency = 0;
/* disable preemption and interrupts for a bit */ /* disable preemption and interrupts for a bit */
preempt_disable(); preempt_disable();
...@@ -978,7 +978,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * ...@@ -978,7 +978,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *
} }
/* do the test by disabling interrupts first this time */ /* do the test by disabling interrupts first this time */
tracing_max_latency = 0; tr->max_latency = 0;
tracing_start(); tracing_start();
trace->start(tr); trace->start(tr);
...@@ -1009,7 +1009,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array * ...@@ -1009,7 +1009,7 @@ trace_selftest_startup_preemptirqsoff(struct tracer *trace, struct trace_array *
tracing_start(); tracing_start();
out_no_start: out_no_start:
trace->reset(tr); trace->reset(tr);
tracing_max_latency = save_max; tr->max_latency = save_max;
return ret; return ret;
} }
...@@ -1062,7 +1062,7 @@ static int trace_wakeup_test_thread(void *data) ...@@ -1062,7 +1062,7 @@ static int trace_wakeup_test_thread(void *data)
int int
trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr)
{ {
unsigned long save_max = tracing_max_latency; unsigned long save_max = tr->max_latency;
struct task_struct *p; struct task_struct *p;
struct completion is_ready; struct completion is_ready;
unsigned long count; unsigned long count;
...@@ -1088,7 +1088,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) ...@@ -1088,7 +1088,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr)
} }
/* reset the max latency */ /* reset the max latency */
tracing_max_latency = 0; tr->max_latency = 0;
while (p->on_rq) { while (p->on_rq) {
/* /*
...@@ -1118,7 +1118,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr) ...@@ -1118,7 +1118,7 @@ trace_selftest_startup_wakeup(struct tracer *trace, struct trace_array *tr)
trace->reset(tr); trace->reset(tr);
tracing_start(); tracing_start();
tracing_max_latency = save_max; tr->max_latency = save_max;
/* kill the thread */ /* kill the thread */
kthread_stop(p); kthread_stop(p);
......
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