perf sched: Add involuntarily sleeping task in work atoms

Currently in perf sched, we are measuring the scheduler wakeup
latencies.

Now we also want measure the time a task wait to be scheduled
after it gets preempted.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Frederic Weisbecker
2009-09-13 00:46:19 +02:00
committed by Ingo Molnar
parent 1756220530
commit c6ced61112

View File

@@ -866,8 +866,8 @@ static struct trace_sched_handler replay_ops = {
#define TASK_STATE_TO_CHAR_STR "RSDTtZX" #define TASK_STATE_TO_CHAR_STR "RSDTtZX"
enum thread_state { enum thread_state {
THREAD_SLEEPING, THREAD_SLEEPING = 0,
THREAD_WAKED_UP, THREAD_WAIT_CPU,
THREAD_SCHED_IN, THREAD_SCHED_IN,
THREAD_IGNORE THREAD_IGNORE
}; };
@@ -962,7 +962,9 @@ static char sched_out_state(struct trace_switch_event *switch_event)
static void static void
lat_sched_out(struct task_atoms *atoms, lat_sched_out(struct task_atoms *atoms,
struct trace_switch_event *switch_event __used, u64 delta) struct trace_switch_event *switch_event __used,
u64 delta,
u64 timestamp)
{ {
struct work_atom *snapshot; struct work_atom *snapshot;
@@ -970,6 +972,11 @@ lat_sched_out(struct task_atoms *atoms,
if (!snapshot) if (!snapshot)
die("Non memory"); die("Non memory");
if (sched_out_state(switch_event) == 'R') {
snapshot->state = THREAD_WAIT_CPU;
snapshot->wake_up_time = timestamp;
}
snapshot->runtime = delta; snapshot->runtime = delta;
list_add_tail(&snapshot->list, &atoms->snapshot_list); list_add_tail(&snapshot->list, &atoms->snapshot_list);
} }
@@ -985,7 +992,7 @@ lat_sched_in(struct task_atoms *atoms, u64 timestamp)
snapshot = list_entry(atoms->snapshot_list.prev, struct work_atom, snapshot = list_entry(atoms->snapshot_list.prev, struct work_atom,
list); list);
if (snapshot->state != THREAD_WAKED_UP) if (snapshot->state != THREAD_WAIT_CPU)
return; return;
if (timestamp < snapshot->wake_up_time) { if (timestamp < snapshot->wake_up_time) {
@@ -1043,7 +1050,7 @@ latency_switch_event(struct trace_switch_event *switch_event,
} }
lat_sched_in(in_atoms, timestamp); lat_sched_in(in_atoms, timestamp);
lat_sched_out(out_atoms, switch_event, delta); lat_sched_out(out_atoms, switch_event, delta, timestamp);
} }
static void static void
@@ -1077,7 +1084,7 @@ latency_wakeup_event(struct trace_wakeup_event *wakeup_event,
if (snapshot->state != THREAD_SLEEPING) if (snapshot->state != THREAD_SLEEPING)
return; return;
snapshot->state = THREAD_WAKED_UP; snapshot->state = THREAD_WAIT_CPU;
snapshot->wake_up_time = timestamp; snapshot->wake_up_time = timestamp;
} }