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.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 2b56bcfb
...@@ -235,10 +235,13 @@ static void perf_top__show_details(struct perf_top *top) ...@@ -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->zero)
symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx); if (top->evlist->enabled) {
else if (top->zero)
symbol__annotate_decay_histogram(symbol, top->sym_evsel->idx); symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx);
else
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,11 +279,13 @@ static void perf_top__print_sym_table(struct perf_top *top) ...@@ -276,11 +279,13 @@ static void perf_top__print_sym_table(struct perf_top *top)
return; return;
} }
if (top->zero) { if (top->evlist->enabled) {
hists__delete_entries(hists); if (top->zero) {
} else { hists__delete_entries(hists);
hists__decay_entries(hists, top->hide_user_symbols, } else {
top->hide_kernel_symbols); hists__decay_entries(hists, top->hide_user_symbols,
top->hide_kernel_symbols);
}
} }
hists__collapse_resort(hists, NULL); hists__collapse_resort(hists, NULL);
...@@ -545,11 +550,13 @@ static void perf_top__sort_new_samples(void *arg) ...@@ -545,11 +550,13 @@ static void perf_top__sort_new_samples(void *arg)
hists = evsel__hists(t->sym_evsel); hists = evsel__hists(t->sym_evsel);
if (t->zero) { if (t->evlist->enabled) {
hists__delete_entries(hists); if (t->zero) {
} else { hists__delete_entries(hists);
hists__decay_entries(hists, t->hide_user_symbols, } else {
t->hide_kernel_symbols); hists__decay_entries(hists, t->hide_user_symbols,
t->hide_kernel_symbols);
}
} }
hists__collapse_resort(hists, NULL); hists__collapse_resort(hists, NULL);
...@@ -579,8 +586,21 @@ static void *display_thread_tui(void *arg) ...@@ -579,8 +586,21 @@ 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) {
&top->session->header.env); int key = perf_evlist__tui_browse_hists(top->evlist, help, &hbt,
top->min_percent,
&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;
......
...@@ -1736,6 +1736,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment