[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aRvaasKg-ctKvzgi@google.com>
Date: Mon, 17 Nov 2025 18:31:06 -0800
From: Namhyung Kim <namhyung@...nel.org>
To: Ian Rogers <irogers@...gle.com>
Cc: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>,
Adrian Hunter <adrian.hunter@...el.com>,
"Dr. David Alan Gilbert" <linux@...blig.org>,
Yang Li <yang.lee@...ux.alibaba.com>,
James Clark <james.clark@...aro.org>,
Thomas Falcon <thomas.falcon@...el.com>,
Thomas Richter <tmricht@...ux.ibm.com>,
linux-perf-users@...r.kernel.org, linux-kernel@...r.kernel.org,
Andi Kleen <ak@...ux.intel.com>,
Dapeng Mi <dapeng1.mi@...ux.intel.com>
Subject: Re: [PATCH v4 05/10] perf stat: Reduce scope of ru_stats
On Thu, Nov 13, 2025 at 10:05:11AM -0800, Ian Rogers wrote:
> The ru_stats are used to capture user and system time stats when a
> process exits. These are then applied to user and system time tool
> events if their reads fail due to the process terminating. Reduce the
> scope now the metric code no longer reads these values.
>
> Signed-off-by: Ian Rogers <irogers@...gle.com>
> ---
> tools/perf/builtin-stat.c | 19 ++++++++++++++++++-
> tools/perf/util/config.c | 1 -
> tools/perf/util/stat-shadow.c | 2 --
> tools/perf/util/stat.h | 21 ---------------------
> 4 files changed, 18 insertions(+), 25 deletions(-)
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index 654f840f7a2f..d6f4c84f7d7e 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -104,6 +104,11 @@
> #define DEFAULT_SEPARATOR " "
> #define FREEZE_ON_SMI_PATH "bus/event_source/devices/cpu/freeze_on_smi"
>
> +struct rusage_stats {
> + struct stats ru_utime_usec_stat;
> + struct stats ru_stime_usec_stat;
Maybe we need to rename it to ru_[us]time_nsec_stat now?
But it can be a separate change.
Thanks,
Namhyung
> +};
> +
> static void print_counters(struct timespec *ts, int argc, const char **argv);
>
> static struct evlist *evsel_list;
> @@ -133,6 +138,7 @@ static bool interval_count;
> static const char *output_name;
> static int output_fd;
> static char *metrics;
> +static struct rusage_stats ru_stats;
>
> struct perf_stat {
> bool record;
> @@ -730,6 +736,17 @@ static int create_perf_stat_counter(struct evsel *evsel,
> evsel->core.threads);
> }
>
> +static void update_rusage_stats(const struct rusage *rusage)
> +{
> + const u64 us_to_ns = 1000;
> + const u64 s_to_ns = 1000000000;
> +
> + update_stats(&ru_stats.ru_utime_usec_stat,
> + (rusage->ru_utime.tv_usec * us_to_ns + rusage->ru_utime.tv_sec * s_to_ns));
> + update_stats(&ru_stats.ru_stime_usec_stat,
> + (rusage->ru_stime.tv_usec * us_to_ns + rusage->ru_stime.tv_sec * s_to_ns));
> +}
> +
> static int __run_perf_stat(int argc, const char **argv, int run_idx)
> {
> int interval = stat_config.interval;
> @@ -979,7 +996,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)
> evlist__reset_aggr_stats(evsel_list);
> } else {
> update_stats(&walltime_nsecs_stats, t1 - t0);
> - update_rusage_stats(&ru_stats, &stat_config.ru_data);
> + update_rusage_stats(&stat_config.ru_data);
> }
>
> /*
> diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
> index 6f914620c6ff..cc0746f494f4 100644
> --- a/tools/perf/util/config.c
> +++ b/tools/perf/util/config.c
> @@ -45,7 +45,6 @@ struct perf_stat_config stat_config = {
> .run_count = 1,
> .metric_only_len = METRIC_ONLY_LEN,
> .walltime_nsecs_stats = &walltime_nsecs_stats,
> - .ru_stats = &ru_stats,
> .big_num = true,
> .ctl_fd = -1,
> .ctl_fd_ack = -1,
> diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
> index 6c1ad78604e1..cb7c741a1ebb 100644
> --- a/tools/perf/util/stat-shadow.c
> +++ b/tools/perf/util/stat-shadow.c
> @@ -18,12 +18,10 @@
> #include "tool_pmu.h"
>
> struct stats walltime_nsecs_stats;
> -struct rusage_stats ru_stats;
>
> void perf_stat__reset_shadow_stats(void)
> {
> memset(&walltime_nsecs_stats, 0, sizeof(walltime_nsecs_stats));
> - memset(&ru_stats, 0, sizeof(ru_stats));
> }
>
> static bool tool_pmu__is_time_event(const struct perf_stat_config *config,
> diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
> index b42da4a29c44..055b95d18106 100644
> --- a/tools/perf/util/stat.h
> +++ b/tools/perf/util/stat.h
> @@ -56,11 +56,6 @@ enum aggr_mode {
> AGGR_MAX
> };
>
> -struct rusage_stats {
> - struct stats ru_utime_usec_stat;
> - struct stats ru_stime_usec_stat;
> -};
> -
> typedef struct aggr_cpu_id (*aggr_get_id_t)(struct perf_stat_config *config, struct perf_cpu cpu);
>
> struct perf_stat_config {
> @@ -102,7 +97,6 @@ struct perf_stat_config {
> const char *csv_sep;
> struct stats *walltime_nsecs_stats;
> struct rusage ru_data;
> - struct rusage_stats *ru_stats;
> struct cpu_aggr_map *aggr_map;
> aggr_get_id_t aggr_get_id;
> struct cpu_aggr_map *cpus_aggr_map;
> @@ -132,25 +126,10 @@ static inline void init_stats(struct stats *stats)
> stats->max = 0;
> }
>
> -static inline void init_rusage_stats(struct rusage_stats *ru_stats) {
> - init_stats(&ru_stats->ru_utime_usec_stat);
> - init_stats(&ru_stats->ru_stime_usec_stat);
> -}
> -
> -static inline void update_rusage_stats(struct rusage_stats *ru_stats, struct rusage* rusage) {
> - const u64 us_to_ns = 1000;
> - const u64 s_to_ns = 1000000000;
> - update_stats(&ru_stats->ru_utime_usec_stat,
> - (rusage->ru_utime.tv_usec * us_to_ns + rusage->ru_utime.tv_sec * s_to_ns));
> - update_stats(&ru_stats->ru_stime_usec_stat,
> - (rusage->ru_stime.tv_usec * us_to_ns + rusage->ru_stime.tv_sec * s_to_ns));
> -}
> -
> struct evsel;
> struct evlist;
>
> extern struct stats walltime_nsecs_stats;
> -extern struct rusage_stats ru_stats;
>
> enum metric_threshold_classify {
> METRIC_THRESHOLD_UNKNOWN,
> --
> 2.51.2.1041.gc1ab5b90ca-goog
>
Powered by blists - more mailing lists