aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/thread_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/thread_map.c')
-rw-r--r--tools/perf/util/thread_map.c27
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
95struct thread_map *thread_map__new_by_uid(uid_t uid) 95static 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
181struct thread_map *thread_map__new_all_cpus(void)
182{
183 return __thread_map__new_all_cpus(UINT_MAX);
184}
185
186struct thread_map *thread_map__new_by_uid(uid_t uid)
187{
188 return __thread_map__new_all_cpus(uid);
189}
190
181struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid) 191struct 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
315struct thread_map *thread_map__new_str(const char *pid, const char *tid, 325struct 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