From: Namhyung Kim <namhyung@kernel.org>
To: Aaron Tomlin <atomlin@atomlin.com>
Cc: peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
mark.rutland@arm.com, alexander.shishkin@linux.intel.com,
jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com,
james.clark@linaro.org, howardchu95@gmail.com, neelx@suse.com,
chjohnst@mail.com, sean@ashe.io,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] perf stat: Add --hide-zero-events option to suppress zero-count events
Date: Fri, 17 Jul 2026 22:33:10 -0700 [thread overview]
Message-ID: <alsQFlmM9tl8ySH4@google.com> (raw)
In-Reply-To: <20260718011039.278310-1-atomlin@atomlin.com>
On Fri, Jul 17, 2026 at 09:10:39PM -0400, Aaron Tomlin wrote:
> When monitoring a large number of events (e.g., with wildcards such as
> --event 'syscalls:sys_enter_*'), many matched events will return a count
> of zero. This clutters the output, making it difficult to spot the
> active events.
>
> Add a new option --hide-zero-events to suppress printing events that
> have a count of zero.
>
> To prevent formatting and diagnostic issues, the zero-skipping logic
> implements the following rules:
>
> 1. In metric-only mode (i.e., --metric-only), columns must remain
> aligned in the output grid. We evaluate config->metric_only first
> to avoid skipping zero-valued columns, preventing values from
> shifting left and aligning under incorrect headers
>
> 2. For explicitly requested events, we ensure they are not silently
> hidden if they are unsupported. We only hide a zero-count event
> if counter->supported is true, ensuring that unsupported explicit
> events still report "<not supported>"
>
> Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
> Reviewed-by: Ian Rogers <irogers@google.com>
> ---
> Changes since v1:
>
> - Add shell test coverage for --hide-zero-events and --metric-only
> in stat.sh
Unfortunately the test was updated recently. Can you please rebase?
Thanks,
Namhyung
>
> - Linked to v1: https://lore.kernel.org/lkml/20260717023134.272578-1-atomlin@atomlin.com/
> ---
> tools/perf/Documentation/perf-stat.txt | 3 ++
> tools/perf/builtin-stat.c | 2 ++
> tools/perf/tests/shell/stat.sh | 46 ++++++++++++++++++++++++++
> tools/perf/util/stat-display.c | 3 ++
> tools/perf/util/stat.h | 1 +
> 5 files changed, 55 insertions(+)
>
> diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
> index b72a29c9223c..f334aabdc809 100644
> --- a/tools/perf/Documentation/perf-stat.txt
> +++ b/tools/perf/Documentation/perf-stat.txt
> @@ -162,6 +162,9 @@ null run - Don't start any counters.
> This can be useful to measure just elapsed wall-clock time - or to assess the
> raw overhead of perf stat itself, without running any counters.
>
> +--hide-zero-events::
> +Do not show events with a zero count.
> +
> -v::
> --verbose::
> be more verbose (show counter open errors, etc)
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index a04466ea3b0a..8d340c2ae76c 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -2493,6 +2493,8 @@ int cmd_stat(int argc, const char **argv)
> "display details about each run (only with -r option)"),
> OPT_BOOLEAN('n', "null", &stat_config.null_run,
> "null run - dont start any counters"),
> + OPT_BOOLEAN(0, "hide-zero-events", &stat_config.hide_zero,
> + "Do not show events with a zero count"),
> OPT_INCR('d', "detailed", &detailed_run,
> "detailed run - start a lot of events"),
> OPT_BOOLEAN('S', "sync", &sync_run,
> diff --git a/tools/perf/tests/shell/stat.sh b/tools/perf/tests/shell/stat.sh
> index 1e17bee026bd..cf7a35fac871 100755
> --- a/tools/perf/tests/shell/stat.sh
> +++ b/tools/perf/tests/shell/stat.sh
> @@ -535,6 +535,51 @@ test_stat_delay() {
> echo "stat -D test [Success]"
> }
>
> +test_hide_zero_events_stat() {
> + echo "Hide zero events stat test"
> + if ! perf stat -e context-switches,cpu-migrations true > "${stat_output}" 2>&1
> + then
> + echo "Hide zero events stat test [Skipped event parsing failed]"
> + return
> + fi
> +
> + zero_event=""
> + if grep -q -E "[[:space:]]+0[[:space:]]+context-switches" "${stat_output}"; then
> + zero_event="context-switches"
> + elif grep -q -E "[[:space:]]+0[[:space:]]+cpu-migrations" "${stat_output}"; then
> + zero_event="cpu-migrations"
> + fi
> +
> + if [ -z "$zero_event" ]; then
> + echo "Hide zero events stat test [Skipped - no zero count event found]"
> + return
> + fi
> +
> + if ! perf stat --hide-zero-events -e context-switches,cpu-migrations true > "${stat_output}" 2>&1
> + then
> + echo "Hide zero events stat test [Failed - command failed]"
> + err=1
> + return
> + fi
> +
> + if grep -q -E "$zero_event" "${stat_output}"
> + then
> + echo "Hide zero events stat test [Failed - zero event $zero_event was not hidden]"
> + err=1
> + return
> + fi
> +
> + # Check that --metric-only works with --hide-zero-events
> + if ! perf stat --hide-zero-events --metric-only -e instructions,cycles true > "${stat_output}" 2>&1
> + then
> + echo "Hide zero events stat test [Failed - metric-only command failed]"
> + err=1
> + return
> + fi
> +
> + echo "Hide zero events stat test [Success]"
> +}
> +
> test_default_stat
> test_null_stat
> test_offline_cpu_stat
> @@ -551,6 +596,7 @@ test_stat_detailed
> test_stat_repeat
> test_stat_pid
> test_stat_delay
> +test_hide_zero_events_stat
>
> cleanup
> exit $err
> diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
> index 0a5750bb59fa..1579e3e2c445 100644
> --- a/tools/perf/util/stat-display.c
> +++ b/tools/perf/util/stat-display.c
> @@ -907,6 +907,9 @@ static bool should_skip_zero_counter(struct perf_stat_config *config,
> /* Metric only counts won't be displayed but the metric wants to be computed. */
> if (config->metric_only)
> return false;
> +
> + if (config->hide_zero && counter->supported)
> + return true;
> /*
> * Skip value 0 when enabling --per-thread globally,
> * otherwise it will have too many 0 output.
> diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
> index 4bced233d2fc..e3598037a6aa 100644
> --- a/tools/perf/util/stat.h
> +++ b/tools/perf/util/stat.h
> @@ -69,6 +69,7 @@ struct perf_stat_config {
> bool interval_clear;
> bool metric_only;
> bool null_run;
> + bool hide_zero;
> bool ru_display;
> bool big_num;
> bool hybrid_merge;
> --
> 2.54.0
>
prev parent reply other threads:[~2026-07-18 5:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-18 1:10 [PATCH v2] perf stat: Add --hide-zero-events option to suppress zero-count events Aaron Tomlin
2026-07-18 5:33 ` Namhyung Kim [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alsQFlmM9tl8ySH4@google.com \
--to=namhyung@kernel.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=atomlin@atomlin.com \
--cc=chjohnst@mail.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=neelx@suse.com \
--cc=peterz@infradead.org \
--cc=sean@ashe.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.