提交 8ffcda17 编写于 作者: A Arnaldo Carvalho de Melo 提交者: Ingo Molnar

perf top: Introduce --hide_{user,kernel}_symbols

Default continues to be showing all symbols. 'K' and 'U' can be
used to toggle showing kernel and user symbols.
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.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>
LKML-Reference: <1258415125-15019-1-git-send-email-acme@infradead.org>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 3b6ed988
...@@ -76,6 +76,9 @@ static int delay_secs = 2; ...@@ -76,6 +76,9 @@ static int delay_secs = 2;
static int zero = 0; static int zero = 0;
static int dump_symtab = 0; static int dump_symtab = 0;
static bool hide_kernel_symbols = false;
static bool hide_user_symbols = false;
/* /*
* Source * Source
*/ */
...@@ -104,6 +107,7 @@ struct sym_entry { ...@@ -104,6 +107,7 @@ struct sym_entry {
unsigned long snap_count; unsigned long snap_count;
double weight; double weight;
int skip; int skip;
u8 origin;
struct map *map; struct map *map;
struct source_line *source; struct source_line *source;
struct source_line *lines; struct source_line *lines;
...@@ -430,6 +434,13 @@ static void print_sym_table(void) ...@@ -430,6 +434,13 @@ static void print_sym_table(void)
list_for_each_entry_safe_from(syme, n, &active_symbols, node) { list_for_each_entry_safe_from(syme, n, &active_symbols, node) {
syme->snap_count = syme->count[snap]; syme->snap_count = syme->count[snap];
if (syme->snap_count != 0) { if (syme->snap_count != 0) {
if ((hide_user_symbols &&
syme->origin == PERF_RECORD_MISC_USER) ||
(hide_kernel_symbols &&
syme->origin == PERF_RECORD_MISC_KERNEL)) {
list_remove_active_sym(syme);
continue;
}
syme->weight = sym_weight(syme); syme->weight = sym_weight(syme);
rb_insert_active_sym(&tmp, syme); rb_insert_active_sym(&tmp, syme);
sum_ksamples += syme->snap_count; sum_ksamples += syme->snap_count;
...@@ -637,6 +648,12 @@ static void print_mapped_keys(void) ...@@ -637,6 +648,12 @@ static void print_mapped_keys(void)
if (nr_counters > 1) if (nr_counters > 1)
fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0);
fprintf(stdout,
"\t[K] hide kernel_symbols symbols. \t(%s)\n",
hide_kernel_symbols ? "yes" : "no");
fprintf(stdout,
"\t[U] hide user symbols. \t(%s)\n",
hide_user_symbols ? "yes" : "no");
fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0);
fprintf(stdout, "\t[qQ] quit.\n"); fprintf(stdout, "\t[qQ] quit.\n");
} }
...@@ -650,6 +667,8 @@ static int key_mapped(int c) ...@@ -650,6 +667,8 @@ static int key_mapped(int c)
case 'z': case 'z':
case 'q': case 'q':
case 'Q': case 'Q':
case 'K':
case 'U':
return 1; return 1;
case 'E': case 'E':
case 'w': case 'w':
...@@ -727,6 +746,9 @@ static void handle_keypress(int c) ...@@ -727,6 +746,9 @@ static void handle_keypress(int c)
case 'F': case 'F':
prompt_percent(&sym_pcnt_filter, "Enter details display event filter (percent)"); prompt_percent(&sym_pcnt_filter, "Enter details display event filter (percent)");
break; break;
case 'K':
hide_kernel_symbols = !hide_kernel_symbols;
break;
case 'q': case 'q':
case 'Q': case 'Q':
printf("exiting.\n"); printf("exiting.\n");
...@@ -746,6 +768,9 @@ static void handle_keypress(int c) ...@@ -746,6 +768,9 @@ static void handle_keypress(int c)
pthread_mutex_unlock(&syme->source_lock); pthread_mutex_unlock(&syme->source_lock);
} }
break; break;
case 'U':
hide_user_symbols = !hide_user_symbols;
break;
case 'w': case 'w':
display_weighted = ~display_weighted; display_weighted = ~display_weighted;
break; break;
...@@ -857,11 +882,16 @@ static void event__process_sample(const event_t *self, int counter) ...@@ -857,11 +882,16 @@ static void event__process_sample(const event_t *self, int counter)
struct map *map; struct map *map;
struct sym_entry *syme; struct sym_entry *syme;
struct symbol *sym; struct symbol *sym;
u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
switch (self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK) { switch (origin) {
case PERF_RECORD_MISC_USER: { case PERF_RECORD_MISC_USER: {
struct thread *thread = threads__findnew(self->ip.pid); struct thread *thread;
if (hide_user_symbols)
return;
thread = threads__findnew(self->ip.pid);
if (thread == NULL) if (thread == NULL)
return; return;
...@@ -885,6 +915,9 @@ static void event__process_sample(const event_t *self, int counter) ...@@ -885,6 +915,9 @@ static void event__process_sample(const event_t *self, int counter)
return; return;
/* Fall thru */ /* Fall thru */
case PERF_RECORD_MISC_KERNEL: case PERF_RECORD_MISC_KERNEL:
if (hide_kernel_symbols)
return;
sym = kernel_maps__find_symbol(ip, &map); sym = kernel_maps__find_symbol(ip, &map);
if (sym == NULL) if (sym == NULL)
return; return;
...@@ -897,6 +930,7 @@ static void event__process_sample(const event_t *self, int counter) ...@@ -897,6 +930,7 @@ static void event__process_sample(const event_t *self, int counter)
if (!syme->skip) { if (!syme->skip) {
syme->count[counter]++; syme->count[counter]++;
syme->origin = origin;
record_precise_ip(syme, counter, ip); record_precise_ip(syme, counter, ip);
pthread_mutex_lock(&active_symbols_lock); pthread_mutex_lock(&active_symbols_lock);
if (list_empty(&syme->node) || !syme->node.next) if (list_empty(&syme->node) || !syme->node.next)
...@@ -1178,6 +1212,8 @@ static const struct option options[] = { ...@@ -1178,6 +1212,8 @@ static const struct option options[] = {
OPT_INTEGER('C', "CPU", &profile_cpu, OPT_INTEGER('C', "CPU", &profile_cpu,
"CPU to profile on"), "CPU to profile on"),
OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"), OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
OPT_BOOLEAN('K', "hide_kernel_symbols", &hide_kernel_symbols,
"hide kernel symbols"),
OPT_INTEGER('m', "mmap-pages", &mmap_pages, OPT_INTEGER('m', "mmap-pages", &mmap_pages,
"number of mmap data pages"), "number of mmap data pages"),
OPT_INTEGER('r', "realtime", &realtime_prio, OPT_INTEGER('r', "realtime", &realtime_prio,
...@@ -1200,6 +1236,8 @@ static const struct option options[] = { ...@@ -1200,6 +1236,8 @@ static const struct option options[] = {
"profile at this frequency"), "profile at this frequency"),
OPT_INTEGER('E', "entries", &print_entries, OPT_INTEGER('E', "entries", &print_entries,
"display this many functions"), "display this many functions"),
OPT_BOOLEAN('U', "hide_user_symbols", &hide_user_symbols,
"hide user symbols"),
OPT_BOOLEAN('v', "verbose", &verbose, OPT_BOOLEAN('v', "verbose", &verbose,
"be more verbose (show counter open errors, etc)"), "be more verbose (show counter open errors, etc)"),
OPT_END() OPT_END()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册