diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-12-01 09:44:30 -0500 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-12-05 08:24:32 -0500 |
| commit | 8d3cd4c3d3ab5f4f9edd5c593b7743f7fbd3526d (patch) | |
| tree | 9998d115faf80cc0cd0c29e7a6dd3bc31cba7d34 | |
| parent | b984aff7811bbac75b3f05931643d815067cf45c (diff) | |
perf thread_map: Add method to map all threads in the system
Reusing the thread_map__new_by_uid() proc scanning already in place to
return a map with all threads in the system.
Based-on-a-patch-by: Jin Yao <yao.jin@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/n/tip-khh28q0wwqbqtrk32bfe07hd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/util/thread_map.c | 22 | ||||
| -rw-r--r-- | tools/perf/util/thread_map.h | 1 |
2 files changed, 17 insertions, 6 deletions
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c index be0d5a736dea..2b653853eec2 100644 --- a/tools/perf/util/thread_map.c +++ b/tools/perf/util/thread_map.c | |||
| @@ -92,7 +92,7 @@ struct thread_map *thread_map__new_by_tid(pid_t tid) | |||
| 92 | return threads; | 92 | return threads; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | struct thread_map *thread_map__new_by_uid(uid_t uid) | 95 | static struct thread_map *__thread_map__new_all_cpus(uid_t uid) |
| 96 | { | 96 | { |
| 97 | DIR *proc; | 97 | DIR *proc; |
| 98 | int max_threads = 32, items, i; | 98 | int max_threads = 32, items, i; |
| @@ -113,7 +113,6 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) | |||
| 113 | while ((dirent = readdir(proc)) != NULL) { | 113 | while ((dirent = readdir(proc)) != NULL) { |
| 114 | char *end; | 114 | char *end; |
| 115 | bool grow = false; | 115 | bool grow = false; |
| 116 | struct stat st; | ||
| 117 | pid_t pid = strtol(dirent->d_name, &end, 10); | 116 | pid_t pid = strtol(dirent->d_name, &end, 10); |
| 118 | 117 | ||
| 119 | if (*end) /* only interested in proper numerical dirents */ | 118 | if (*end) /* only interested in proper numerical dirents */ |
| @@ -121,11 +120,12 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) | |||
| 121 | 120 | ||
| 122 | snprintf(path, sizeof(path), "/proc/%s", dirent->d_name); | 121 | snprintf(path, sizeof(path), "/proc/%s", dirent->d_name); |
| 123 | 122 | ||
| 124 | if (stat(path, &st) != 0) | 123 | if (uid != UINT_MAX) { |
| 125 | continue; | 124 | struct stat st; |
| 126 | 125 | ||
| 127 | if (st.st_uid != uid) | 126 | if (stat(path, &st) != 0 || st.st_uid != uid) |
| 128 | continue; | 127 | continue; |
| 128 | } | ||
| 129 | 129 | ||
| 130 | snprintf(path, sizeof(path), "/proc/%d/task", pid); | 130 | snprintf(path, sizeof(path), "/proc/%d/task", pid); |
| 131 | items = scandir(path, &namelist, filter, NULL); | 131 | items = scandir(path, &namelist, filter, NULL); |
| @@ -178,6 +178,16 @@ out_free_closedir: | |||
| 178 | goto out_closedir; | 178 | goto out_closedir; |
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | struct thread_map *thread_map__new_all_cpus(void) | ||
| 182 | { | ||
| 183 | return __thread_map__new_all_cpus(UINT_MAX); | ||
| 184 | } | ||
| 185 | |||
| 186 | struct thread_map *thread_map__new_by_uid(uid_t uid) | ||
| 187 | { | ||
| 188 | return __thread_map__new_all_cpus(uid); | ||
| 189 | } | ||
| 190 | |||
| 181 | struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid) | 191 | struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid) |
| 182 | { | 192 | { |
| 183 | if (pid != -1) | 193 | if (pid != -1) |
diff --git a/tools/perf/util/thread_map.h b/tools/perf/util/thread_map.h index f15803985435..07a765fb22bb 100644 --- a/tools/perf/util/thread_map.h +++ b/tools/perf/util/thread_map.h | |||
| @@ -23,6 +23,7 @@ struct thread_map *thread_map__new_dummy(void); | |||
| 23 | struct thread_map *thread_map__new_by_pid(pid_t pid); | 23 | struct thread_map *thread_map__new_by_pid(pid_t pid); |
| 24 | struct thread_map *thread_map__new_by_tid(pid_t tid); | 24 | struct thread_map *thread_map__new_by_tid(pid_t tid); |
| 25 | struct thread_map *thread_map__new_by_uid(uid_t uid); | 25 | struct thread_map *thread_map__new_by_uid(uid_t uid); |
| 26 | struct thread_map *thread_map__new_all_cpus(void); | ||
| 26 | struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid); | 27 | struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid); |
| 27 | struct thread_map *thread_map__new_event(struct thread_map_event *event); | 28 | struct thread_map *thread_map__new_event(struct thread_map_event *event); |
| 28 | 29 | ||
