diff options
-rw-r--r-- | tools/perf/builtin-top.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 3af95203208a..89b7f68a1799 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -76,6 +76,9 @@ static int delay_secs = 2; | |||
76 | static int zero = 0; | 76 | static int zero = 0; |
77 | static int dump_symtab = 0; | 77 | static int dump_symtab = 0; |
78 | 78 | ||
79 | static bool hide_kernel_symbols = false; | ||
80 | static bool hide_user_symbols = false; | ||
81 | |||
79 | /* | 82 | /* |
80 | * Source | 83 | * Source |
81 | */ | 84 | */ |
@@ -104,6 +107,7 @@ struct sym_entry { | |||
104 | unsigned long snap_count; | 107 | unsigned long snap_count; |
105 | double weight; | 108 | double weight; |
106 | int skip; | 109 | int skip; |
110 | u8 origin; | ||
107 | struct map *map; | 111 | struct map *map; |
108 | struct source_line *source; | 112 | struct source_line *source; |
109 | struct source_line *lines; | 113 | struct source_line *lines; |
@@ -430,6 +434,13 @@ static void print_sym_table(void) | |||
430 | list_for_each_entry_safe_from(syme, n, &active_symbols, node) { | 434 | list_for_each_entry_safe_from(syme, n, &active_symbols, node) { |
431 | syme->snap_count = syme->count[snap]; | 435 | syme->snap_count = syme->count[snap]; |
432 | if (syme->snap_count != 0) { | 436 | if (syme->snap_count != 0) { |
437 | if ((hide_user_symbols && | ||
438 | syme->origin == PERF_RECORD_MISC_USER) || | ||
439 | (hide_kernel_symbols && | ||
440 | syme->origin == PERF_RECORD_MISC_KERNEL)) { | ||
441 | list_remove_active_sym(syme); | ||
442 | continue; | ||
443 | } | ||
433 | syme->weight = sym_weight(syme); | 444 | syme->weight = sym_weight(syme); |
434 | rb_insert_active_sym(&tmp, syme); | 445 | rb_insert_active_sym(&tmp, syme); |
435 | sum_ksamples += syme->snap_count; | 446 | sum_ksamples += syme->snap_count; |
@@ -637,6 +648,12 @@ static void print_mapped_keys(void) | |||
637 | if (nr_counters > 1) | 648 | if (nr_counters > 1) |
638 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); | 649 | fprintf(stdout, "\t[w] toggle display weighted/count[E]r. \t(%d)\n", display_weighted ? 1 : 0); |
639 | 650 | ||
651 | fprintf(stdout, | ||
652 | "\t[K] hide kernel_symbols symbols. \t(%s)\n", | ||
653 | hide_kernel_symbols ? "yes" : "no"); | ||
654 | fprintf(stdout, | ||
655 | "\t[U] hide user symbols. \t(%s)\n", | ||
656 | hide_user_symbols ? "yes" : "no"); | ||
640 | fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); | 657 | fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", zero ? 1 : 0); |
641 | fprintf(stdout, "\t[qQ] quit.\n"); | 658 | fprintf(stdout, "\t[qQ] quit.\n"); |
642 | } | 659 | } |
@@ -650,6 +667,8 @@ static int key_mapped(int c) | |||
650 | case 'z': | 667 | case 'z': |
651 | case 'q': | 668 | case 'q': |
652 | case 'Q': | 669 | case 'Q': |
670 | case 'K': | ||
671 | case 'U': | ||
653 | return 1; | 672 | return 1; |
654 | case 'E': | 673 | case 'E': |
655 | case 'w': | 674 | case 'w': |
@@ -727,6 +746,9 @@ static void handle_keypress(int c) | |||
727 | case 'F': | 746 | case 'F': |
728 | prompt_percent(&sym_pcnt_filter, "Enter details display event filter (percent)"); | 747 | prompt_percent(&sym_pcnt_filter, "Enter details display event filter (percent)"); |
729 | break; | 748 | break; |
749 | case 'K': | ||
750 | hide_kernel_symbols = !hide_kernel_symbols; | ||
751 | break; | ||
730 | case 'q': | 752 | case 'q': |
731 | case 'Q': | 753 | case 'Q': |
732 | printf("exiting.\n"); | 754 | printf("exiting.\n"); |
@@ -746,6 +768,9 @@ static void handle_keypress(int c) | |||
746 | pthread_mutex_unlock(&syme->source_lock); | 768 | pthread_mutex_unlock(&syme->source_lock); |
747 | } | 769 | } |
748 | break; | 770 | break; |
771 | case 'U': | ||
772 | hide_user_symbols = !hide_user_symbols; | ||
773 | break; | ||
749 | case 'w': | 774 | case 'w': |
750 | display_weighted = ~display_weighted; | 775 | display_weighted = ~display_weighted; |
751 | break; | 776 | break; |
@@ -857,11 +882,16 @@ static void event__process_sample(const event_t *self, int counter) | |||
857 | struct map *map; | 882 | struct map *map; |
858 | struct sym_entry *syme; | 883 | struct sym_entry *syme; |
859 | struct symbol *sym; | 884 | struct symbol *sym; |
885 | u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | ||
860 | 886 | ||
861 | switch (self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK) { | 887 | switch (origin) { |
862 | case PERF_RECORD_MISC_USER: { | 888 | case PERF_RECORD_MISC_USER: { |
863 | struct thread *thread = threads__findnew(self->ip.pid); | 889 | struct thread *thread; |
864 | 890 | ||
891 | if (hide_user_symbols) | ||
892 | return; | ||
893 | |||
894 | thread = threads__findnew(self->ip.pid); | ||
865 | if (thread == NULL) | 895 | if (thread == NULL) |
866 | return; | 896 | return; |
867 | 897 | ||
@@ -885,6 +915,9 @@ static void event__process_sample(const event_t *self, int counter) | |||
885 | return; | 915 | return; |
886 | /* Fall thru */ | 916 | /* Fall thru */ |
887 | case PERF_RECORD_MISC_KERNEL: | 917 | case PERF_RECORD_MISC_KERNEL: |
918 | if (hide_kernel_symbols) | ||
919 | return; | ||
920 | |||
888 | sym = kernel_maps__find_symbol(ip, &map); | 921 | sym = kernel_maps__find_symbol(ip, &map); |
889 | if (sym == NULL) | 922 | if (sym == NULL) |
890 | return; | 923 | return; |
@@ -897,6 +930,7 @@ static void event__process_sample(const event_t *self, int counter) | |||
897 | 930 | ||
898 | if (!syme->skip) { | 931 | if (!syme->skip) { |
899 | syme->count[counter]++; | 932 | syme->count[counter]++; |
933 | syme->origin = origin; | ||
900 | record_precise_ip(syme, counter, ip); | 934 | record_precise_ip(syme, counter, ip); |
901 | pthread_mutex_lock(&active_symbols_lock); | 935 | pthread_mutex_lock(&active_symbols_lock); |
902 | if (list_empty(&syme->node) || !syme->node.next) | 936 | if (list_empty(&syme->node) || !syme->node.next) |
@@ -1178,6 +1212,8 @@ static const struct option options[] = { | |||
1178 | OPT_INTEGER('C', "CPU", &profile_cpu, | 1212 | OPT_INTEGER('C', "CPU", &profile_cpu, |
1179 | "CPU to profile on"), | 1213 | "CPU to profile on"), |
1180 | OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"), | 1214 | OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"), |
1215 | OPT_BOOLEAN('K', "hide_kernel_symbols", &hide_kernel_symbols, | ||
1216 | "hide kernel symbols"), | ||
1181 | OPT_INTEGER('m', "mmap-pages", &mmap_pages, | 1217 | OPT_INTEGER('m', "mmap-pages", &mmap_pages, |
1182 | "number of mmap data pages"), | 1218 | "number of mmap data pages"), |
1183 | OPT_INTEGER('r', "realtime", &realtime_prio, | 1219 | OPT_INTEGER('r', "realtime", &realtime_prio, |
@@ -1200,6 +1236,8 @@ static const struct option options[] = { | |||
1200 | "profile at this frequency"), | 1236 | "profile at this frequency"), |
1201 | OPT_INTEGER('E', "entries", &print_entries, | 1237 | OPT_INTEGER('E', "entries", &print_entries, |
1202 | "display this many functions"), | 1238 | "display this many functions"), |
1239 | OPT_BOOLEAN('U', "hide_user_symbols", &hide_user_symbols, | ||
1240 | "hide user symbols"), | ||
1203 | OPT_BOOLEAN('v', "verbose", &verbose, | 1241 | OPT_BOOLEAN('v', "verbose", &verbose, |
1204 | "be more verbose (show counter open errors, etc)"), | 1242 | "be more verbose (show counter open errors, etc)"), |
1205 | OPT_END() | 1243 | OPT_END() |