diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-10-08 15:04:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-10-08 15:10:21 -0400 |
commit | 97ea1a7fa62af0d8d49a0fc12796b0073537c9d8 (patch) | |
tree | 3be620dc044bd978e71b1bdd997d8e38a3c9b2a8 /tools/perf/util/thread.c | |
parent | 2e538c4a1847291cf01218d4fe7bb4dc60fef7cf (diff) |
perf tools: Fix thread comm resolution in perf sched
This reverts commit 9a92b479b2f088ee2d3194243f4c8e59b1b8c9c2 ("perf
tools: Improve thread comm resolution in perf sched") and fixes the
real bug.
The bug was elsewhere:
We are failing to resolve thread names in perf sched because the
table of threads we are building, on top of comm events, has a per
process granularity. But perf sched, unlike the other perf tools,
needs a per thread granularity as we are profiling every tasks
individually.
So fix it by building our threads table using the tid instead of
the pid as the thread identifier.
v2: Revert the previous fix - it is not really needed
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1255028657-11158-1-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util/thread.c')
-rw-r--r-- | tools/perf/util/thread.c | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 8bd5ca2d2f28..3b56aebb1f4b 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c | |||
@@ -6,17 +6,15 @@ | |||
6 | #include "util.h" | 6 | #include "util.h" |
7 | #include "debug.h" | 7 | #include "debug.h" |
8 | 8 | ||
9 | static struct thread *thread__new(pid_t pid, int set_comm) | 9 | static struct thread *thread__new(pid_t pid) |
10 | { | 10 | { |
11 | struct thread *self = calloc(1, sizeof(*self)); | 11 | struct thread *self = calloc(1, sizeof(*self)); |
12 | 12 | ||
13 | if (self != NULL) { | 13 | if (self != NULL) { |
14 | self->pid = pid; | 14 | self->pid = pid; |
15 | if (set_comm) { | 15 | self->comm = malloc(32); |
16 | self->comm = malloc(32); | 16 | if (self->comm) |
17 | if (self->comm) | 17 | snprintf(self->comm, 32, ":%d", self->pid); |
18 | snprintf(self->comm, 32, ":%d", self->pid); | ||
19 | } | ||
20 | self->maps = RB_ROOT; | 18 | self->maps = RB_ROOT; |
21 | INIT_LIST_HEAD(&self->removed_maps); | 19 | INIT_LIST_HEAD(&self->removed_maps); |
22 | } | 20 | } |
@@ -52,10 +50,8 @@ static size_t thread__fprintf(struct thread *self, FILE *fp) | |||
52 | return ret; | 50 | return ret; |
53 | } | 51 | } |
54 | 52 | ||
55 | static struct thread * | 53 | struct thread * |
56 | __threads__findnew(pid_t pid, struct rb_root *threads, | 54 | threads__findnew(pid_t pid, struct rb_root *threads, struct thread **last_match) |
57 | struct thread **last_match, | ||
58 | int set_comm) | ||
59 | { | 55 | { |
60 | struct rb_node **p = &threads->rb_node; | 56 | struct rb_node **p = &threads->rb_node; |
61 | struct rb_node *parent = NULL; | 57 | struct rb_node *parent = NULL; |
@@ -84,8 +80,7 @@ __threads__findnew(pid_t pid, struct rb_root *threads, | |||
84 | p = &(*p)->rb_right; | 80 | p = &(*p)->rb_right; |
85 | } | 81 | } |
86 | 82 | ||
87 | th = thread__new(pid, set_comm); | 83 | th = thread__new(pid); |
88 | |||
89 | if (th != NULL) { | 84 | if (th != NULL) { |
90 | rb_link_node(&th->rb_node, parent, p); | 85 | rb_link_node(&th->rb_node, parent, p); |
91 | rb_insert_color(&th->rb_node, threads); | 86 | rb_insert_color(&th->rb_node, threads); |
@@ -96,19 +91,6 @@ __threads__findnew(pid_t pid, struct rb_root *threads, | |||
96 | } | 91 | } |
97 | 92 | ||
98 | struct thread * | 93 | struct thread * |
99 | threads__findnew(pid_t pid, struct rb_root *threads, struct thread **last_match) | ||
100 | { | ||
101 | return __threads__findnew(pid, threads, last_match, 1); | ||
102 | } | ||
103 | |||
104 | struct thread * | ||
105 | threads__findnew_nocomm(pid_t pid, struct rb_root *threads, | ||
106 | struct thread **last_match) | ||
107 | { | ||
108 | return __threads__findnew(pid, threads, last_match, 0); | ||
109 | } | ||
110 | |||
111 | struct thread * | ||
112 | register_idle_thread(struct rb_root *threads, struct thread **last_match) | 94 | register_idle_thread(struct rb_root *threads, struct thread **last_match) |
113 | { | 95 | { |
114 | struct thread *thread = threads__findnew(0, threads, last_match); | 96 | struct thread *thread = threads__findnew(0, threads, last_match); |