* [PATCH v3 0/3] libperf: Unify scaling of counters obtained from perf_evsel__read()
@ 2021-11-09 8:58 Shunsuke Nakamura
2021-11-09 8:58 ` [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf Shunsuke Nakamura
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Shunsuke Nakamura @ 2021-11-09 8:58 UTC (permalink / raw)
To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
namhyung, robh
Cc: linux-kernel, linux-perf-users
This patch series unifies the counters that can be obtained from
perf_evsel__read() to "no scaling".
The counter scaling will be done using a function moved from
tools/perf/util.
The first patch move perf_counts_values__scale from tools/perf/util
to tools/lib/perf so that it can be used with libperf.
The second patch removes the scaling process from
perf_mmap__read_self().
The third patch adds a verification test to make sure that it scales
correctly when multiplexed.
---
Previous version at:
https://lore.kernel.org/linux-perf-users/20210922101627.3396398-1-nakamura.shun@fujitsu.com/
Changes in v3:
- Move scaling process from tools/perf/util to tools/lib/perf
- Remove scaling process from perf_mmap__read_self()
- Remove scaling process for perf_mmap__read_self
- Remove test to verify that no division by zero occurs
Changes in v2:
- Fix not to divide by zero when counter scaling
- Add test to verify that no division by zero occurs
[1] https://github.com/deater/perf_event_tests/blob/master/tests/rdpmc/rdpmc_multiplexing.c
Shunsuke Nakamura (3):
libperf: Move perf_counts_values__scale to tools/lib/perf
libperf: Remove scaling process from perf_mmap__read_self()
libperf tests: Add test_stat_multiplexing test
tools/lib/perf/evsel.c | 19 ++++
tools/lib/perf/include/perf/evsel.h | 4 +
tools/lib/perf/libperf.map | 1 +
tools/lib/perf/mmap.c | 2 -
tools/lib/perf/tests/test-evlist.c | 157 ++++++++++++++++++++++++++++
tools/perf/util/evsel.c | 19 ----
tools/perf/util/evsel.h | 3 -
7 files changed, 181 insertions(+), 24 deletions(-)
--
2.27.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf 2021-11-09 8:58 [PATCH v3 0/3] libperf: Unify scaling of counters obtained from perf_evsel__read() Shunsuke Nakamura @ 2021-11-09 8:58 ` Shunsuke Nakamura 2021-11-14 16:19 ` Jiri Olsa 2021-11-09 8:58 ` [PATCH v3 2/3] libperf: Remove scaling process from perf_mmap__read_self() Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 3/3] libperf tests: Add test_stat_multiplexing test Shunsuke Nakamura 2 siblings, 1 reply; 7+ messages in thread From: Shunsuke Nakamura @ 2021-11-09 8:58 UTC (permalink / raw) To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung, robh Cc: linux-kernel, linux-perf-users Move perf_counts_values__scale from tools/perf/util to tools/lib/perf so that it can be used with libperf. Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> --- tools/lib/perf/evsel.c | 19 +++++++++++++++++++ tools/lib/perf/include/perf/evsel.h | 4 ++++ tools/lib/perf/libperf.map | 1 + tools/perf/util/evsel.c | 19 ------------------- tools/perf/util/evsel.h | 3 --- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 8441e3e1aaac..5097aadea37a 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -431,3 +431,22 @@ void perf_evsel__free_id(struct perf_evsel *evsel) zfree(&evsel->id); evsel->ids = 0; } + +void perf_counts_values__scale(struct perf_counts_values *count, + bool scale, s8 *pscaled) +{ + s8 scaled = 0; + + if (scale) { + if (count->run == 0) { + scaled = -1; + count->val = 0; + } else if (count->run < count->ena) { + scaled = 1; + count->val = (u64)((double)count->val * count->ena / count->run); + } + } + + if (pscaled) + *pscaled = scaled; +} diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h index 60eae25076d3..9013d73af22d 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -4,6 +4,8 @@ #include <stdint.h> #include <perf/core.h> +#include <stdbool.h> +#include <linux/types.h> struct perf_evsel; struct perf_event_attr; @@ -39,5 +41,7 @@ LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); +LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *count, + bool scale, s8 *pscaled); #endif /* __LIBPERF_EVSEL_H */ diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map index 71468606e8a7..5979bf92d98f 100644 --- a/tools/lib/perf/libperf.map +++ b/tools/lib/perf/libperf.map @@ -50,6 +50,7 @@ LIBPERF_0.0.1 { perf_mmap__read_init; perf_mmap__read_done; perf_mmap__read_event; + perf_counts_values__scale; local: *; }; diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index dbfeceb2546c..49e4d0bdd7cc 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1457,25 +1457,6 @@ void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, count->run = count->run - tmp.run; } -void perf_counts_values__scale(struct perf_counts_values *count, - bool scale, s8 *pscaled) -{ - s8 scaled = 0; - - if (scale) { - if (count->run == 0) { - scaled = -1; - count->val = 0; - } else if (count->run < count->ena) { - scaled = 1; - count->val = (u64)((double) count->val * count->ena / count->run); - } - } - - if (pscaled) - *pscaled = scaled; -} - static int evsel__read_one(struct evsel *evsel, int cpu, int thread) { struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread); diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 1f7edfa8568a..8a6a4182c5fd 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -190,9 +190,6 @@ static inline int evsel__nr_cpus(struct evsel *evsel) return evsel__cpus(evsel)->nr; } -void perf_counts_values__scale(struct perf_counts_values *count, - bool scale, s8 *pscaled); - void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, struct perf_counts_values *count); -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf 2021-11-09 8:58 ` [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf Shunsuke Nakamura @ 2021-11-14 16:19 ` Jiri Olsa 2021-11-17 14:57 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 7+ messages in thread From: Jiri Olsa @ 2021-11-14 16:19 UTC (permalink / raw) To: Shunsuke Nakamura Cc: peterz, mingo, acme, mark.rutland, alexander.shishkin, namhyung, robh, linux-kernel, linux-perf-users On Tue, Nov 09, 2021 at 05:58:29PM +0900, Shunsuke Nakamura wrote: > Move perf_counts_values__scale from tools/perf/util to tools/lib/perf > so that it can be used with libperf. > > Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> > --- > tools/lib/perf/evsel.c | 19 +++++++++++++++++++ > tools/lib/perf/include/perf/evsel.h | 4 ++++ > tools/lib/perf/libperf.map | 1 + > tools/perf/util/evsel.c | 19 ------------------- > tools/perf/util/evsel.h | 3 --- > 5 files changed, 24 insertions(+), 22 deletions(-) > > diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c > index 8441e3e1aaac..5097aadea37a 100644 > --- a/tools/lib/perf/evsel.c > +++ b/tools/lib/perf/evsel.c > @@ -431,3 +431,22 @@ void perf_evsel__free_id(struct perf_evsel *evsel) > zfree(&evsel->id); > evsel->ids = 0; > } > + > +void perf_counts_values__scale(struct perf_counts_values *count, > + bool scale, s8 *pscaled) > +{ > + s8 scaled = 0; > + > + if (scale) { > + if (count->run == 0) { > + scaled = -1; > + count->val = 0; > + } else if (count->run < count->ena) { > + scaled = 1; > + count->val = (u64)((double)count->val * count->ena / count->run); > + } > + } > + > + if (pscaled) > + *pscaled = scaled; > +} > diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h > index 60eae25076d3..9013d73af22d 100644 > --- a/tools/lib/perf/include/perf/evsel.h > +++ b/tools/lib/perf/include/perf/evsel.h > @@ -4,6 +4,8 @@ > > #include <stdint.h> > #include <perf/core.h> > +#include <stdbool.h> > +#include <linux/types.h> > > struct perf_evsel; > struct perf_event_attr; > @@ -39,5 +41,7 @@ LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); > LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); > LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); > LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); > +LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *count, > + bool scale, s8 *pscaled); not sure if we should use __s8 for pscaled now when it's exported? it's just we use it everywhere else with '__' prefix, I forgot what's the difference actually ;-) but other that all looks good, for the patchset: Acked-by: Jiri Olsa <jolsa@kernel.org> thanks, jirka > > #endif /* __LIBPERF_EVSEL_H */ > diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map > index 71468606e8a7..5979bf92d98f 100644 > --- a/tools/lib/perf/libperf.map > +++ b/tools/lib/perf/libperf.map > @@ -50,6 +50,7 @@ LIBPERF_0.0.1 { > perf_mmap__read_init; > perf_mmap__read_done; > perf_mmap__read_event; > + perf_counts_values__scale; > local: > *; > }; > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c > index dbfeceb2546c..49e4d0bdd7cc 100644 > --- a/tools/perf/util/evsel.c > +++ b/tools/perf/util/evsel.c > @@ -1457,25 +1457,6 @@ void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, > count->run = count->run - tmp.run; > } > > -void perf_counts_values__scale(struct perf_counts_values *count, > - bool scale, s8 *pscaled) > -{ > - s8 scaled = 0; > - > - if (scale) { > - if (count->run == 0) { > - scaled = -1; > - count->val = 0; > - } else if (count->run < count->ena) { > - scaled = 1; > - count->val = (u64)((double) count->val * count->ena / count->run); > - } > - } > - > - if (pscaled) > - *pscaled = scaled; > -} > - > static int evsel__read_one(struct evsel *evsel, int cpu, int thread) > { > struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread); > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h > index 1f7edfa8568a..8a6a4182c5fd 100644 > --- a/tools/perf/util/evsel.h > +++ b/tools/perf/util/evsel.h > @@ -190,9 +190,6 @@ static inline int evsel__nr_cpus(struct evsel *evsel) > return evsel__cpus(evsel)->nr; > } > > -void perf_counts_values__scale(struct perf_counts_values *count, > - bool scale, s8 *pscaled); > - > void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, > struct perf_counts_values *count); > > -- > 2.27.0 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf 2021-11-14 16:19 ` Jiri Olsa @ 2021-11-17 14:57 ` Arnaldo Carvalho de Melo 2021-11-29 7:59 ` nakamura.shun 0 siblings, 1 reply; 7+ messages in thread From: Arnaldo Carvalho de Melo @ 2021-11-17 14:57 UTC (permalink / raw) To: Jiri Olsa Cc: Shunsuke Nakamura, peterz, mingo, mark.rutland, alexander.shishkin, namhyung, robh, linux-kernel, linux-perf-users Em Sun, Nov 14, 2021 at 05:19:45PM +0100, Jiri Olsa escreveu: > On Tue, Nov 09, 2021 at 05:58:29PM +0900, Shunsuke Nakamura wrote: > > Move perf_counts_values__scale from tools/perf/util to tools/lib/perf > > so that it can be used with libperf. > > > > Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> > > --- > > tools/lib/perf/evsel.c | 19 +++++++++++++++++++ > > tools/lib/perf/include/perf/evsel.h | 4 ++++ > > tools/lib/perf/libperf.map | 1 + > > tools/perf/util/evsel.c | 19 ------------------- > > tools/perf/util/evsel.h | 3 --- > > 5 files changed, 24 insertions(+), 22 deletions(-) > > > > diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c > > index 8441e3e1aaac..5097aadea37a 100644 > > --- a/tools/lib/perf/evsel.c > > +++ b/tools/lib/perf/evsel.c > > @@ -431,3 +431,22 @@ void perf_evsel__free_id(struct perf_evsel *evsel) > > zfree(&evsel->id); > > evsel->ids = 0; > > } > > + > > +void perf_counts_values__scale(struct perf_counts_values *count, > > + bool scale, s8 *pscaled) > > +{ > > + s8 scaled = 0; > > + > > + if (scale) { > > + if (count->run == 0) { > > + scaled = -1; > > + count->val = 0; > > + } else if (count->run < count->ena) { > > + scaled = 1; > > + count->val = (u64)((double)count->val * count->ena / count->run); > > + } > > + } > > + > > + if (pscaled) > > + *pscaled = scaled; > > +} > > diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h > > index 60eae25076d3..9013d73af22d 100644 > > --- a/tools/lib/perf/include/perf/evsel.h > > +++ b/tools/lib/perf/include/perf/evsel.h > > @@ -4,6 +4,8 @@ > > > > #include <stdint.h> > > #include <perf/core.h> > > +#include <stdbool.h> > > +#include <linux/types.h> > > > > struct perf_evsel; > > struct perf_event_attr; > > @@ -39,5 +41,7 @@ LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); > > LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); > > LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); > > LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); > > +LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *count, > > + bool scale, s8 *pscaled); > > not sure if we should use __s8 for pscaled now when it's exported? > it's just we use it everywhere else with '__' prefix, I forgot what's > the difference actually ;-) I'm moving this to be __s8, following what is being used in tools/lib/bpf/bpf.h. > but other that all looks good, for the patchset: > > Acked-by: Jiri Olsa <jolsa@kernel.org> > > thanks, > jirka > > > > > > #endif /* __LIBPERF_EVSEL_H */ > > diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map > > index 71468606e8a7..5979bf92d98f 100644 > > --- a/tools/lib/perf/libperf.map > > +++ b/tools/lib/perf/libperf.map > > @@ -50,6 +50,7 @@ LIBPERF_0.0.1 { > > perf_mmap__read_init; > > perf_mmap__read_done; > > perf_mmap__read_event; > > + perf_counts_values__scale; > > local: > > *; > > }; > > diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c > > index dbfeceb2546c..49e4d0bdd7cc 100644 > > --- a/tools/perf/util/evsel.c > > +++ b/tools/perf/util/evsel.c > > @@ -1457,25 +1457,6 @@ void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, > > count->run = count->run - tmp.run; > > } > > > > -void perf_counts_values__scale(struct perf_counts_values *count, > > - bool scale, s8 *pscaled) > > -{ > > - s8 scaled = 0; > > - > > - if (scale) { > > - if (count->run == 0) { > > - scaled = -1; > > - count->val = 0; > > - } else if (count->run < count->ena) { > > - scaled = 1; > > - count->val = (u64)((double) count->val * count->ena / count->run); > > - } > > - } > > - > > - if (pscaled) > > - *pscaled = scaled; > > -} > > - > > static int evsel__read_one(struct evsel *evsel, int cpu, int thread) > > { > > struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread); > > diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h > > index 1f7edfa8568a..8a6a4182c5fd 100644 > > --- a/tools/perf/util/evsel.h > > +++ b/tools/perf/util/evsel.h > > @@ -190,9 +190,6 @@ static inline int evsel__nr_cpus(struct evsel *evsel) > > return evsel__cpus(evsel)->nr; > > } > > > > -void perf_counts_values__scale(struct perf_counts_values *count, > > - bool scale, s8 *pscaled); > > - > > void evsel__compute_deltas(struct evsel *evsel, int cpu, int thread, > > struct perf_counts_values *count); > > > > -- > > 2.27.0 > > -- - Arnaldo ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf 2021-11-17 14:57 ` Arnaldo Carvalho de Melo @ 2021-11-29 7:59 ` nakamura.shun 0 siblings, 0 replies; 7+ messages in thread From: nakamura.shun @ 2021-11-29 7:59 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Jiri Olsa Cc: peterz@infradead.org, mingo@redhat.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, namhyung@kernel.org, robh@kernel.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Hi Arnaldo, jirka Sorry for the late reply. Em Sun, Nov 14, 2021 at 05:19:45PM +0100, Jiri Olsa escreveu: > > On Tue, Nov 09, 2021 at 05:58:29PM +0900, Shunsuke Nakamura wrote: > > > Move perf_counts_values__scale from tools/perf/util to tools/lib/perf > > > so that it can be used with libperf. > > > > > > Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> > > > --- > > > tools/lib/perf/evsel.c | 19 +++++++++++++++++++ > > > tools/lib/perf/include/perf/evsel.h | 4 ++++ > > > tools/lib/perf/libperf.map | 1 + > > > tools/perf/util/evsel.c | 19 ------------------- > > > tools/perf/util/evsel.h | 3 --- > > > 5 files changed, 24 insertions(+), 22 deletions(-) > > > > > > diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c > > > index 8441e3e1aaac..5097aadea37a 100644 > > > --- a/tools/lib/perf/evsel.c > > > +++ b/tools/lib/perf/evsel.c > > > @@ -431,3 +431,22 @@ void perf_evsel__free_id(struct perf_evsel *evsel) > > > zfree(&evsel->id); > > > evsel->ids = 0; > > > } > > > + > > > +void perf_counts_values__scale(struct perf_counts_values *count, > > > + bool scale, s8 *pscaled) > > > +{ > > > + s8 scaled = 0; > > > + > > > + if (scale) { > > > + if (count->run == 0) { > > > + scaled = -1; > > > + count->val = 0; > > > + } else if (count->run < count->ena) { > > > + scaled = 1; > > > + count->val = (u64)((double)count->val * count->ena / count->run); > > > + } > > > + } > > > + > > > + if (pscaled) > > > + *pscaled = scaled; > > > +} > > > diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h > > > index 60eae25076d3..9013d73af22d 100644 > > > --- a/tools/lib/perf/include/perf/evsel.h > > > +++ b/tools/lib/perf/include/perf/evsel.h > > > @@ -4,6 +4,8 @@ > > > > > > #include <stdint.h> > > > #include <perf/core.h> > > > +#include <stdbool.h> > > > +#include <linux/types.h> > > > > > > struct perf_evsel; > > > struct perf_event_attr; > > > @@ -39,5 +41,7 @@ LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); > > > LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); > > > LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); > > > LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); > > > +LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *count, > > > + bool scale, s8 *pscaled); > > > > not sure if we should use __s8 for pscaled now when it's exported? > > it's just we use it everywhere else with '__' prefix, I forgot what's > > the difference actually ;-) > > I'm moving this to be __s8, following what is being used in > tools/lib/bpf/bpf.h. I will fix it. > > but other that all looks good, for the patchset: > > > > Acked-by: Jiri Olsa <jolsa@kernel.org> Thanks for review. Best Regards Shunsuke ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/3] libperf: Remove scaling process from perf_mmap__read_self() 2021-11-09 8:58 [PATCH v3 0/3] libperf: Unify scaling of counters obtained from perf_evsel__read() Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf Shunsuke Nakamura @ 2021-11-09 8:58 ` Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 3/3] libperf tests: Add test_stat_multiplexing test Shunsuke Nakamura 2 siblings, 0 replies; 7+ messages in thread From: Shunsuke Nakamura @ 2021-11-09 8:58 UTC (permalink / raw) To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung, robh Cc: linux-kernel, linux-perf-users Remove the scaling process from perf_mmap__read_self(), and unify the counters that can be obtained from perf_evsel__read() to "no scaling". Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> --- tools/lib/perf/mmap.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/lib/perf/mmap.c b/tools/lib/perf/mmap.c index c89dfa5f67b3..aaa457904008 100644 --- a/tools/lib/perf/mmap.c +++ b/tools/lib/perf/mmap.c @@ -353,8 +353,6 @@ int perf_mmap__read_self(struct perf_mmap *map, struct perf_counts_values *count count->ena += delta; if (idx) count->run += delta; - - cnt = mul_u64_u64_div64(cnt, count->ena, count->run); } count->val = cnt; -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/3] libperf tests: Add test_stat_multiplexing test 2021-11-09 8:58 [PATCH v3 0/3] libperf: Unify scaling of counters obtained from perf_evsel__read() Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 2/3] libperf: Remove scaling process from perf_mmap__read_self() Shunsuke Nakamura @ 2021-11-09 8:58 ` Shunsuke Nakamura 2 siblings, 0 replies; 7+ messages in thread From: Shunsuke Nakamura @ 2021-11-09 8:58 UTC (permalink / raw) To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung, robh Cc: linux-kernel, linux-perf-users Adds a test for a counter obtained using read() system call during multiplexing. Committer testing: $ sudo make tests -C ./tools/lib/perf/ V=1 make: Entering directory '/home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/lib/perf' make -f /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/build/Makefile.build dir=. obj=libperf make -C /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/lib/api/ O= libapi.a make -f /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/build/Makefile.build dir=./fd obj=libapi make -f /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/build/Makefile.build dir=./fs obj=libapi make -f /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/build/Makefile.build dir=. obj=tests make -f /home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/build/Makefile.build dir=./tests obj=tests running static: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... Event 0 -- Raw count = 298049842, run = 270269503, enable = 456262127 Scaled count = 503160191 (59.24%, 270269503/456262127) Event 1 -- Raw count = 299134173, run = 271075173, enable = 456257234 Scaled count = 503484435 (59.41%, 271075173/456257234) Event 2 -- Raw count = 300461996, run = 272069283, enable = 456253417 Scaled count = 503867290 (59.63%, 272069283/456253417) Event 3 -- Raw count = 301308704, run = 273063387, enable = 456249352 Scaled count = 503443183 (59.85%, 273063387/456249352) Event 4 -- Raw count = 302531164, run = 274102932, enable = 456244712 Scaled count = 503563543 (60.08%, 274102932/456244712) Event 5 -- Raw count = 303710254, run = 275406214, enable = 456228165 Scaled count = 503115633 (60.37%, 275406214/456228165) Event 6 -- Raw count = 304531302, run = 276396076, enable = 456221130 Scaled count = 502661313 (60.58%, 276396076/456221130) Event 7 -- Raw count = 304486460, run = 276601890, enable = 456213754 Scaled count = 502205212 (60.63%, 276601890/456213754) Event 8 -- Raw count = 304116681, run = 276631326, enable = 456205562 Scaled count = 501532936 (60.64%, 276631326/456205562) Event 9 -- Raw count = 303567766, run = 276188567, enable = 456196839 Scaled count = 501420666 (60.54%, 276188567/456196839) Event 10 -- Raw count = 302238014, run = 275144001, enable = 456185300 Scaled count = 501106833 (60.31%, 275144001/456185300) Event 11 -- Raw count = 300805716, run = 273824589, enable = 456175608 Scaled count = 501124573 (60.03%, 273824589/456175608) Event 12 -- Raw count = 299959051, run = 272834556, enable = 456166593 Scaled count = 501517477 (59.81%, 272834556/456166593) Event 13 -- Raw count = 299037090, run = 271820805, enable = 456157086 Scaled count = 501830195 (59.59%, 271820805/456157086) Event 14 -- Raw count = 298327042, run = 270784311, enable = 456147546 Scaled count = 502544433 (59.36%, 270784311/456147546) Expected: 501614268 High: 503867290 Low: 298049842 Average: 502438527 Average Error = 0.16% OK - running tests/test-evsel.c... loop = 65536, count = 328182 loop = 131072, count = 660214 loop = 262144, count = 1315534 loop = 524288, count = 2635364 loop = 1048576, count = 5271971 loop = 65536, count = 491952 loop = 131072, count = 850061 loop = 262144, count = 1648608 loop = 524288, count = 3162059 loop = 1048576, count = 6353393 OK running dynamic: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... Event 0 -- Raw count = 300218292, run = 297528154, enable = 496789343 Scaled count = 501281125 (59.89%, 297528154/496789343) Event 1 -- Raw count = 301438606, run = 298515328, enable = 496784768 Scaled count = 501649643 (60.09%, 298515328/496784768) Event 2 -- Raw count = 302342618, run = 298798983, enable = 496782015 Scaled count = 502673648 (60.15%, 298798983/496782015) Event 3 -- Raw count = 303132319, run = 299230407, enable = 496778508 Scaled count = 503256412 (60.23%, 299230407/496778508) Event 4 -- Raw count = 302758195, run = 299218047, enable = 496774243 Scaled count = 502651743 (60.23%, 299218047/496774243) Event 5 -- Raw count = 303158458, run = 299204274, enable = 496769146 Scaled count = 503334281 (60.23%, 299204274/496769146) Event 6 -- Raw count = 303471397, run = 299197479, enable = 496763124 Scaled count = 503859189 (60.23%, 299197479/496763124) Event 7 -- Raw count = 303583387, run = 299196861, enable = 496756458 Scaled count = 504039405 (60.23%, 299196861/496756458) Event 8 -- Raw count = 303096897, run = 299186924, enable = 496748667 Scaled count = 503240507 (60.23%, 299186924/496748667) Event 9 -- Raw count = 301424173, run = 297845086, enable = 496739994 Scaled count = 502709122 (59.96%, 297845086/496739994) Event 10 -- Raw count = 300876415, run = 296851339, enable = 496729034 Scaled count = 503464297 (59.76%, 296851339/496729034) Event 11 -- Raw count = 300239338, run = 296547963, enable = 496719538 Scaled count = 502902612 (59.70%, 296547963/496719538) Event 12 -- Raw count = 299751948, run = 296547195, enable = 496710036 Scaled count = 502077926 (59.70%, 296547195/496710036) Event 13 -- Raw count = 299341883, run = 296549981, enable = 496700423 Scaled count = 501376663 (59.70%, 296549981/496700423) Event 14 -- Raw count = 299145476, run = 296561684, enable = 496690949 Scaled count = 501018366 (59.71%, 296561684/496690949) Expected: 501669431 High: 504039405 Low: 300218292 Average: 502635662 Average Error = 0.19% OK - running tests/test-evsel.c... loop = 65536, count = 329275 loop = 131072, count = 664638 loop = 262144, count = 1315367 loop = 524288, count = 2629617 loop = 1048576, count = 5273657 loop = 65536, count = 459641 loop = 131072, count = 978402 loop = 262144, count = 1581219 loop = 524288, count = 3774908 loop = 1048576, count = 7694417 OK make: Leaving directory '/home/nakamura/build_work/build_kernel/linux_kernel/linux/tools/lib/perf' Signed-off-by: Shunsuke Nakamura <nakamura.shun@fujitsu.com> --- tools/lib/perf/tests/test-evlist.c | 157 +++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test-evlist.c index ce91a582f0e4..520a78267743 100644 --- a/tools/lib/perf/tests/test-evlist.c +++ b/tools/lib/perf/tests/test-evlist.c @@ -21,6 +21,9 @@ #include "tests.h" #include <internal/evsel.h> +#define EVENT_NUM 15 +#define WAIT_COUNT 100000000UL + static int libperf_print(enum libperf_print_level level, const char *fmt, va_list ap) { @@ -413,6 +416,159 @@ static int test_mmap_cpus(void) return 0; } +static double display_error(long long average, + long long high, + long long low, + long long expected) +{ + double error; + + error = (((double)average - expected) / expected) * 100.0; + + __T_VERBOSE(" Expected: %lld\n", expected); + __T_VERBOSE(" High: %lld Low: %lld Average: %lld\n", + high, low, average); + + __T_VERBOSE(" Average Error = %.2f%%\n", error); + + return error; +} + +static int test_stat_multiplexing(void) +{ + struct perf_counts_values expected_counts = { .val = 0 }; + struct perf_counts_values counts[EVENT_NUM] = {{ .val = 0 },}; + struct perf_thread_map *threads; + struct perf_evlist *evlist; + struct perf_evsel *evsel; + struct perf_event_attr attr = { + .type = PERF_TYPE_HARDWARE, + .config = PERF_COUNT_HW_INSTRUCTIONS, + .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | + PERF_FORMAT_TOTAL_TIME_RUNNING, + .disabled = 1, + }; + int err, i, nonzero = 0; + unsigned long count; + long long max = 0, min = 0, avg = 0; + double error = 0.0; + s8 scaled = 0; + + /* read for non-multiplexing event count */ + threads = perf_thread_map__new_dummy(); + __T("failed to create threads", threads); + + perf_thread_map__set_pid(threads, 0, 0); + + evsel = perf_evsel__new(&attr); + __T("failed to create evsel", evsel); + + err = perf_evsel__open(evsel, NULL, threads); + __T("failed to open evsel", err == 0); + + err = perf_evsel__enable(evsel); + __T("failed to enable evsel", err == 0); + + /* wait loop */ + count = WAIT_COUNT; + while (count--) + ; + + perf_evsel__read(evsel, 0, 0, &expected_counts); + __T("failed to read value for evsel", expected_counts.val != 0); + __T("failed to read non-multiplexing event count", + expected_counts.ena == expected_counts.run); + + err = perf_evsel__disable(evsel); + __T("failed to enable evsel", err == 0); + + perf_evsel__close(evsel); + perf_evsel__delete(evsel); + + perf_thread_map__put(threads); + + /* read for multiplexing event count */ + threads = perf_thread_map__new_dummy(); + __T("failed to create threads", threads); + + perf_thread_map__set_pid(threads, 0, 0); + + evlist = perf_evlist__new(); + __T("failed to create evlist", evlist); + + for (i = 0; i < EVENT_NUM; i++) { + evsel = perf_evsel__new(&attr); + __T("failed to create evsel", evsel); + + perf_evlist__add(evlist, evsel); + } + perf_evlist__set_maps(evlist, NULL, threads); + + err = perf_evlist__open(evlist); + __T("failed to open evsel", err == 0); + + perf_evlist__enable(evlist); + + /* wait loop */ + count = WAIT_COUNT; + while (count--) + ; + + i = 0; + perf_evlist__for_each_evsel(evlist, evsel) { + perf_evsel__read(evsel, 0, 0, &counts[i]); + __T("failed to read value for evsel", counts[i].val != 0); + i++; + } + + perf_evlist__disable(evlist); + + min = counts[0].val; + for (i = 0; i < EVENT_NUM; i++) { + __T_VERBOSE("Event %2d -- Raw count = %lu, run = %lu, enable = %lu\n", + i, counts[i].val, counts[i].run, counts[i].ena); + + perf_counts_values__scale(&counts[i], true, &scaled); + if (scaled == 1) { + __T_VERBOSE("\t Scaled count = %lu (%.2lf%%, %lu/%lu)\n", + counts[i].val, + (double)counts[i].run / (double)counts[i].ena * 100.0, + counts[i].run, counts[i].ena); + } else if (scaled == -1) { + __T_VERBOSE("\t Not Runnnig\n"); + } else { + __T_VERBOSE("\t Not Scaling\n"); + } + + if (counts[i].val > max) + max = counts[i].val; + + if (counts[i].val < min) + min = counts[i].val; + + avg += counts[i].val; + + if (counts[i].val != 0) + nonzero++; + } + + if (nonzero != 0) + avg = avg / nonzero; + else + avg = 0; + + error = display_error(avg, max, min, expected_counts.val); + + __T("Error out of range!", ((error <= 1.0) && (error >= -1.0))); + + perf_evlist__close(evlist); + perf_evlist__delete(evlist); + + perf_thread_map__put(threads); + + return 0; +} + int test_evlist(int argc, char **argv) { __T_START; @@ -424,6 +580,7 @@ int test_evlist(int argc, char **argv) test_stat_thread_enable(); test_mmap_thread(); test_mmap_cpus(); + test_stat_multiplexing(); __T_END; return tests_failed == 0 ? 0 : -1; -- 2.27.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-11-29 8:01 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-11-09 8:58 [PATCH v3 0/3] libperf: Unify scaling of counters obtained from perf_evsel__read() Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 1/3] libperf: Move perf_counts_values__scale to tools/lib/perf Shunsuke Nakamura 2021-11-14 16:19 ` Jiri Olsa 2021-11-17 14:57 ` Arnaldo Carvalho de Melo 2021-11-29 7:59 ` nakamura.shun 2021-11-09 8:58 ` [PATCH v3 2/3] libperf: Remove scaling process from perf_mmap__read_self() Shunsuke Nakamura 2021-11-09 8:58 ` [PATCH v3 3/3] libperf tests: Add test_stat_multiplexing test Shunsuke Nakamura
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.