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:
committed by
Ingo Molnar
parent
1756220530
commit
c6ced61112
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user