* [PATCH 0/3] perf: working with multithreaded processes with named threads
@ 2011-12-22 18:30 David Ahern
2011-12-22 18:30 ` [PATCH 1/3] perf: fix comm for " David Ahern
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: David Ahern @ 2011-12-22 18:30 UTC (permalink / raw)
To: acme, linux-kernel; +Cc: mingo, peterz, fweisbec, David Ahern
One bug fix plus a couple of enhancements to improve handling of
named threads.
David Ahern (3):
perf: fix comm for processes with named threads
perf: look up thread names for system wide profiling
perf script: look up thread using tid instead of pid
tools/perf/builtin-script.c | 2 +-
tools/perf/util/event.c | 112 ++++++++++++++++++++++++++++++++----------
2 files changed, 86 insertions(+), 28 deletions(-)
--
1.7.7.4
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/3] perf: fix comm for processes with named threads 2011-12-22 18:30 [PATCH 0/3] perf: working with multithreaded processes with named threads David Ahern @ 2011-12-22 18:30 ` David Ahern 2011-12-29 20:46 ` [tip:perf/core] perf tools: Fix " tip-bot for David Ahern 2011-12-22 18:30 ` [PATCH 2/3 v2] perf: look up thread names for system wide profiling David Ahern 2011-12-22 18:30 ` [PATCH 3/3] perf script: look up thread using tid instead of pid David Ahern 2 siblings, 1 reply; 7+ messages in thread From: David Ahern @ 2011-12-22 18:30 UTC (permalink / raw) To: acme, linux-kernel; +Cc: mingo, peterz, fweisbec, David Ahern perf does not properly handle monitoring of processes with named threads. For example: $ ps -C myapp -L PID LWP TTY TIME CMD 25118 25118 ? 00:00:00 myapp 25118 25119 ? 00:00:00 myapp:worker perf record -e cs -c 1 -fo /tmp/perf.data -p 25118 -- sleep 10 perf report --stdio -i /tmp/perf.data 100.00% myapp:worker [kernel.kallsyms] [k] perf_event_task_sched_out The process name is set to the name of the last thread it finds for the process. The Problem: perf-top and perf-record both create a thread_map of threads to be monitored. That map is used in perf_event__synthesize_thread_map which loops over the entries in thread_map and calls __event__synthesize_thread to generate COMM and MMAP events. __event__synthesize_thread calls perf_event__synthesize_comm which opens /proc/pid/status, reads the name of the task and its thread group id. That's all fine. The problem is that it then reads /proc/pid/task and generates COMM events for each task it finds - but using the name found in /proc/pid/status where pid is the thread of interest. The end result (looping over thread_map + synthesizing comm events for each thread each time) means the name of the last thread processed sets the name for all threads in the process - which is not good for multithreaded processes with named threads. The Fix: perf_event__synthesize_comm has an input argument (full) that decides whether to process task entries for each pid it is passed. It currently never set to 0 (perf_event__synthesize_comm has a single caller and it always passes the value 1). Let's fix that. Add the full input argument to __event__synthesize_thread which passes it to perf_event__synthesize_comm. For thread/process monitoring set full to 0 which means COMM and MMAP events are only generated for the pid passed to it. For system wide monitoring set full to 1 so that COMM events are generated for all threads in a process. Signed-off-by: David Ahern <dsahern@gmail.com> --- tools/perf/util/event.c | 37 ++++++++++++++++++++++++++++++++----- 1 files changed, 32 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index b7c7f39..a578726 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -261,11 +261,12 @@ int perf_event__synthesize_modules(struct perf_tool *tool, static int __event__synthesize_thread(union perf_event *comm_event, union perf_event *mmap_event, - pid_t pid, perf_event__handler_t process, + pid_t pid, int full, + perf_event__handler_t process, struct perf_tool *tool, struct machine *machine) { - pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, 1, + pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, full, process, machine); if (tgid == -1) return -1; @@ -279,7 +280,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, struct machine *machine) { union perf_event *comm_event, *mmap_event; - int err = -1, thread; + int err = -1, thread, j; comm_event = malloc(sizeof(comm_event->comm) + machine->id_hdr_size); if (comm_event == NULL) @@ -292,11 +293,37 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, err = 0; for (thread = 0; thread < threads->nr; ++thread) { if (__event__synthesize_thread(comm_event, mmap_event, - threads->map[thread], + threads->map[thread], 0, process, tool, machine)) { err = -1; break; } + + /* + * comm.pid is set to thread group id by + * perf_event__synthesize_comm + */ + if ((int) comm_event->comm.pid != threads->map[thread]) { + bool need_leader = true; + + /* is thread group leader in thread_map? */ + for (j = 0; j < threads->nr; ++j) { + if ((int) comm_event->comm.pid == threads->map[j]) { + need_leader = false; + break; + } + } + + /* if not, generate events for it */ + if (need_leader && + __event__synthesize_thread(comm_event, + mmap_event, + comm_event->comm.pid, 0, + process, tool, machine)) { + err = -1; + break; + } + } } free(mmap_event); out_free_comm: @@ -333,7 +360,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, if (*end) /* only interested in proper numerical dirents */ continue; - __event__synthesize_thread(comm_event, mmap_event, pid, + __event__synthesize_thread(comm_event, mmap_event, pid, 1, process, tool, machine); } -- 1.7.7.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:perf/core] perf tools: Fix comm for processes with named threads 2011-12-22 18:30 ` [PATCH 1/3] perf: fix comm for " David Ahern @ 2011-12-29 20:46 ` tip-bot for David Ahern 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for David Ahern @ 2011-12-29 20:46 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, hpa, mingo, peterz, fweisbec, dsahern, tglx, mingo Commit-ID: defd8d38773cf9e01c69a903d04d5895b78ee74f Gitweb: http://git.kernel.org/tip/defd8d38773cf9e01c69a903d04d5895b78ee74f Author: David Ahern <dsahern@gmail.com> AuthorDate: Thu, 22 Dec 2011 11:30:01 -0700 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 23 Dec 2011 16:10:40 -0200 perf tools: Fix comm for processes with named threads perf does not properly handle monitoring of processes with named threads. For example: $ ps -C myapp -L PID LWP TTY TIME CMD 25118 25118 ? 00:00:00 myapp 25118 25119 ? 00:00:00 myapp:worker perf record -e cs -c 1 -fo /tmp/perf.data -p 25118 -- sleep 10 perf report --stdio -i /tmp/perf.data 100.00% myapp:worker [kernel.kallsyms] [k] perf_event_task_sched_out The process name is set to the name of the last thread it finds for the process. The Problem: perf-top and perf-record both create a thread_map of threads to be monitored. That map is used in perf_event__synthesize_thread_map which loops over the entries in thread_map and calls __event__synthesize_thread to generate COMM and MMAP events. __event__synthesize_thread calls perf_event__synthesize_comm which opens /proc/pid/status, reads the name of the task and its thread group id. That's all fine. The problem is that it then reads /proc/pid/task and generates COMM events for each task it finds - but using the name found in /proc/pid/status where pid is the thread of interest. The end result (looping over thread_map + synthesizing comm events for each thread each time) means the name of the last thread processed sets the name for all threads in the process - which is not good for multithreaded processes with named threads. The Fix: perf_event__synthesize_comm has an input argument (full) that decides whether to process task entries for each pid it is passed. It currently never set to 0 (perf_event__synthesize_comm has a single caller and it always passes the value 1). Let's fix that. Add the full input argument to __event__synthesize_thread which passes it to perf_event__synthesize_comm. For thread/process monitoring set full to 0 which means COMM and MMAP events are only generated for the pid passed to it. For system wide monitoring set full to 1 so that COMM events are generated for all threads in a process. Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1324578603-12762-2-git-send-email-dsahern@gmail.com Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/event.c | 37 ++++++++++++++++++++++++++++++++----- 1 files changed, 32 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index b7c7f39..a578726 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -261,11 +261,12 @@ int perf_event__synthesize_modules(struct perf_tool *tool, static int __event__synthesize_thread(union perf_event *comm_event, union perf_event *mmap_event, - pid_t pid, perf_event__handler_t process, + pid_t pid, int full, + perf_event__handler_t process, struct perf_tool *tool, struct machine *machine) { - pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, 1, + pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, full, process, machine); if (tgid == -1) return -1; @@ -279,7 +280,7 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, struct machine *machine) { union perf_event *comm_event, *mmap_event; - int err = -1, thread; + int err = -1, thread, j; comm_event = malloc(sizeof(comm_event->comm) + machine->id_hdr_size); if (comm_event == NULL) @@ -292,11 +293,37 @@ int perf_event__synthesize_thread_map(struct perf_tool *tool, err = 0; for (thread = 0; thread < threads->nr; ++thread) { if (__event__synthesize_thread(comm_event, mmap_event, - threads->map[thread], + threads->map[thread], 0, process, tool, machine)) { err = -1; break; } + + /* + * comm.pid is set to thread group id by + * perf_event__synthesize_comm + */ + if ((int) comm_event->comm.pid != threads->map[thread]) { + bool need_leader = true; + + /* is thread group leader in thread_map? */ + for (j = 0; j < threads->nr; ++j) { + if ((int) comm_event->comm.pid == threads->map[j]) { + need_leader = false; + break; + } + } + + /* if not, generate events for it */ + if (need_leader && + __event__synthesize_thread(comm_event, + mmap_event, + comm_event->comm.pid, 0, + process, tool, machine)) { + err = -1; + break; + } + } } free(mmap_event); out_free_comm: @@ -333,7 +360,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, if (*end) /* only interested in proper numerical dirents */ continue; - __event__synthesize_thread(comm_event, mmap_event, pid, + __event__synthesize_thread(comm_event, mmap_event, pid, 1, process, tool, machine); } ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/3 v2] perf: look up thread names for system wide profiling 2011-12-22 18:30 [PATCH 0/3] perf: working with multithreaded processes with named threads David Ahern 2011-12-22 18:30 ` [PATCH 1/3] perf: fix comm for " David Ahern @ 2011-12-22 18:30 ` David Ahern 2011-12-29 20:47 ` [tip:perf/core] perf tools: Look " tip-bot for David Ahern 2011-12-22 18:30 ` [PATCH 3/3] perf script: look up thread using tid instead of pid David Ahern 2 siblings, 1 reply; 7+ messages in thread From: David Ahern @ 2011-12-22 18:30 UTC (permalink / raw) To: acme, linux-kernel; +Cc: mingo, peterz, fweisbec, David Ahern This handles multithreaded processes with named threads when doing system wide profiling: the comm for each thread is looked up allowing them to be different from the thread group leader. v2: - fixed sizeof arg to perf_event__get_comm_tgid Signed-off-by: David Ahern <dsahern@gmail.com> --- tools/perf/util/event.c | 75 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 53 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index a578726..73ddaf0 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -43,37 +43,27 @@ static struct perf_sample synth_sample = { .period = 1, }; -static pid_t perf_event__synthesize_comm(struct perf_tool *tool, - union perf_event *event, pid_t pid, - int full, perf_event__handler_t process, - struct machine *machine) +static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len) { char filename[PATH_MAX]; char bf[BUFSIZ]; FILE *fp; size_t size = 0; - DIR *tasks; - struct dirent dirent, *next; - pid_t tgid = 0; + pid_t tgid = -1; snprintf(filename, sizeof(filename), "/proc/%d/status", pid); fp = fopen(filename, "r"); if (fp == NULL) { -out_race: - /* - * We raced with a task exiting - just return: - */ pr_debug("couldn't open %s\n", filename); return 0; } - memset(&event->comm, 0, sizeof(event->comm)); - - while (!event->comm.comm[0] || !event->comm.pid) { + while (!comm[0] || (tgid < 0)) { if (fgets(bf, sizeof(bf), fp) == NULL) { - pr_warning("couldn't get COMM and pgid, malformed %s\n", filename); - goto out; + pr_warning("couldn't get COMM and pgid, malformed %s\n", + filename); + break; } if (memcmp(bf, "Name:", 5) == 0) { @@ -81,16 +71,46 @@ out_race: while (*name && isspace(*name)) ++name; size = strlen(name) - 1; - memcpy(event->comm.comm, name, size++); + if (size >= len) + size = len - 1; + memcpy(comm, name, size); + } else if (memcmp(bf, "Tgid:", 5) == 0) { char *tgids = bf + 5; while (*tgids && isspace(*tgids)) ++tgids; - tgid = event->comm.pid = atoi(tgids); + tgid = atoi(tgids); } } + fclose(fp); + + return tgid; +} + +static pid_t perf_event__synthesize_comm(struct perf_tool *tool, + union perf_event *event, pid_t pid, + int full, + perf_event__handler_t process, + struct machine *machine) +{ + char filename[PATH_MAX]; + size_t size; + DIR *tasks; + struct dirent dirent, *next; + pid_t tgid; + + memset(&event->comm, 0, sizeof(event->comm)); + + tgid = perf_event__get_comm_tgid(pid, event->comm.comm, + sizeof(event->comm.comm)); + if (tgid < 0) + goto out; + + event->comm.pid = tgid; event->comm.header.type = PERF_RECORD_COMM; + + size = strlen(event->comm.comm) + 1; size = ALIGN(size, sizeof(u64)); memset(event->comm.comm + size, 0, machine->id_hdr_size); event->comm.header.size = (sizeof(event->comm) - @@ -106,8 +126,10 @@ out_race: snprintf(filename, sizeof(filename), "/proc/%d/task", pid); tasks = opendir(filename); - if (tasks == NULL) - goto out_race; + if (tasks == NULL) { + pr_debug("couldn't open %s\n", filename); + return 0; + } while (!readdir_r(tasks, &dirent, &next) && next) { char *end; @@ -115,6 +137,17 @@ out_race: if (*end) continue; + /* already have tgid; jut want to update the comm */ + (void) perf_event__get_comm_tgid(pid, event->comm.comm, + sizeof(event->comm.comm)); + + size = strlen(event->comm.comm) + 1; + size = ALIGN(size, sizeof(u64)); + memset(event->comm.comm + size, 0, machine->id_hdr_size); + event->comm.header.size = (sizeof(event->comm) - + (sizeof(event->comm.comm) - size) + + machine->id_hdr_size); + event->comm.tid = pid; process(tool, event, &synth_sample, machine); @@ -122,8 +155,6 @@ out_race: closedir(tasks); out: - fclose(fp); - return tgid; } -- 1.7.7.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:perf/core] perf tools: Look up thread names for system wide profiling 2011-12-22 18:30 ` [PATCH 2/3 v2] perf: look up thread names for system wide profiling David Ahern @ 2011-12-29 20:47 ` tip-bot for David Ahern 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for David Ahern @ 2011-12-29 20:47 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, hpa, mingo, peterz, fweisbec, dsahern, tglx, mingo Commit-ID: f5faf726184a6a5ca1735f610cb97e509fce33e2 Gitweb: http://git.kernel.org/tip/f5faf726184a6a5ca1735f610cb97e509fce33e2 Author: David Ahern <dsahern@gmail.com> AuthorDate: Thu, 22 Dec 2011 11:30:02 -0700 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 23 Dec 2011 16:33:57 -0200 perf tools: Look up thread names for system wide profiling This handles multithreaded processes with named threads when doing system wide profiling: the comm for each thread is looked up allowing them to be different from the thread group leader. v2: - fixed sizeof arg to perf_event__get_comm_tgid Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1324578603-12762-3-git-send-email-dsahern@gmail.com Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/event.c | 75 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 53 insertions(+), 22 deletions(-) diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index a578726..73ddaf0 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -43,37 +43,27 @@ static struct perf_sample synth_sample = { .period = 1, }; -static pid_t perf_event__synthesize_comm(struct perf_tool *tool, - union perf_event *event, pid_t pid, - int full, perf_event__handler_t process, - struct machine *machine) +static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len) { char filename[PATH_MAX]; char bf[BUFSIZ]; FILE *fp; size_t size = 0; - DIR *tasks; - struct dirent dirent, *next; - pid_t tgid = 0; + pid_t tgid = -1; snprintf(filename, sizeof(filename), "/proc/%d/status", pid); fp = fopen(filename, "r"); if (fp == NULL) { -out_race: - /* - * We raced with a task exiting - just return: - */ pr_debug("couldn't open %s\n", filename); return 0; } - memset(&event->comm, 0, sizeof(event->comm)); - - while (!event->comm.comm[0] || !event->comm.pid) { + while (!comm[0] || (tgid < 0)) { if (fgets(bf, sizeof(bf), fp) == NULL) { - pr_warning("couldn't get COMM and pgid, malformed %s\n", filename); - goto out; + pr_warning("couldn't get COMM and pgid, malformed %s\n", + filename); + break; } if (memcmp(bf, "Name:", 5) == 0) { @@ -81,16 +71,46 @@ out_race: while (*name && isspace(*name)) ++name; size = strlen(name) - 1; - memcpy(event->comm.comm, name, size++); + if (size >= len) + size = len - 1; + memcpy(comm, name, size); + } else if (memcmp(bf, "Tgid:", 5) == 0) { char *tgids = bf + 5; while (*tgids && isspace(*tgids)) ++tgids; - tgid = event->comm.pid = atoi(tgids); + tgid = atoi(tgids); } } + fclose(fp); + + return tgid; +} + +static pid_t perf_event__synthesize_comm(struct perf_tool *tool, + union perf_event *event, pid_t pid, + int full, + perf_event__handler_t process, + struct machine *machine) +{ + char filename[PATH_MAX]; + size_t size; + DIR *tasks; + struct dirent dirent, *next; + pid_t tgid; + + memset(&event->comm, 0, sizeof(event->comm)); + + tgid = perf_event__get_comm_tgid(pid, event->comm.comm, + sizeof(event->comm.comm)); + if (tgid < 0) + goto out; + + event->comm.pid = tgid; event->comm.header.type = PERF_RECORD_COMM; + + size = strlen(event->comm.comm) + 1; size = ALIGN(size, sizeof(u64)); memset(event->comm.comm + size, 0, machine->id_hdr_size); event->comm.header.size = (sizeof(event->comm) - @@ -106,8 +126,10 @@ out_race: snprintf(filename, sizeof(filename), "/proc/%d/task", pid); tasks = opendir(filename); - if (tasks == NULL) - goto out_race; + if (tasks == NULL) { + pr_debug("couldn't open %s\n", filename); + return 0; + } while (!readdir_r(tasks, &dirent, &next) && next) { char *end; @@ -115,6 +137,17 @@ out_race: if (*end) continue; + /* already have tgid; jut want to update the comm */ + (void) perf_event__get_comm_tgid(pid, event->comm.comm, + sizeof(event->comm.comm)); + + size = strlen(event->comm.comm) + 1; + size = ALIGN(size, sizeof(u64)); + memset(event->comm.comm + size, 0, machine->id_hdr_size); + event->comm.header.size = (sizeof(event->comm) - + (sizeof(event->comm.comm) - size) + + machine->id_hdr_size); + event->comm.tid = pid; process(tool, event, &synth_sample, machine); @@ -122,8 +155,6 @@ out_race: closedir(tasks); out: - fclose(fp); - return tgid; } ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] perf script: look up thread using tid instead of pid 2011-12-22 18:30 [PATCH 0/3] perf: working with multithreaded processes with named threads David Ahern 2011-12-22 18:30 ` [PATCH 1/3] perf: fix comm for " David Ahern 2011-12-22 18:30 ` [PATCH 2/3 v2] perf: look up thread names for system wide profiling David Ahern @ 2011-12-22 18:30 ` David Ahern 2011-12-29 20:48 ` [tip:perf/core] " tip-bot for David Ahern 2 siblings, 1 reply; 7+ messages in thread From: David Ahern @ 2011-12-22 18:30 UTC (permalink / raw) To: acme, linux-kernel; +Cc: mingo, peterz, fweisbec, David Ahern This allows the thread name to be dispalyed when dumping events: myapp 25118 [000] 450385.538815: context-switches ... myapp:worker 25119 [000] 450385.538894: context-switches ... Signed-off-by: David Ahern <dsahern@gmail.com> --- tools/perf/builtin-script.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index ea71c5e..d71b745 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -443,7 +443,7 @@ static int process_sample_event(struct perf_tool *tool __used, struct machine *machine) { struct addr_location al; - struct thread *thread = machine__findnew_thread(machine, event->ip.pid); + struct thread *thread = machine__findnew_thread(machine, event->ip.tid); if (thread == NULL) { pr_debug("problem processing %d event, skipping it.\n", -- 1.7.7.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:perf/core] perf script: look up thread using tid instead of pid 2011-12-22 18:30 ` [PATCH 3/3] perf script: look up thread using tid instead of pid David Ahern @ 2011-12-29 20:48 ` tip-bot for David Ahern 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for David Ahern @ 2011-12-29 20:48 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, hpa, mingo, peterz, fweisbec, dsahern, tglx, mingo Commit-ID: 64aab93cdffb3967642ffab954395ae2400c0b06 Gitweb: http://git.kernel.org/tip/64aab93cdffb3967642ffab954395ae2400c0b06 Author: David Ahern <dsahern@gmail.com> AuthorDate: Thu, 22 Dec 2011 11:30:03 -0700 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 23 Dec 2011 16:35:00 -0200 perf script: look up thread using tid instead of pid This allows the thread name to be dispalyed when dumping events: myapp 25118 [000] 450385.538815: context-switches ... myapp:worker 25119 [000] 450385.538894: context-switches ... Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1324578603-12762-4-git-send-email-dsahern@gmail.com Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/builtin-script.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index ea71c5e..d71b745 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -443,7 +443,7 @@ static int process_sample_event(struct perf_tool *tool __used, struct machine *machine) { struct addr_location al; - struct thread *thread = machine__findnew_thread(machine, event->ip.pid); + struct thread *thread = machine__findnew_thread(machine, event->ip.tid); if (thread == NULL) { pr_debug("problem processing %d event, skipping it.\n", ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-12-29 20:48 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-12-22 18:30 [PATCH 0/3] perf: working with multithreaded processes with named threads David Ahern 2011-12-22 18:30 ` [PATCH 1/3] perf: fix comm for " David Ahern 2011-12-29 20:46 ` [tip:perf/core] perf tools: Fix " tip-bot for David Ahern 2011-12-22 18:30 ` [PATCH 2/3 v2] perf: look up thread names for system wide profiling David Ahern 2011-12-29 20:47 ` [tip:perf/core] perf tools: Look " tip-bot for David Ahern 2011-12-22 18:30 ` [PATCH 3/3] perf script: look up thread using tid instead of pid David Ahern 2011-12-29 20:48 ` [tip:perf/core] " tip-bot for David Ahern
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome