Commit 3244351c authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar

trace: separate out rt tasks from wakeup tracer

Impact: add option to trace all tasks or just RT tasks

The current wakeup tracer only traces RT task wakeups. This is
fine for those interested in wake up timings of RT tasks, but
it is useless for those that are interested in the causes
of long wakeups for non RT tasks.

This patch creates a "wakeup_rt" to implement the tracing of just
RT tasks (as the current "wakeup" does). And makes "wakeup" now
trace all tasks as an average developer would expect.
Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 97b17efe
...@@ -25,6 +25,7 @@ static int __read_mostly tracer_enabled; ...@@ -25,6 +25,7 @@ static int __read_mostly tracer_enabled;
static struct task_struct *wakeup_task; static struct task_struct *wakeup_task;
static int wakeup_cpu; static int wakeup_cpu;
static unsigned wakeup_prio = -1; static unsigned wakeup_prio = -1;
static int wakeup_rt;
static raw_spinlock_t wakeup_lock = static raw_spinlock_t wakeup_lock =
(raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
...@@ -224,7 +225,7 @@ probe_wakeup(struct rq *rq, struct task_struct *p, int success) ...@@ -224,7 +225,7 @@ probe_wakeup(struct rq *rq, struct task_struct *p, int success)
tracing_record_cmdline(p); tracing_record_cmdline(p);
tracing_record_cmdline(current); tracing_record_cmdline(current);
if (likely(!rt_task(p)) || if ((wakeup_rt && !rt_task(p)) ||
p->prio >= wakeup_prio || p->prio >= wakeup_prio ||
p->prio >= current->prio) p->prio >= current->prio)
return; return;
...@@ -321,7 +322,7 @@ static void stop_wakeup_tracer(struct trace_array *tr) ...@@ -321,7 +322,7 @@ static void stop_wakeup_tracer(struct trace_array *tr)
unregister_trace_sched_wakeup(probe_wakeup); unregister_trace_sched_wakeup(probe_wakeup);
} }
static int wakeup_tracer_init(struct trace_array *tr) static int __wakeup_tracer_init(struct trace_array *tr)
{ {
tracing_max_latency = 0; tracing_max_latency = 0;
wakeup_trace = tr; wakeup_trace = tr;
...@@ -329,6 +330,18 @@ static int wakeup_tracer_init(struct trace_array *tr) ...@@ -329,6 +330,18 @@ static int wakeup_tracer_init(struct trace_array *tr)
return 0; return 0;
} }
static int wakeup_tracer_init(struct trace_array *tr)
{
wakeup_rt = 0;
return __wakeup_tracer_init(tr);
}
static int wakeup_rt_tracer_init(struct trace_array *tr)
{
wakeup_rt = 1;
return __wakeup_tracer_init(tr);
}
static void wakeup_tracer_reset(struct trace_array *tr) static void wakeup_tracer_reset(struct trace_array *tr)
{ {
stop_wakeup_tracer(tr); stop_wakeup_tracer(tr);
...@@ -360,6 +373,19 @@ static struct tracer wakeup_tracer __read_mostly = ...@@ -360,6 +373,19 @@ static struct tracer wakeup_tracer __read_mostly =
#endif #endif
}; };
static struct tracer wakeup_rt_tracer __read_mostly =
{
.name = "wakeup_rt",
.init = wakeup_rt_tracer_init,
.reset = wakeup_tracer_reset,
.start = wakeup_tracer_start,
.stop = wakeup_tracer_stop,
.print_max = 1,
#ifdef CONFIG_FTRACE_SELFTEST
.selftest = trace_selftest_startup_wakeup,
#endif
};
__init static int init_wakeup_tracer(void) __init static int init_wakeup_tracer(void)
{ {
int ret; int ret;
...@@ -368,6 +394,10 @@ __init static int init_wakeup_tracer(void) ...@@ -368,6 +394,10 @@ __init static int init_wakeup_tracer(void)
if (ret) if (ret)
return ret; return ret;
ret = register_tracer(&wakeup_rt_tracer);
if (ret)
return ret;
return 0; return 0;
} }
device_initcall(init_wakeup_tracer); device_initcall(init_wakeup_tracer);
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