diff options
Diffstat (limited to 'tools/perf/util/thread_map.c')
-rw-r--r-- | tools/perf/util/thread_map.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c index be0d5a736dea..3e1038f6491c 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) |
@@ -313,7 +323,7 @@ out_free_threads: | |||
313 | } | 323 | } |
314 | 324 | ||
315 | struct thread_map *thread_map__new_str(const char *pid, const char *tid, | 325 | struct thread_map *thread_map__new_str(const char *pid, const char *tid, |
316 | uid_t uid) | 326 | uid_t uid, bool per_thread) |
317 | { | 327 | { |
318 | if (pid) | 328 | if (pid) |
319 | return thread_map__new_by_pid_str(pid); | 329 | return thread_map__new_by_pid_str(pid); |
@@ -321,6 +331,9 @@ struct thread_map *thread_map__new_str(const char *pid, const char *tid, | |||
321 | if (!tid && uid != UINT_MAX) | 331 | if (!tid && uid != UINT_MAX) |
322 | return thread_map__new_by_uid(uid); | 332 | return thread_map__new_by_uid(uid); |
323 | 333 | ||
334 | if (per_thread) | ||
335 | return thread_map__new_all_cpus(); | ||
336 | |||
324 | return thread_map__new_by_tid_str(tid); | 337 | return thread_map__new_by_tid_str(tid); |
325 | } | 338 | } |
326 | 339 | ||