aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-top.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2012-01-19 11:08:15 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-01-24 16:47:37 -0500
commit0d37aa34f8806bb443dd3c8621fd9bdbb50c58bb (patch)
tree3e245385cdb75fec299f5e145243f062b70fd652 /tools/perf/builtin-top.c
parent9ae7d3351aac238eef9646479693105688fd9cc9 (diff)
perf tools: Introduce per user view
The new --uid command line option will show only the tasks for a given user, using the proc interface to figure out the existing tasks. Kernel work is needed to close races at startup, but this should already be useful in many use cases. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-bdnspm000gw2l984a2t53o8z@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-top.c')
-rw-r--r--tools/perf/builtin-top.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 8f80df896038..e8b033c074f9 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -64,7 +64,6 @@
64#include <linux/unistd.h> 64#include <linux/unistd.h>
65#include <linux/types.h> 65#include <linux/types.h>
66 66
67
68void get_term_dimensions(struct winsize *ws) 67void get_term_dimensions(struct winsize *ws)
69{ 68{
70 char *s = getenv("LINES"); 69 char *s = getenv("LINES");
@@ -537,10 +536,20 @@ static void perf_top__sort_new_samples(void *arg)
537 536
538static void *display_thread_tui(void *arg) 537static void *display_thread_tui(void *arg)
539{ 538{
539 struct perf_evsel *pos;
540 struct perf_top *top = arg; 540 struct perf_top *top = arg;
541 const char *help = "For a higher level overview, try: perf top --sort comm,dso"; 541 const char *help = "For a higher level overview, try: perf top --sort comm,dso";
542 542
543 perf_top__sort_new_samples(top); 543 perf_top__sort_new_samples(top);
544
545 /*
546 * Initialize the uid_filter_str, in the future the TUI will allow
547 * Zooming in/out UIDs. For now juse use whatever the user passed
548 * via --uid.
549 */
550 list_for_each_entry(pos, &top->evlist->entries, node)
551 pos->hists.uid_filter_str = top->uid_str;
552
544 perf_evlist__tui_browse_hists(top->evlist, help, 553 perf_evlist__tui_browse_hists(top->evlist, help,
545 perf_top__sort_new_samples, 554 perf_top__sort_new_samples,
546 top, top->delay_secs); 555 top, top->delay_secs);
@@ -949,7 +958,7 @@ static int __cmd_top(struct perf_top *top)
949 if (ret) 958 if (ret)
950 goto out_delete; 959 goto out_delete;
951 960
952 if (top->target_tid != -1) 961 if (top->target_tid != -1 || top->uid != UINT_MAX)
953 perf_event__synthesize_thread_map(&top->tool, top->evlist->threads, 962 perf_event__synthesize_thread_map(&top->tool, top->evlist->threads,
954 perf_event__process, 963 perf_event__process,
955 &top->session->host_machine); 964 &top->session->host_machine);
@@ -1089,6 +1098,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
1089 .delay_secs = 2, 1098 .delay_secs = 2,
1090 .target_pid = -1, 1099 .target_pid = -1,
1091 .target_tid = -1, 1100 .target_tid = -1,
1101 .uid = UINT_MAX,
1092 .freq = 1000, /* 1 KHz */ 1102 .freq = 1000, /* 1 KHz */
1093 .sample_id_all_avail = true, 1103 .sample_id_all_avail = true,
1094 .mmap_pages = 128, 1104 .mmap_pages = 128,
@@ -1162,6 +1172,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
1162 "Display raw encoding of assembly instructions (default)"), 1172 "Display raw encoding of assembly instructions (default)"),
1163 OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style", 1173 OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style",
1164 "Specify disassembler style (e.g. -M intel for intel syntax)"), 1174 "Specify disassembler style (e.g. -M intel for intel syntax)"),
1175 OPT_STRING('u', "uid", &top.uid_str, "user", "user to profile"),
1165 OPT_END() 1176 OPT_END()
1166 }; 1177 };
1167 1178
@@ -1187,6 +1198,10 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
1187 1198
1188 setup_browser(false); 1199 setup_browser(false);
1189 1200
1201 top.uid = parse_target_uid(top.uid_str, top.target_tid, top.target_pid);
1202 if (top.uid_str != NULL && top.uid == UINT_MAX - 1)
1203 goto out_delete_evlist;
1204
1190 /* CPU and PID are mutually exclusive */ 1205 /* CPU and PID are mutually exclusive */
1191 if (top.target_tid > 0 && top.cpu_list) { 1206 if (top.target_tid > 0 && top.cpu_list) {
1192 printf("WARNING: PID switch overriding CPU\n"); 1207 printf("WARNING: PID switch overriding CPU\n");
@@ -1198,7 +1213,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
1198 top.target_tid = top.target_pid; 1213 top.target_tid = top.target_pid;
1199 1214
1200 if (perf_evlist__create_maps(top.evlist, top.target_pid, 1215 if (perf_evlist__create_maps(top.evlist, top.target_pid,
1201 top.target_tid, top.cpu_list) < 0) 1216 top.target_tid, top.uid, top.cpu_list) < 0)
1202 usage_with_options(top_usage, options); 1217 usage_with_options(top_usage, options);
1203 1218
1204 if (!top.evlist->nr_entries && 1219 if (!top.evlist->nr_entries &&
@@ -1262,6 +1277,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __used)
1262 1277
1263 status = __cmd_top(&top); 1278 status = __cmd_top(&top);
1264 1279
1280out_delete_evlist:
1265 perf_evlist__delete(top.evlist); 1281 perf_evlist__delete(top.evlist);
1266 1282
1267 return status; 1283 return status;