perf sched: Rename struct lat_snapshot to struct work atoms
To measures the latencies, we capture the sched atoms data into a specific structure named struct lat_snapshot. As this structure can be used for other purposes of scheduler profiling and mirrors what happens in a thread work atom, lets rename it to struct work_atom and propagate this renaming in other functions and structures names to keep it coherent. 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:
Родитель
3e304147cd
Коммит
1756220530
|
@ -872,7 +872,7 @@ enum thread_state {
|
||||||
THREAD_IGNORE
|
THREAD_IGNORE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct lat_snapshot {
|
struct work_atom {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
enum thread_state state;
|
enum thread_state state;
|
||||||
u64 wake_up_time;
|
u64 wake_up_time;
|
||||||
|
@ -880,7 +880,7 @@ struct lat_snapshot {
|
||||||
u64 runtime;
|
u64 runtime;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct thread_latency {
|
struct task_atoms {
|
||||||
struct list_head snapshot_list;
|
struct list_head snapshot_list;
|
||||||
struct thread *thread;
|
struct thread *thread;
|
||||||
struct rb_node node;
|
struct rb_node node;
|
||||||
|
@ -888,35 +888,35 @@ struct thread_latency {
|
||||||
|
|
||||||
static struct rb_root lat_snapshot_root;
|
static struct rb_root lat_snapshot_root;
|
||||||
|
|
||||||
static struct thread_latency *
|
static struct task_atoms *
|
||||||
thread_latency_search(struct rb_root *root, struct thread *thread)
|
thread_atom_list_search(struct rb_root *root, struct thread *thread)
|
||||||
{
|
{
|
||||||
struct rb_node *node = root->rb_node;
|
struct rb_node *node = root->rb_node;
|
||||||
|
|
||||||
while (node) {
|
while (node) {
|
||||||
struct thread_latency *lat;
|
struct task_atoms *atoms;
|
||||||
|
|
||||||
lat = container_of(node, struct thread_latency, node);
|
atoms = container_of(node, struct task_atoms, node);
|
||||||
if (thread->pid < lat->thread->pid)
|
if (thread->pid < atoms->thread->pid)
|
||||||
node = node->rb_left;
|
node = node->rb_left;
|
||||||
else if (thread->pid > lat->thread->pid)
|
else if (thread->pid > atoms->thread->pid)
|
||||||
node = node->rb_right;
|
node = node->rb_right;
|
||||||
else {
|
else {
|
||||||
return lat;
|
return atoms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__thread_latency_insert(struct rb_root *root, struct thread_latency *data)
|
__thread_latency_insert(struct rb_root *root, struct task_atoms *data)
|
||||||
{
|
{
|
||||||
struct rb_node **new = &(root->rb_node), *parent = NULL;
|
struct rb_node **new = &(root->rb_node), *parent = NULL;
|
||||||
|
|
||||||
while (*new) {
|
while (*new) {
|
||||||
struct thread_latency *this;
|
struct task_atoms *this;
|
||||||
|
|
||||||
this = container_of(*new, struct thread_latency, node);
|
this = container_of(*new, struct task_atoms, node);
|
||||||
parent = *new;
|
parent = *new;
|
||||||
if (data->thread->pid < this->thread->pid)
|
if (data->thread->pid < this->thread->pid)
|
||||||
new = &((*new)->rb_left);
|
new = &((*new)->rb_left);
|
||||||
|
@ -930,16 +930,16 @@ __thread_latency_insert(struct rb_root *root, struct thread_latency *data)
|
||||||
rb_insert_color(&data->node, root);
|
rb_insert_color(&data->node, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void thread_latency_insert(struct thread *thread)
|
static void thread_atom_list_insert(struct thread *thread)
|
||||||
{
|
{
|
||||||
struct thread_latency *lat;
|
struct task_atoms *atoms;
|
||||||
lat = calloc(sizeof(*lat), 1);
|
atoms = calloc(sizeof(*atoms), 1);
|
||||||
if (!lat)
|
if (!atoms)
|
||||||
die("No memory");
|
die("No memory");
|
||||||
|
|
||||||
lat->thread = thread;
|
atoms->thread = thread;
|
||||||
INIT_LIST_HEAD(&lat->snapshot_list);
|
INIT_LIST_HEAD(&atoms->snapshot_list);
|
||||||
__thread_latency_insert(&lat_snapshot_root, lat);
|
__thread_latency_insert(&lat_snapshot_root, atoms);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -961,28 +961,28 @@ static char sched_out_state(struct trace_switch_event *switch_event)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lat_sched_out(struct thread_latency *lat,
|
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)
|
||||||
{
|
{
|
||||||
struct lat_snapshot *snapshot;
|
struct work_atom *snapshot;
|
||||||
|
|
||||||
snapshot = calloc(sizeof(*snapshot), 1);
|
snapshot = calloc(sizeof(*snapshot), 1);
|
||||||
if (!snapshot)
|
if (!snapshot)
|
||||||
die("Non memory");
|
die("Non memory");
|
||||||
|
|
||||||
snapshot->runtime = delta;
|
snapshot->runtime = delta;
|
||||||
list_add_tail(&snapshot->list, &lat->snapshot_list);
|
list_add_tail(&snapshot->list, &atoms->snapshot_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lat_sched_in(struct thread_latency *lat, u64 timestamp)
|
lat_sched_in(struct task_atoms *atoms, u64 timestamp)
|
||||||
{
|
{
|
||||||
struct lat_snapshot *snapshot;
|
struct work_atom *snapshot;
|
||||||
|
|
||||||
if (list_empty(&lat->snapshot_list))
|
if (list_empty(&atoms->snapshot_list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
snapshot = list_entry(lat->snapshot_list.prev, struct lat_snapshot,
|
snapshot = list_entry(atoms->snapshot_list.prev, struct work_atom,
|
||||||
list);
|
list);
|
||||||
|
|
||||||
if (snapshot->state != THREAD_WAKED_UP)
|
if (snapshot->state != THREAD_WAKED_UP)
|
||||||
|
@ -1004,7 +1004,7 @@ latency_switch_event(struct trace_switch_event *switch_event,
|
||||||
u64 timestamp,
|
u64 timestamp,
|
||||||
struct thread *thread __used)
|
struct thread *thread __used)
|
||||||
{
|
{
|
||||||
struct thread_latency *out_lat, *in_lat;
|
struct task_atoms *out_atoms, *in_atoms;
|
||||||
struct thread *sched_out, *sched_in;
|
struct thread *sched_out, *sched_in;
|
||||||
u64 timestamp0;
|
u64 timestamp0;
|
||||||
s64 delta;
|
s64 delta;
|
||||||
|
@ -1026,24 +1026,24 @@ latency_switch_event(struct trace_switch_event *switch_event,
|
||||||
sched_out = threads__findnew(switch_event->prev_pid, &threads, &last_match);
|
sched_out = threads__findnew(switch_event->prev_pid, &threads, &last_match);
|
||||||
sched_in = threads__findnew(switch_event->next_pid, &threads, &last_match);
|
sched_in = threads__findnew(switch_event->next_pid, &threads, &last_match);
|
||||||
|
|
||||||
in_lat = thread_latency_search(&lat_snapshot_root, sched_in);
|
in_atoms = thread_atom_list_search(&lat_snapshot_root, sched_in);
|
||||||
if (!in_lat) {
|
if (!in_atoms) {
|
||||||
thread_latency_insert(sched_in);
|
thread_atom_list_insert(sched_in);
|
||||||
in_lat = thread_latency_search(&lat_snapshot_root, sched_in);
|
in_atoms = thread_atom_list_search(&lat_snapshot_root, sched_in);
|
||||||
if (!in_lat)
|
if (!in_atoms)
|
||||||
die("Internal latency tree error");
|
die("Internal latency tree error");
|
||||||
}
|
}
|
||||||
|
|
||||||
out_lat = thread_latency_search(&lat_snapshot_root, sched_out);
|
out_atoms = thread_atom_list_search(&lat_snapshot_root, sched_out);
|
||||||
if (!out_lat) {
|
if (!out_atoms) {
|
||||||
thread_latency_insert(sched_out);
|
thread_atom_list_insert(sched_out);
|
||||||
out_lat = thread_latency_search(&lat_snapshot_root, sched_out);
|
out_atoms = thread_atom_list_search(&lat_snapshot_root, sched_out);
|
||||||
if (!out_lat)
|
if (!out_atoms)
|
||||||
die("Internal latency tree error");
|
die("Internal latency tree error");
|
||||||
}
|
}
|
||||||
|
|
||||||
lat_sched_in(in_lat, timestamp);
|
lat_sched_in(in_atoms, timestamp);
|
||||||
lat_sched_out(out_lat, switch_event, delta);
|
lat_sched_out(out_atoms, switch_event, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1053,8 +1053,8 @@ latency_wakeup_event(struct trace_wakeup_event *wakeup_event,
|
||||||
u64 timestamp,
|
u64 timestamp,
|
||||||
struct thread *thread __used)
|
struct thread *thread __used)
|
||||||
{
|
{
|
||||||
struct thread_latency *lat;
|
struct task_atoms *atoms;
|
||||||
struct lat_snapshot *snapshot;
|
struct work_atom *snapshot;
|
||||||
struct thread *wakee;
|
struct thread *wakee;
|
||||||
|
|
||||||
/* Note for later, it may be interesting to observe the failing cases */
|
/* Note for later, it may be interesting to observe the failing cases */
|
||||||
|
@ -1062,16 +1062,16 @@ latency_wakeup_event(struct trace_wakeup_event *wakeup_event,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wakee = threads__findnew(wakeup_event->pid, &threads, &last_match);
|
wakee = threads__findnew(wakeup_event->pid, &threads, &last_match);
|
||||||
lat = thread_latency_search(&lat_snapshot_root, wakee);
|
atoms = thread_atom_list_search(&lat_snapshot_root, wakee);
|
||||||
if (!lat) {
|
if (!atoms) {
|
||||||
thread_latency_insert(wakee);
|
thread_atom_list_insert(wakee);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_empty(&lat->snapshot_list))
|
if (list_empty(&atoms->snapshot_list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
snapshot = list_entry(lat->snapshot_list.prev, struct lat_snapshot,
|
snapshot = list_entry(atoms->snapshot_list.prev, struct work_atom,
|
||||||
list);
|
list);
|
||||||
|
|
||||||
if (snapshot->state != THREAD_SLEEPING)
|
if (snapshot->state != THREAD_SLEEPING)
|
||||||
|
@ -1090,9 +1090,9 @@ static struct trace_sched_handler lat_ops = {
|
||||||
static u64 all_runtime;
|
static u64 all_runtime;
|
||||||
static u64 all_count;
|
static u64 all_count;
|
||||||
|
|
||||||
static void output_lat_thread(struct thread_latency *lat)
|
static void output_lat_thread(struct task_atoms *atom_list)
|
||||||
{
|
{
|
||||||
struct lat_snapshot *shot;
|
struct work_atom *atom;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1100,15 +1100,15 @@ static void output_lat_thread(struct thread_latency *lat)
|
||||||
u64 total = 0, delta;
|
u64 total = 0, delta;
|
||||||
u64 total_runtime = 0;
|
u64 total_runtime = 0;
|
||||||
|
|
||||||
list_for_each_entry(shot, &lat->snapshot_list, list) {
|
list_for_each_entry(atom, &atom_list->snapshot_list, list) {
|
||||||
total_runtime += shot->runtime;
|
total_runtime += atom->runtime;
|
||||||
|
|
||||||
if (shot->state != THREAD_SCHED_IN)
|
if (atom->state != THREAD_SCHED_IN)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
delta = shot->sched_in_time - shot->wake_up_time;
|
delta = atom->sched_in_time - atom->wake_up_time;
|
||||||
if (delta > max)
|
if (delta > max)
|
||||||
max = delta;
|
max = delta;
|
||||||
total += delta;
|
total += delta;
|
||||||
|
@ -1120,7 +1120,7 @@ static void output_lat_thread(struct thread_latency *lat)
|
||||||
if (!count)
|
if (!count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ret = printf(" %s ", lat->thread->comm);
|
ret = printf(" %s ", atom_list->thread->comm);
|
||||||
|
|
||||||
for (i = 0; i < 19 - ret; i++)
|
for (i = 0; i < 19 - ret; i++)
|
||||||
printf(" ");
|
printf(" ");
|
||||||
|
@ -1145,10 +1145,10 @@ static void __cmd_lat(void)
|
||||||
next = rb_first(&lat_snapshot_root);
|
next = rb_first(&lat_snapshot_root);
|
||||||
|
|
||||||
while (next) {
|
while (next) {
|
||||||
struct thread_latency *lat;
|
struct task_atoms *atom_list;
|
||||||
|
|
||||||
lat = rb_entry(next, struct thread_latency, node);
|
atom_list = rb_entry(next, struct task_atoms, node);
|
||||||
output_lat_thread(lat);
|
output_lat_thread(atom_list);
|
||||||
next = rb_next(next);
|
next = rb_next(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче