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 | |
| 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')
| -rw-r--r-- | tools/perf/util/thread.c | 32 | ||||
| -rw-r--r-- | tools/perf/util/thread.h | 3 |
2 files changed, 7 insertions, 28 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 8bd5ca2d2f2..3b56aebb1f4 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); |
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 75bc843950c..845d9b62f96 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h | |||
| @@ -18,9 +18,6 @@ int thread__set_comm(struct thread *self, const char *comm); | |||
| 18 | struct thread * | 18 | struct thread * |
| 19 | threads__findnew(pid_t pid, struct rb_root *threads, struct thread **last_match); | 19 | threads__findnew(pid_t pid, struct rb_root *threads, struct thread **last_match); |
| 20 | struct thread * | 20 | struct thread * |
| 21 | threads__findnew_nocomm(pid_t pid, struct rb_root *threads, | ||
| 22 | struct thread **last_match); | ||
| 23 | struct thread * | ||
| 24 | register_idle_thread(struct rb_root *threads, struct thread **last_match); | 21 | register_idle_thread(struct rb_root *threads, struct thread **last_match); |
| 25 | void thread__insert_map(struct thread *self, struct map *map); | 22 | void thread__insert_map(struct thread *self, struct map *map); |
| 26 | int thread__fork(struct thread *self, struct thread *parent); | 23 | int thread__fork(struct thread *self, struct thread *parent); |
