[PATCH 19/19] perf stat: Remove unused perf_counts.aggr field

Namhyung Kim posted 19 patches 3 years, 5 months ago
[PATCH 19/19] perf stat: Remove unused perf_counts.aggr field
Posted by Namhyung Kim 3 years, 5 months ago
The aggr field in the struct perf_counts is to keep the aggregated value
in the AGGR_GLOBAL for the old code.  But it's not used anymore.

Acked-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/counts.c |  1 -
 tools/perf/util/counts.h |  1 -
 tools/perf/util/stat.c   | 35 ++---------------------------------
 3 files changed, 2 insertions(+), 35 deletions(-)

diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c
index 7a447d918458..11cd85b278a6 100644
--- a/tools/perf/util/counts.c
+++ b/tools/perf/util/counts.c
@@ -48,7 +48,6 @@ void perf_counts__reset(struct perf_counts *counts)
 {
 	xyarray__reset(counts->loaded);
 	xyarray__reset(counts->values);
-	memset(&counts->aggr, 0, sizeof(struct perf_counts_values));
 }
 
 void evsel__reset_counts(struct evsel *evsel)
diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h
index 5de275194f2b..42760242e0df 100644
--- a/tools/perf/util/counts.h
+++ b/tools/perf/util/counts.h
@@ -11,7 +11,6 @@ struct evsel;
 
 struct perf_counts {
 	s8			  scaled;
-	struct perf_counts_values aggr;
 	struct xyarray		  *values;
 	struct xyarray		  *loaded;
 };
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index 14c45f4cfdd3..6ab9c58beca7 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -308,8 +308,6 @@ static void evsel__copy_prev_raw_counts(struct evsel *evsel)
 				*perf_counts(evsel->prev_raw_counts, idx, thread);
 		}
 	}
-
-	evsel->counts->aggr = evsel->prev_raw_counts->aggr;
 }
 
 void evlist__copy_prev_raw_counts(struct evlist *evlist)
@@ -320,26 +318,6 @@ void evlist__copy_prev_raw_counts(struct evlist *evlist)
 		evsel__copy_prev_raw_counts(evsel);
 }
 
-void evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
-{
-	struct evsel *evsel;
-
-	/*
-	 * To collect the overall statistics for interval mode,
-	 * we copy the counts from evsel->prev_raw_counts to
-	 * evsel->counts. The perf_stat_process_counter creates
-	 * aggr values from per cpu values, but the per cpu values
-	 * are 0 for AGGR_GLOBAL. So we use a trick that saves the
-	 * previous aggr value to the first member of perf_counts,
-	 * then aggr calculation in process_counter_values can work
-	 * correctly.
-	 */
-	evlist__for_each_entry(evlist, evsel) {
-		*perf_counts(evsel->prev_raw_counts, 0, 0) =
-			evsel->prev_raw_counts->aggr;
-	}
-}
-
 static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused)
 {
 	uint64_t *key = (uint64_t *) __key;
@@ -423,7 +401,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
 		       int cpu_map_idx, int thread,
 		       struct perf_counts_values *count)
 {
-	struct perf_counts_values *aggr = &evsel->counts->aggr;
 	struct perf_stat_evsel *ps = evsel->stats;
 	static struct perf_counts_values zero;
 	bool skip = false;
@@ -493,12 +470,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
 		}
 	}
 
-	if (config->aggr_mode == AGGR_GLOBAL) {
-		aggr->val += count->val;
-		aggr->ena += count->ena;
-		aggr->run += count->run;
-	}
-
 	return 0;
 }
 
