[PATCH v1] perf top: Make zeroing histogram on refresh the default

From: Ian Rogers
Date: Thu May 16 2024 - 18:22:19 EST


Instead of decaying histograms over time change it so that they are
zero-ed on each perf top refresh. Previously the option '-z', or
pressing 'z' in tui mode, would enable this behavior. Decaying samples
is non-intuitive as it isn't how "top" works. Make zeroing on refresh
the default and rename the command line options from 'z' to 'Z' and
'zero' to 'decay'.

Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/Documentation/perf-top.txt | 6 +++---
tools/perf/builtin-top.c | 23 +++++++++++++----------
tools/perf/ui/browsers/hists.c | 7 ++++---
tools/perf/util/top.h | 2 +-
4 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/tools/perf/Documentation/perf-top.txt b/tools/perf/Documentation/perf-top.txt
index 667e5102075e..f1524cc0d409 100644
--- a/tools/perf/Documentation/perf-top.txt
+++ b/tools/perf/Documentation/perf-top.txt
@@ -124,9 +124,9 @@ Default is to monitor all CPUS.
--verbose::
Be more verbose (show counter open errors, etc).

--z::
---zero::
- Zero history across display updates.
+-Z::
+--decay::
+ Decay rather than zero history across display updates.

-s::
--sort::
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index e8cbbf10d361..8f06635cb7cd 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -266,10 +266,10 @@ static void perf_top__show_details(struct perf_top *top)
more = symbol__annotate_printf(&he->ms, top->sym_evsel);

if (top->evlist->enabled) {
- if (top->zero)
- symbol__annotate_zero_histogram(symbol, top->sym_evsel->core.idx);
- else
+ if (top->decay_samples)
symbol__annotate_decay_histogram(symbol, top->sym_evsel->core.idx);
+ else
+ symbol__annotate_zero_histogram(symbol, top->sym_evsel->core.idx);
}
if (more != 0)
printf("%d lines not displayed, maybe increase display entries [e]\n", more);
@@ -292,11 +292,11 @@ static void perf_top__resort_hists(struct perf_top *t)
hists__unlink(hists);

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

@@ -460,7 +460,9 @@ static void perf_top__print_mapped_keys(struct perf_top *top)
fprintf(stdout,
"\t[U] hide user symbols. \t(%s)\n",
top->hide_user_symbols ? "yes" : "no");
- fprintf(stdout, "\t[z] toggle sample zeroing. \t(%d)\n", top->zero ? 1 : 0);
+ fprintf(stdout,
+ "\t[z] toggle sample zeroing/decaying. \t(%s)\n",
+ top->decay_samples ? "decay" : "zero");
fprintf(stdout, "\t[qQ] quit.\n");
}

@@ -583,7 +585,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
top->hide_user_symbols = !top->hide_user_symbols;
break;
case 'z':
- top->zero = !top->zero;
+ top->decay_samples = !top->decay_samples;
break;
default:
break;
@@ -648,7 +650,7 @@ static void *display_thread_tui(void *arg)
ret = evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent,
&top->session->header.env, !top->record_opts.overwrite);
if (ret == K_RELOAD) {
- top->zero = true;
+ top->decay_samples = false;
goto repeat;
} else
stop_top();
@@ -1502,7 +1504,8 @@ int cmd_top(int argc, const char **argv)
"child tasks do not inherit counters"),
OPT_STRING(0, "sym-annotate", &top.sym_filter, "symbol name",
"symbol to annotate"),
- OPT_BOOLEAN('z', "zero", &top.zero, "zero history across updates"),
+ OPT_BOOLEAN('Z', "decay", &top.decay_samples,
+ "decay rather than zero history across updates"),
OPT_CALLBACK('F', "freq", &top.record_opts, "freq or 'max'",
"profile at this frequency",
record__parse_freq),
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index b7219df51236..bcc4720f8198 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2305,8 +2305,8 @@ static int hists_browser__scnprintf_title(struct hist_browser *browser, char *bf
" drop: %" PRIu64 "/%" PRIu64,
top->drop, top->drop_total);

- if (top->zero)
- printed += scnprintf(bf + printed, size - printed, " [z]");
+ if (top->decay_samples)
+ printed += scnprintf(bf + printed, size - printed, " [decay]");

perf_top__reset_sample_counters(top);
}
@@ -3209,9 +3209,10 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h
continue;
case 'z':
if (!is_report_browser(hbt)) {
+ /* Toggle between zeroing and decaying samples. */
struct perf_top *top = hbt->arg;

- top->zero = !top->zero;
+ top->decay_samples = !top->decay_samples;
}
continue;
case 'L':
diff --git a/tools/perf/util/top.h b/tools/perf/util/top.h
index 4c5588dbb131..b2c199925b36 100644
--- a/tools/perf/util/top.h
+++ b/tools/perf/util/top.h
@@ -32,7 +32,7 @@ struct perf_top {
u64 guest_us_samples, guest_kernel_samples;
int print_entries, count_filter, delay_secs;
int max_stack;
- bool hide_kernel_symbols, hide_user_symbols, zero;
+ bool hide_kernel_symbols, hide_user_symbols, decay_samples;
#ifdef HAVE_SLANG_SUPPORT
bool use_tui;
#endif
--
2.45.0.rc1.225.g2a3ae87e7f-goog