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: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
4104d326b6
commit
6d9b3fa5e7
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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 {
|
||||||
*/
|
*/
|
||||||
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);
|
||||||
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)
|
||||||
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)
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
|
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
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)
|
||||||
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 @@ out:
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
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 *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 @@ out:
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue