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

Commit 5d484f99 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf top: Allow disabling/enabling events dynamicly



Now it is possible to press CTRL+z at anytime and that will disable the
events being monitored, essentially turning 'top' into 'report', with
pressing CTRL+z again making it enable the events again, returning to
the 'top' behaviour, i.e. dynamic + decaying of older samples.

One may want, for instance, play with:

    -d, --delay <n>       number of seconds to delay between refreshes

and:

    -z, --zero            zero history across updates

Plus CTRL+z to see only the events since last zeroing, etc.

Suggested-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-zq7tnh5462blt2yda0bcxh5b@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 2b56bcfb
Loading
Loading
Loading
Loading
+36 −16
Original line number Original line Diff line number Diff line
@@ -235,10 +235,13 @@ static void perf_top__show_details(struct perf_top *top)


	more = symbol__annotate_printf(symbol, he->ms.map, top->sym_evsel,
	more = symbol__annotate_printf(symbol, he->ms.map, top->sym_evsel,
				       0, top->sym_pcnt_filter, top->print_entries, 4);
				       0, top->sym_pcnt_filter, top->print_entries, 4);

	if (top->evlist->enabled) {
		if (top->zero)
		if (top->zero)
			symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx);
			symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx);
		else
		else
			symbol__annotate_decay_histogram(symbol, top->sym_evsel->idx);
			symbol__annotate_decay_histogram(symbol, top->sym_evsel->idx);
	}
	if (more != 0)
	if (more != 0)
		printf("%d lines not displayed, maybe increase display entries [e]\n", more);
		printf("%d lines not displayed, maybe increase display entries [e]\n", more);
out_unlock:
out_unlock:
@@ -276,12 +279,14 @@ static void perf_top__print_sym_table(struct perf_top *top)
		return;
		return;
	}
	}


	if (top->evlist->enabled) {
		if (top->zero) {
		if (top->zero) {
			hists__delete_entries(hists);
			hists__delete_entries(hists);
		} else {
		} else {
			hists__decay_entries(hists, top->hide_user_symbols,
			hists__decay_entries(hists, top->hide_user_symbols,
					     top->hide_kernel_symbols);
					     top->hide_kernel_symbols);
		}
		}
	}


	hists__collapse_resort(hists, NULL);
	hists__collapse_resort(hists, NULL);
	hists__output_resort(hists, NULL);
	hists__output_resort(hists, NULL);
@@ -545,12 +550,14 @@ static void perf_top__sort_new_samples(void *arg)


	hists = evsel__hists(t->sym_evsel);
	hists = evsel__hists(t->sym_evsel);


	if (t->evlist->enabled) {
		if (t->zero) {
		if (t->zero) {
			hists__delete_entries(hists);
			hists__delete_entries(hists);
		} else {
		} else {
			hists__decay_entries(hists, t->hide_user_symbols,
			hists__decay_entries(hists, t->hide_user_symbols,
					     t->hide_kernel_symbols);
					     t->hide_kernel_symbols);
		}
		}
	}


	hists__collapse_resort(hists, NULL);
	hists__collapse_resort(hists, NULL);
	hists__output_resort(hists, NULL);
	hists__output_resort(hists, NULL);
@@ -579,9 +586,22 @@ static void *display_thread_tui(void *arg)
		hists->uid_filter_str = top->record_opts.target.uid_str;
		hists->uid_filter_str = top->record_opts.target.uid_str;
	}
	}


	perf_evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent,
	while (true)  {
		int key = perf_evlist__tui_browse_hists(top->evlist, help, &hbt,
							top->min_percent,
							&top->session->header.env);
							&top->session->header.env);


		if (key != CTRL('z'))
			break;

		perf_evlist__toggle_enable(top->evlist);
		/*
		 * No need to refresh, resort/decay histogram entries
		 * if we are not collecting samples:
		 */
		hbt.refresh = top->evlist->enabled ? top->delay_secs : 0;
	}

	done = 1;
	done = 1;
	return NULL;
	return NULL;
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -1736,6 +1736,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
	"t             Zoom into current Thread\n"
	"t             Zoom into current Thread\n"
	"V             Verbose (DSO names in callchains, etc)\n"
	"V             Verbose (DSO names in callchains, etc)\n"
	"z             Toggle zeroing of samples\n"
	"z             Toggle zeroing of samples\n"
	"CTRL+z        Enable/Disable events\n"
	"/             Filter symbol by name";
	"/             Filter symbol by name";


	if (browser == NULL)
	if (browser == NULL)
@@ -1900,6 +1901,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
			/* Fall thru */
			/* Fall thru */
		case 'q':
		case 'q':
		case CTRL('c'):
		case CTRL('c'):
		case CTRL('z'):
			goto out_free_stack;
			goto out_free_stack;
		default:
		default:
			continue;
			continue;