Linux Perf Users
 help / color / mirror / Atom feed
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
> 

      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox