aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/builtin-top.c42
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;
76static int zero = 0; 76static int zero = 0;
77static int dump_symtab = 0; 77static int dump_symtab = 0;
78 78
79static bool hide_kernel_symbols = false;
80static 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()