From: Jiri Olsa <jolsa@redhat.com> To: Rob Herring <robh@kernel.org> Cc: Will Deacon <will@kernel.org>, Catalin Marinas <catalin.marinas@arm.com>, Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@redhat.com>, Arnaldo Carvalho de Melo <acme@kernel.org>, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Namhyung Kim <namhyung@kernel.org>, Raphael Gault <raphael.gault@arm.com>, Mark Rutland <mark.rutland@arm.com>, Jonathan Cameron <Jonathan.Cameron@huawei.com>, Ian Rogers <irogers@google.com>, honnappa.nagarahalli@arm.com Subject: Re: [PATCH v2 5/9] libperf: Add support for user space counter access Date: Mon, 31 Aug 2020 11:11:23 +0200 [thread overview] Message-ID: <20200831091123.GB406859@krava> (raw) In-Reply-To: <20200828205614.3391252-6-robh@kernel.org> On Fri, Aug 28, 2020 at 02:56:10PM -0600, Rob Herring wrote: SNIP > #endif /* __LIBPERF_INTERNAL_MMAP_H */ > diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h > index c82ec39a4ad0..6d0da962870c 100644 > --- a/tools/lib/perf/include/perf/evsel.h > +++ b/tools/lib/perf/include/perf/evsel.h > @@ -27,6 +27,7 @@ LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map * > struct perf_thread_map *threads); > LIBPERF_API void perf_evsel__close(struct perf_evsel *evsel); > LIBPERF_API void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); > +LIBPERF_API void *perf_evsel__mmap(struct perf_evsel *evsel); > LIBPERF_API int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, > struct perf_counts_values *count); > LIBPERF_API int perf_evsel__enable(struct perf_evsel *evsel); > diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map > index 7be1af8a546c..733a0647be8b 100644 > --- a/tools/lib/perf/libperf.map > +++ b/tools/lib/perf/libperf.map > @@ -23,6 +23,7 @@ LIBPERF_0.0.1 { > perf_evsel__disable; > perf_evsel__open; > perf_evsel__close; > + perf_evsel__mmap; > perf_evsel__read; > perf_evsel__cpus; > perf_evsel__threads; please put perf_evsel__mmap changes into separate patch SNIP > +int perf_mmap__read_self(struct perf_mmap *map, struct perf_counts_values *count) > +{ > + struct perf_event_mmap_page *pc = map->base; > + u32 seq, idx, time_mult = 0, time_shift = 0; > + u64 cnt, cyc = 0, time_offset = 0, time_cycles = 0, time_mask = ~0ULL; > + > + BUG_ON(!pc); > + > + if (!pc->cap_user_rdpmc) > + return -1; > + > + do { > + seq = READ_ONCE(pc->lock); > + barrier(); > + > + count->ena = READ_ONCE(pc->time_enabled); > + count->run = READ_ONCE(pc->time_running); > + > + if (pc->cap_user_time && count->ena != count->run) { > + cyc = read_timestamp(); > + time_mult = READ_ONCE(pc->time_mult); > + time_shift = READ_ONCE(pc->time_shift); > + time_offset = READ_ONCE(pc->time_offset); > + > + if (pc->cap_user_time_short) { > + time_cycles = READ_ONCE(pc->time_cycles); > + time_mask = READ_ONCE(pc->time_mask); > + } > + } > + > + idx = READ_ONCE(pc->index); > + cnt = READ_ONCE(pc->offset); > + if (pc->cap_user_rdpmc && idx) { no need to check pc->cap_user_rdpmc again > +static int test_stat_user_read(int event) > +{ > + struct perf_counts_values counts = { .val = 0 }; > + struct perf_thread_map *threads; > + struct perf_evsel *evsel; > + struct perf_event_mmap_page *pc; > + struct perf_event_attr attr = { > + .type = PERF_TYPE_HARDWARE, > + .config = event, > + }; > + int err, i; > + > + 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); > + > + pc = perf_evsel__mmap(evsel); > + __T("failed to mmap evsel", pc); > + > +#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) > + __T("userspace counter access not supported", pc->cap_user_rdpmc); > + __T("userspace counter access not enabled", pc->index); > + __T("userspace counter width not set", pc->pmc_width >= 32); > +#endif > + > + perf_evsel__read(evsel, 0, 0, &counts); > + __T("failed to read value for evsel", counts.val != 0); > + > + fputs("\n", stderr); > + for (i = 0; i < 5; i++) { > + volatile int count = 0x10000 << i; > + __u64 start, end, last = 0; > + > + fprintf(stderr, "\tloop = %u, ", count); we should add support to display verbose output for tests, because right now this breaks the output: - running test-cpumap.c...OK - running test-threadmap.c...OK - running test-evlist.c...OK - running test-evsel.c... loop = 65536, count = 328035 loop = 131072, count = 655715 loop = 262144, count = 1311075 loop = 524288, count = 2627060 loop = 1048576, count = 5253540 loop = 65536, count = 327594 loop = 131072, count = 659930 loop = 262144, count = 1378892 loop = 524288, count = 2664341 loop = 1048576, count = 5365682 OK but we can do it in separate change later thanks, jirka
WARNING: multiple messages have this Message-ID (diff)
From: Jiri Olsa <jolsa@redhat.com> To: Rob Herring <robh@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com>, Ian Rogers <irogers@google.com>, Peter Zijlstra <peterz@infradead.org>, Catalin Marinas <catalin.marinas@arm.com>, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo <acme@kernel.org>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Raphael Gault <raphael.gault@arm.com>, Ingo Molnar <mingo@redhat.com>, honnappa.nagarahalli@arm.com, Jonathan Cameron <Jonathan.Cameron@huawei.com>, Namhyung Kim <namhyung@kernel.org>, Will Deacon <will@kernel.org>, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 5/9] libperf: Add support for user space counter access Date: Mon, 31 Aug 2020 11:11:23 +0200 [thread overview] Message-ID: <20200831091123.GB406859@krava> (raw) In-Reply-To: <20200828205614.3391252-6-robh@kernel.org> On Fri, Aug 28, 2020 at 02:56:10PM -0600, Rob Herring wrote: SNIP > #endif /* __LIBPERF_INTERNAL_MMAP_H */ > diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h > index c82ec39a4ad0..6d0da962870c 100644 > --- a/tools/lib/perf/include/perf/evsel.h > +++ b/tools/lib/perf/include/perf/evsel.h > @@ -27,6 +27,7 @@ LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map * > struct perf_thread_map *threads); > LIBPERF_API void perf_evsel__close(struct perf_evsel *evsel); > LIBPERF_API void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); > +LIBPERF_API void *perf_evsel__mmap(struct perf_evsel *evsel); > LIBPERF_API int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, > struct perf_counts_values *count); > LIBPERF_API int perf_evsel__enable(struct perf_evsel *evsel); > diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map > index 7be1af8a546c..733a0647be8b 100644 > --- a/tools/lib/perf/libperf.map > +++ b/tools/lib/perf/libperf.map > @@ -23,6 +23,7 @@ LIBPERF_0.0.1 { > perf_evsel__disable; > perf_evsel__open; > perf_evsel__close; > + perf_evsel__mmap; > perf_evsel__read; > perf_evsel__cpus; > perf_evsel__threads; please put perf_evsel__mmap changes into separate patch SNIP > +int perf_mmap__read_self(struct perf_mmap *map, struct perf_counts_values *count) > +{ > + struct perf_event_mmap_page *pc = map->base; > + u32 seq, idx, time_mult = 0, time_shift = 0; > + u64 cnt, cyc = 0, time_offset = 0, time_cycles = 0, time_mask = ~0ULL; > + > + BUG_ON(!pc); > + > + if (!pc->cap_user_rdpmc) > + return -1; > + > + do { > + seq = READ_ONCE(pc->lock); > + barrier(); > + > + count->ena = READ_ONCE(pc->time_enabled); > + count->run = READ_ONCE(pc->time_running); > + > + if (pc->cap_user_time && count->ena != count->run) { > + cyc = read_timestamp(); > + time_mult = READ_ONCE(pc->time_mult); > + time_shift = READ_ONCE(pc->time_shift); > + time_offset = READ_ONCE(pc->time_offset); > + > + if (pc->cap_user_time_short) { > + time_cycles = READ_ONCE(pc->time_cycles); > + time_mask = READ_ONCE(pc->time_mask); > + } > + } > + > + idx = READ_ONCE(pc->index); > + cnt = READ_ONCE(pc->offset); > + if (pc->cap_user_rdpmc && idx) { no need to check pc->cap_user_rdpmc again > +static int test_stat_user_read(int event) > +{ > + struct perf_counts_values counts = { .val = 0 }; > + struct perf_thread_map *threads; > + struct perf_evsel *evsel; > + struct perf_event_mmap_page *pc; > + struct perf_event_attr attr = { > + .type = PERF_TYPE_HARDWARE, > + .config = event, > + }; > + int err, i; > + > + 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); > + > + pc = perf_evsel__mmap(evsel); > + __T("failed to mmap evsel", pc); > + > +#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) > + __T("userspace counter access not supported", pc->cap_user_rdpmc); > + __T("userspace counter access not enabled", pc->index); > + __T("userspace counter width not set", pc->pmc_width >= 32); > +#endif > + > + perf_evsel__read(evsel, 0, 0, &counts); > + __T("failed to read value for evsel", counts.val != 0); > + > + fputs("\n", stderr); > + for (i = 0; i < 5; i++) { > + volatile int count = 0x10000 << i; > + __u64 start, end, last = 0; > + > + fprintf(stderr, "\tloop = %u, ", count); we should add support to display verbose output for tests, because right now this breaks the output: - running test-cpumap.c...OK - running test-threadmap.c...OK - running test-evlist.c...OK - running test-evsel.c... loop = 65536, count = 328035 loop = 131072, count = 655715 loop = 262144, count = 1311075 loop = 524288, count = 2627060 loop = 1048576, count = 5253540 loop = 65536, count = 327594 loop = 131072, count = 659930 loop = 262144, count = 1378892 loop = 524288, count = 2664341 loop = 1048576, count = 5365682 OK but we can do it in separate change later thanks, jirka _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-08-31 9:11 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-08-28 20:56 [PATCH v2 0/9] libperf and arm64 userspace counter access support Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 1/9] arm64: pmu: Add hook to handle pmu-related undefined instructions Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 2/9] arm64: pmu: Add function implementation to update event index in userpage Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 3/9] arm64: perf: Enable pmu counter direct access for perf event on armv8 Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 4/9] tools/include: Add an initial math64.h Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 5/9] libperf: Add support for user space counter access Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-31 9:11 ` Jiri Olsa [this message] 2020-08-31 9:11 ` Jiri Olsa 2020-09-02 16:58 ` Rob Herring 2020-09-02 16:58 ` Rob Herring 2020-08-31 9:11 ` Jiri Olsa 2020-08-31 9:11 ` Jiri Olsa 2020-09-02 17:01 ` Rob Herring 2020-09-02 17:01 ` Rob Herring 2020-09-02 18:07 ` Ian Rogers 2020-09-02 18:07 ` Ian Rogers 2020-09-02 19:48 ` Rob Herring 2020-09-02 19:48 ` Rob Herring 2020-09-04 5:51 ` Ian Rogers 2020-09-04 5:51 ` Ian Rogers 2020-08-28 20:56 ` [PATCH v2 6/9] libperf: Add arm64 support to perf_mmap__read_self() Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 7/9] perf: arm64: Add test for userspace counter access on heterogeneous systems Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 8/9] Documentation: arm64: Document PMU counters access from userspace Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-28 20:56 ` [PATCH v2 9/9] perf: Remove x86 specific rdpmc test Rob Herring 2020-08-28 20:56 ` Rob Herring 2020-08-31 9:11 ` Jiri Olsa 2020-08-31 9:11 ` Jiri Olsa
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=20200831091123.GB406859@krava \ --to=jolsa@redhat.com \ --cc=Jonathan.Cameron@huawei.com \ --cc=acme@kernel.org \ --cc=alexander.shishkin@linux.intel.com \ --cc=catalin.marinas@arm.com \ --cc=honnappa.nagarahalli@arm.com \ --cc=irogers@google.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=mingo@redhat.com \ --cc=namhyung@kernel.org \ --cc=peterz@infradead.org \ --cc=raphael.gault@arm.com \ --cc=robh@kernel.org \ --cc=will@kernel.org \ /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: linkBe 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.