perf top: Allow disabling/ enabling events dynamicly
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 5d484f99aed547e235f2229653c95392a1bc3692 Gitweb: http://git.kernel.org/tip/5d484f99aed547e235f2229653c95392a1bc3692 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Wed, 17 Jun 2015 16:50:52 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 17 Jun 2015 16:50:52 -0300
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 Ingo Molnar <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-top.c | 52 +++++++++++++++++++++++++++++------------- tools/perf/ui/browsers/hists.c | 2 ++ 2 files changed, 38 insertions(+), 16 deletions(-)
tools/perf/builtin-top.c +36 -16
@@ -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,0 , top->sym_pcnt_filter, top->print_entries,4 ); -if (top->zero) -symbol__annotate_zero_histogram (symbol, top->sym_evsel->idx); -else -symbol__annotate_decay_histogram (symbol, top->sym_evsel->idx); + +if (top->evlist->enabled) { +if (top->zero) +symbol__annotate_zero_histogram (symbol, top->sym_evsel->idx); +else +symbol__annotate_decay_histogram (symbol, top->sym_evsel->idx); + }if (more !=0 )printf ("%d lines not displayed, maybe increase display entries [e]\n" , more); out_unlock:
@@ -276,11 +279,13 @@ static void perf_top__print_sym_table(struct perf_top *top)return ; } -if (top->zero) { -hists__delete_entries (hists); - }else { -hists__decay_entries (hists, top->hide_user_symbols, - top->hide_kernel_symbols); +if (top->evlist->enabled) { +if (top->zero) { +hists__delete_entries (hists); + }else { +hists__decay_entries (hists, top->hide_user_symbols, + top->hide_kernel_symbols); + } }hists__collapse_resort (hists,NULL );
@@ -545,11 +550,13 @@ static void perf_top__sort_new_samples(void *arg) hists =evsel__hists (t->sym_evsel); -if (t->zero) { -hists__delete_entries (hists); - }else { -hists__decay_entries (hists, t->hide_user_symbols, - t->hide_kernel_symbols); +if (t->evlist->enabled) { +if (t->zero) { +hists__delete_entries (hists); + }else { +hists__decay_entries (hists, t->hide_user_symbols, + t->hide_kernel_symbols); + } }hists__collapse_resort (hists,NULL );
@@ -579,8 +586,21 @@ static void *display_thread_tui(void *arg) hists->uid_filter_str = top->record_opts.target.uid_str; } -perf_evlist__tui_browse_hists (top->evlist, help, &hbt, top->min_percent, - &top->session->header.env); +while (true) { +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 ;return NULL ;
tools/perf/ui/browsers/hists.c +2 -0
@@ -1736,6 +1736,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,"t Zoom into current Thread\n" "V Verbose (DSO names in callchains, etc)\n" "z Toggle zeroing of samples\n" +"CTRL+z Enable/Disable events\n" "/ Filter symbol by name" ;if (browser ==NULL )
@@ -1900,6 +1901,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,/* Fall thru */ case 'q' :case CTRL ('c' ): +case CTRL ('z' ): goto out_free_stack;default :continue ;