Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ffcda17 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar
Browse files

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: default avatarArnaldo 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: default avatarIngo Molnar <mingo@elte.hu>
parent 3b6ed988
Loading
Loading
Loading
Loading
+40 −2
Original line number Original line Diff line number Diff line
@@ -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 {
	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)
	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)
	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)
		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)
		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)
				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)
	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)
			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)


	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[] = {
	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[] = {
		    "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()