@@ -523,13 +494,10 @@ static int process_counter_maps(struct perf_stat_config *config,
 int perf_stat_process_counter(struct perf_stat_config *config,
 			      struct evsel *counter)
 {
-	struct perf_counts_values *aggr = &counter->counts->aggr;
 	struct perf_stat_evsel *ps = counter->stats;
-	u64 *count = counter->counts->aggr.values;
+	u64 *count;
 	int ret;
 
-	aggr->val = aggr->ena = aggr->run = 0;
-
 	if (counter->per_pkg)
 		evsel__zero_per_pkg(counter);
 
@@ -540,6 +508,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
 	if (config->aggr_mode != AGGR_GLOBAL)
 		return 0;
 
+	count = ps->aggr[0].counts.values;
 	update_stats(&ps->res_stats, *count);
 
 	if (verbose > 0) {
-- 
2.38.0.413.g74048e4d9e-goog
Re: [PATCH 19/19] perf stat: Remove unused perf_counts.aggr field
Posted by Athira Rajeev 3 years, 5 months ago

> On 14-Oct-2022, at 11:45 AM, Namhyung Kim <namhyung@kernel.org> wrote:
> 
> The aggr field in the struct perf_counts is to keep the aggregated value
> in the AGGR_GLOBAL for the old code.  But it's not used anymore.
> 
> Acked-by: Ian Rogers <irogers@google.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/perf/util/counts.c |  1 -
> tools/perf/util/counts.h |  1 -
> tools/perf/util/stat.c   | 35 ++---------------------------------
> 3 files changed, 2 insertions(+), 35 deletions(-)
> 
> diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c
> index 7a447d918458..11cd85b278a6 100644
> --- a/tools/perf/util/counts.c
> +++ b/tools/perf/util/counts.c
> @@ -48,7 +48,6 @@ void perf_counts__reset(struct perf_counts *counts)
> {
> 	xyarray__reset(counts->loaded);
> 	xyarray__reset(counts->values);
> -	memset(&counts->aggr, 0, sizeof(struct perf_counts_values));
> }
> 
> void evsel__reset_counts(struct evsel *evsel)
> diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h
> index 5de275194f2b..42760242e0df 100644
> --- a/tools/perf/util/counts.h
> +++ b/tools/perf/util/counts.h
> @@ -11,7 +11,6 @@ struct evsel;
> 
> struct perf_counts {
> 	s8			  scaled;
> -	struct perf_counts_values aggr;
> 	struct xyarray		  *values;
> 	struct xyarray		  *loaded;
> };
> diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
> index 14c45f4cfdd3..6ab9c58beca7 100644
> --- a/tools/perf/util/stat.c
> +++ b/tools/perf/util/stat.c
> @@ -308,8 +308,6 @@ static void evsel__copy_prev_raw_counts(struct evsel *evsel)
> 				*perf_counts(evsel->prev_raw_counts, idx, thread);
> 		}
> 	}
> -
> -	evsel->counts->aggr = evsel->prev_raw_counts->aggr;
> }
> 
> void evlist__copy_prev_raw_counts(struct evlist *evlist)
> @@ -320,26 +318,6 @@ void evlist__copy_prev_raw_counts(struct evlist *evlist)
> 		evsel__copy_prev_raw_counts(evsel);
> }
> 
> -void evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
> -{
> -	struct evsel *evsel;
> -
> -	/*
> -	 * To collect the overall statistics for interval mode,
> -	 * we copy the counts from evsel->prev_raw_counts to
> -	 * evsel->counts. The perf_stat_process_counter creates
> -	 * aggr values from per cpu values, but the per cpu values
> -	 * are 0 for AGGR_GLOBAL. So we use a trick that saves the
> -	 * previous aggr value to the first member of perf_counts,
> -	 * then aggr calculation in process_counter_values can work
> -	 * correctly.
> -	 */
> -	evlist__for_each_entry(evlist, evsel) {
> -		*perf_counts(evsel->prev_raw_counts, 0, 0) =
> -			evsel->prev_raw_counts->aggr;
> -	}
> -}
> -
> static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused)
> {
> 	uint64_t *key = (uint64_t *) __key;
> @@ -423,7 +401,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
> 		       int cpu_map_idx, int thread,
> 		       struct perf_counts_values *count)
> {
> -	struct perf_counts_values *aggr = &evsel->counts->aggr;
> 	struct perf_stat_evsel *ps = evsel->stats;
> 	static struct perf_counts_values zero;
> 	bool skip = false;
> @@ -493,12 +470,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
> 		}
> 	}
> 
> -	if (config->aggr_mode == AGGR_GLOBAL) {
> -		aggr->val += count->val;
> -		aggr->ena += count->ena;
> -		aggr->run += count->run;
> -	}
> -
> 	return 0;
> }
> 
> @@ -523,13 +494,10 @@ static int process_counter_maps(struct perf_stat_config *config,
> int perf_stat_process_counter(struct perf_stat_config *config,
> 			      struct evsel *counter)
> {
> -	struct perf_counts_values *aggr = &counter->counts->aggr;
> 	struct perf_stat_evsel *ps = counter->stats;
> -	u64 *count = counter->counts->aggr.values;
> +	u64 *count;
> 	int ret;
> 
> -	aggr->val = aggr->ena = aggr->run = 0;
> -
> 	if (counter->per_pkg)
> 		evsel__zero_per_pkg(counter);
> 
> @@ -540,6 +508,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
> 	if (config->aggr_mode != AGGR_GLOBAL)
> 		return 0;
> 
> +	count = ps->aggr[0].counts.values;

Hi Namhyung,

We are using ps->aggr[0] here always. Can you please clarify on why first index is used here always.

Thanks
Athira
> 	update_stats(&ps->res_stats, *count);
> 
> 	if (verbose > 0) {
> -- 
> 2.38.0.413.g74048e4d9e-goog
> 
Re: [PATCH 19/19] perf stat: Remove unused perf_counts.aggr field
Posted by Namhyung Kim 3 years, 5 months ago
Hello,

On Sun, Oct 16, 2022 at 6:33 AM Athira Rajeev
<atrajeev@linux.vnet.ibm.com> wrote:
>
>
>
> > On 14-Oct-2022, at 11:45 AM, Namhyung Kim <namhyung@kernel.org> wrote:
> >
> > The aggr field in the struct perf_counts is to keep the aggregated value
> > in the AGGR_GLOBAL for the old code.  But it's not used anymore.
> >
> > Acked-by: Ian Rogers <irogers@google.com>
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> > ---
> > tools/perf/util/counts.c |  1 -
> > tools/perf/util/counts.h |  1 -
> > tools/perf/util/stat.c   | 35 ++---------------------------------
> > 3 files changed, 2 insertions(+), 35 deletions(-)
> >
> > diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c
> > index 7a447d918458..11cd85b278a6 100644
> > --- a/tools/perf/util/counts.c
> > +++ b/tools/perf/util/counts.c
> > @@ -48,7 +48,6 @@ void perf_counts__reset(struct perf_counts *counts)
> > {
> >       xyarray__reset(counts->loaded);
> >       xyarray__reset(counts->values);
> > -     memset(&counts->aggr, 0, sizeof(struct perf_counts_values));
> > }
> >
> > void evsel__reset_counts(struct evsel *evsel)
> > diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h
> > index 5de275194f2b..42760242e0df 100644
> > --- a/tools/perf/util/counts.h
> > +++ b/tools/perf/util/counts.h
> > @@ -11,7 +11,6 @@ struct evsel;
> >
> > struct perf_counts {
> >       s8                        scaled;
> > -     struct perf_counts_values aggr;
> >       struct xyarray            *values;
> >       struct xyarray            *loaded;
> > };
> > diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
> > index 14c45f4cfdd3..6ab9c58beca7 100644
> > --- a/tools/perf/util/stat.c
> > +++ b/tools/perf/util/stat.c
> > @@ -308,8 +308,6 @@ static void evsel__copy_prev_raw_counts(struct evsel *evsel)
> >                               *perf_counts(evsel->prev_raw_counts, idx, thread);
> >               }
> >       }
> > -
> > -     evsel->counts->aggr = evsel->prev_raw_counts->aggr;
> > }
> >
> > void evlist__copy_prev_raw_counts(struct evlist *evlist)
> > @@ -320,26 +318,6 @@ void evlist__copy_prev_raw_counts(struct evlist *evlist)
> >               evsel__copy_prev_raw_counts(evsel);
> > }
> >
> > -void evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
> > -{
> > -     struct evsel *evsel;
> > -
> > -     /*
> > -      * To collect the overall statistics for interval mode,
> > -      * we copy the counts from evsel->prev_raw_counts to
> > -      * evsel->counts. The perf_stat_process_counter creates
> > -      * aggr values from per cpu values, but the per cpu values
> > -      * are 0 for AGGR_GLOBAL. So we use a trick that saves the
> > -      * previous aggr value to the first member of perf_counts,
> > -      * then aggr calculation in process_counter_values can work
> > -      * correctly.
> > -      */
> > -     evlist__for_each_entry(evlist, evsel) {
> > -             *perf_counts(evsel->prev_raw_counts, 0, 0) =
> > -                     evsel->prev_raw_counts->aggr;
> > -     }
> > -}
> > -
> > static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused)
> > {
> >       uint64_t *key = (uint64_t *) __key;
> > @@ -423,7 +401,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
> >                      int cpu_map_idx, int thread,
> >                      struct perf_counts_values *count)
> > {
> > -     struct perf_counts_values *aggr = &evsel->counts->aggr;
> >       struct perf_stat_evsel *ps = evsel->stats;
> >       static struct perf_counts_values zero;
> >       bool skip = false;
> > @@ -493,12 +470,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
> >               }
> >       }
> >
> > -     if (config->aggr_mode == AGGR_GLOBAL) {
> > -             aggr->val += count->val;
> > -             aggr->ena += count->ena;
> > -             aggr->run += count->run;
> > -     }
> > -
> >       return 0;
> > }
> >
> > @@ -523,13 +494,10 @@ static int process_counter_maps(struct perf_stat_config *config,
> > int perf_stat_process_counter(struct perf_stat_config *config,
> >                             struct evsel *counter)
> > {
> > -     struct perf_counts_values *aggr = &counter->counts->aggr;
> >       struct perf_stat_evsel *ps = counter->stats;
> > -     u64 *count = counter->counts->aggr.values;
> > +     u64 *count;
> >       int ret;
> >
> > -     aggr->val = aggr->ena = aggr->run = 0;
> > -
> >       if (counter->per_pkg)
> >               evsel__zero_per_pkg(counter);
> >
> > @@ -540,6 +508,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
> >       if (config->aggr_mode != AGGR_GLOBAL)
> >               return 0;
> >
> > +     count = ps->aggr[0].counts.values;
>
> Hi Namhyung,
>
> We are using ps->aggr[0] here always. Can you please clarify on why first index is used here always.

Sure, the AGGR_GLOBAL should have a single entry map because
theaggr_cpu_id__global() always returns the same value.  So we
can use the index 0 safely.  I'll add a comment.

Thanks,
Namhyung
Re: [PATCH 19/19] perf stat: Remove unused perf_counts.aggr field
Posted by Athira Rajeev 3 years, 5 months ago

> On 18-Oct-2022, at 5:01 AM, Namhyung Kim <namhyung@kernel.org> wrote:
> 
> Hello,
> 
> On Sun, Oct 16, 2022 at 6:33 AM Athira Rajeev
> <atrajeev@linux.vnet.ibm.com> wrote:
>> 
>> 
>> 
>>> On 14-Oct-2022, at 11:45 AM, Namhyung Kim <namhyung@kernel.org> wrote:
>>> 
>>> The aggr field in the struct perf_counts is to keep the aggregated value
>>> in the AGGR_GLOBAL for the old code.  But it's not used anymore.
>>> 
>>> Acked-by: Ian Rogers <irogers@google.com>
>>> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
>>> ---
>>> tools/perf/util/counts.c |  1 -
>>> tools/perf/util/counts.h |  1 -
>>> tools/perf/util/stat.c   | 35 ++---------------------------------
>>> 3 files changed, 2 insertions(+), 35 deletions(-)
>>> 
>>> diff --git a/tools/perf/util/counts.c b/tools/perf/util/counts.c
>>> index 7a447d918458..11cd85b278a6 100644
>>> --- a/tools/perf/util/counts.c
>>> +++ b/tools/perf/util/counts.c
>>> @@ -48,7 +48,6 @@ void perf_counts__reset(struct perf_counts *counts)
>>> {
>>>      xyarray__reset(counts->loaded);
>>>      xyarray__reset(counts->values);
>>> -     memset(&counts->aggr, 0, sizeof(struct perf_counts_values));
>>> }
>>> 
>>> void evsel__reset_counts(struct evsel *evsel)
>>> diff --git a/tools/perf/util/counts.h b/tools/perf/util/counts.h
>>> index 5de275194f2b..42760242e0df 100644
>>> --- a/tools/perf/util/counts.h
>>> +++ b/tools/perf/util/counts.h
>>> @@ -11,7 +11,6 @@ struct evsel;
>>> 
>>> struct perf_counts {
>>>      s8                        scaled;
>>> -     struct perf_counts_values aggr;
>>>      struct xyarray            *values;
>>>      struct xyarray            *loaded;
>>> };
>>> diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
>>> index 14c45f4cfdd3..6ab9c58beca7 100644
>>> --- a/tools/perf/util/stat.c
>>> +++ b/tools/perf/util/stat.c
>>> @@ -308,8 +308,6 @@ static void evsel__copy_prev_raw_counts(struct evsel *evsel)
>>>                              *perf_counts(evsel->prev_raw_counts, idx, thread);
>>>              }
>>>      }
>>> -
>>> -     evsel->counts->aggr = evsel->prev_raw_counts->aggr;
>>> }
>>> 
>>> void evlist__copy_prev_raw_counts(struct evlist *evlist)
>>> @@ -320,26 +318,6 @@ void evlist__copy_prev_raw_counts(struct evlist *evlist)
>>>              evsel__copy_prev_raw_counts(evsel);
>>> }
>>> 
>>> -void evlist__save_aggr_prev_raw_counts(struct evlist *evlist)
>>> -{
>>> -     struct evsel *evsel;
>>> -
>>> -     /*
>>> -      * To collect the overall statistics for interval mode,
>>> -      * we copy the counts from evsel->prev_raw_counts to
>>> -      * evsel->counts. The perf_stat_process_counter creates
>>> -      * aggr values from per cpu values, but the per cpu values
>>> -      * are 0 for AGGR_GLOBAL. So we use a trick that saves the
>>> -      * previous aggr value to the first member of perf_counts,
>>> -      * then aggr calculation in process_counter_values can work
>>> -      * correctly.
>>> -      */
>>> -     evlist__for_each_entry(evlist, evsel) {
>>> -             *perf_counts(evsel->prev_raw_counts, 0, 0) =
>>> -                     evsel->prev_raw_counts->aggr;
>>> -     }
>>> -}
>>> -
>>> static size_t pkg_id_hash(const void *__key, void *ctx __maybe_unused)
>>> {
>>>      uint64_t *key = (uint64_t *) __key;
>>> @@ -423,7 +401,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
>>>                     int cpu_map_idx, int thread,
>>>                     struct perf_counts_values *count)
>>> {
>>> -     struct perf_counts_values *aggr = &evsel->counts->aggr;
>>>      struct perf_stat_evsel *ps = evsel->stats;
>>>      static struct perf_counts_values zero;
>>>      bool skip = false;
>>> @@ -493,12 +470,6 @@ process_counter_values(struct perf_stat_config *config, struct evsel *evsel,
>>>              }
>>>      }
>>> 
>>> -     if (config->aggr_mode == AGGR_GLOBAL) {
>>> -             aggr->val += count->val;
>>> -             aggr->ena += count->ena;
>>> -             aggr->run += count->run;
>>> -     }
>>> -
>>>      return 0;
>>> }
>>> 
>>> @@ -523,13 +494,10 @@ static int process_counter_maps(struct perf_stat_config *config,
>>> int perf_stat_process_counter(struct perf_stat_config *config,
>>>                            struct evsel *counter)
>>> {
>>> -     struct perf_counts_values *aggr = &counter->counts->aggr;
>>>      struct perf_stat_evsel *ps = counter->stats;
>>> -     u64 *count = counter->counts->aggr.values;
>>> +     u64 *count;
>>>      int ret;
>>> 
>>> -     aggr->val = aggr->ena = aggr->run = 0;
>>> -
>>>      if (counter->per_pkg)
>>>              evsel__zero_per_pkg(counter);
>>> 
>>> @@ -540,6 +508,7 @@ int perf_stat_process_counter(struct perf_stat_config *config,
>>>      if (config->aggr_mode != AGGR_GLOBAL)
>>>              return 0;
>>> 
>>> +     count = ps->aggr[0].counts.values;
>> 
>> Hi Namhyung,
>> 
>> We are using ps->aggr[0] here always. Can you please clarify on why first index is used here always.
> 
> Sure, the AGGR_GLOBAL should have a single entry map because
> theaggr_cpu_id__global() always returns the same value.  So we
> can use the index 0 safely.  I'll add a comment.

Hi Namhyung,
Sure, Thanks for the clarification.

Athira
> 
> Thanks,
> Namhyung