From: Rob Herring <robh@kernel.org> To: 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>, Jiri Olsa <jolsa@redhat.com> Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.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, Itaru Kitayama <itaru.kitayama@gmail.com> Subject: [PATCH v4 4/9] libperf: Add libperf_evsel__mmap() Date: Thu, 1 Oct 2020 09:01:11 -0500 [thread overview] Message-ID: <20201001140116.651970-5-robh@kernel.org> (raw) In-Reply-To: <20201001140116.651970-1-robh@kernel.org> In order to support usersapce access, an event must be mmapped. While there's already mmap support for evlist, the usecase is a bit different than the self monitoring with userspace access. So let's add a new perf_evsel__mmap() function to mmap an evsel. This allows implementing userspace access as a fastpath for perf_evsel__read(). The mmapped address is returned by perf_evsel__mmap() primarily for users/tests to check if userspace access is enabled. Signed-off-by: Rob Herring <robh@kernel.org> --- v4: - Change perf_evsel__mmap size to pages instead of bytes v3: - New patch split out from user access patch mmap fix --- tools/lib/perf/Documentation/libperf.txt | 1 + tools/lib/perf/evsel.c | 31 ++++++++++++++++++++++++ tools/lib/perf/include/internal/evsel.h | 2 ++ tools/lib/perf/include/perf/evsel.h | 2 ++ tools/lib/perf/libperf.map | 1 + 5 files changed, 37 insertions(+) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Documentation/libperf.txt index 0c74c30ed23a..d2a541e7a7ec 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -136,6 +136,7 @@ SYNOPSIS struct perf_thread_map *threads); void perf_evsel__close(struct perf_evsel *evsel); void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); + void *perf_evsel__mmap(struct perf_evsel *evsel, int pages); int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, struct perf_counts_values *count); int perf_evsel__enable(struct perf_evsel *evsel); diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 4dc06289f4c7..42eaf3c18981 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -11,10 +11,12 @@ #include <stdlib.h> #include <internal/xyarray.h> #include <internal/cpumap.h> +#include <internal/mmap.h> #include <internal/threadmap.h> #include <internal/lib.h> #include <linux/string.h> #include <sys/ioctl.h> +#include <sys/mman.h> void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr) { @@ -156,6 +158,35 @@ void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu) perf_evsel__close_fd_cpu(evsel, cpu); } +void *perf_evsel__mmap(struct perf_evsel *evsel, int pages) +{ + int ret; + struct perf_mmap *map; + struct perf_mmap_param mp = { + .prot = PROT_READ | PROT_WRITE, + }; + + if (FD(evsel, 0, 0) < 0) + return NULL; + + mp.mask = (pages * page_size) - 1; + + map = zalloc(sizeof(*map)); + if (!map) + return NULL; + + perf_mmap__init(map, NULL, false, NULL); + + ret = perf_mmap__mmap(map, &mp, FD(evsel, 0, 0), 0); + if (ret) { + free(map); + return NULL; + } + + evsel->mmap = map; + return map->base; +} + int perf_evsel__read_size(struct perf_evsel *evsel) { u64 read_format = evsel->attr.read_format; diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h index 1ffd083b235e..a7985dbb68ff 100644 --- a/tools/lib/perf/include/internal/evsel.h +++ b/tools/lib/perf/include/internal/evsel.h @@ -9,6 +9,7 @@ struct perf_cpu_map; struct perf_thread_map; +struct perf_mmap; struct xyarray; /* @@ -40,6 +41,7 @@ struct perf_evsel { struct perf_cpu_map *cpus; struct perf_cpu_map *own_cpus; struct perf_thread_map *threads; + struct perf_mmap *mmap; struct xyarray *fd; struct xyarray *sample_id; u64 *id; diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h index c82ec39a4ad0..1b1534439334 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -3,6 +3,7 @@ #define __LIBPERF_EVSEL_H #include <stdint.h> +#include <stddef.h> #include <perf/core.h> struct perf_evsel; @@ -27,6 +28,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, int pages); 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; -- 2.25.1
WARNING: multiple messages have this Message-ID
From: Rob Herring <robh@kernel.org> To: 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>, Jiri Olsa <jolsa@redhat.com> Cc: Mark Rutland <mark.rutland@arm.com>, Ian Rogers <irogers@google.com>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, linux-kernel@vger.kernel.org, honnappa.nagarahalli@arm.com, Raphael Gault <raphael.gault@arm.com>, Jonathan Cameron <Jonathan.Cameron@huawei.com>, Namhyung Kim <namhyung@kernel.org>, Itaru Kitayama <itaru.kitayama@gmail.com>, linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 4/9] libperf: Add libperf_evsel__mmap() Date: Thu, 1 Oct 2020 09:01:11 -0500 [thread overview] Message-ID: <20201001140116.651970-5-robh@kernel.org> (raw) In-Reply-To: <20201001140116.651970-1-robh@kernel.org> In order to support usersapce access, an event must be mmapped. While there's already mmap support for evlist, the usecase is a bit different than the self monitoring with userspace access. So let's add a new perf_evsel__mmap() function to mmap an evsel. This allows implementing userspace access as a fastpath for perf_evsel__read(). The mmapped address is returned by perf_evsel__mmap() primarily for users/tests to check if userspace access is enabled. Signed-off-by: Rob Herring <robh@kernel.org> --- v4: - Change perf_evsel__mmap size to pages instead of bytes v3: - New patch split out from user access patch mmap fix --- tools/lib/perf/Documentation/libperf.txt | 1 + tools/lib/perf/evsel.c | 31 ++++++++++++++++++++++++ tools/lib/perf/include/internal/evsel.h | 2 ++ tools/lib/perf/include/perf/evsel.h | 2 ++ tools/lib/perf/libperf.map | 1 + 5 files changed, 37 insertions(+) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Documentation/libperf.txt index 0c74c30ed23a..d2a541e7a7ec 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -136,6 +136,7 @@ SYNOPSIS struct perf_thread_map *threads); void perf_evsel__close(struct perf_evsel *evsel); void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); + void *perf_evsel__mmap(struct perf_evsel *evsel, int pages); int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, struct perf_counts_values *count); int perf_evsel__enable(struct perf_evsel *evsel); diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 4dc06289f4c7..42eaf3c18981 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -11,10 +11,12 @@ #include <stdlib.h> #include <internal/xyarray.h> #include <internal/cpumap.h> +#include <internal/mmap.h> #include <internal/threadmap.h> #include <internal/lib.h> #include <linux/string.h> #include <sys/ioctl.h> +#include <sys/mman.h> void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *attr) { @@ -156,6 +158,35 @@ void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu) perf_evsel__close_fd_cpu(evsel, cpu); } +void *perf_evsel__mmap(struct perf_evsel *evsel, int pages) +{ + int ret; + struct perf_mmap *map; + struct perf_mmap_param mp = { + .prot = PROT_READ | PROT_WRITE, + }; + + if (FD(evsel, 0, 0) < 0) + return NULL; + + mp.mask = (pages * page_size) - 1; + + map = zalloc(sizeof(*map)); + if (!map) + return NULL; + + perf_mmap__init(map, NULL, false, NULL); + + ret = perf_mmap__mmap(map, &mp, FD(evsel, 0, 0), 0); + if (ret) { + free(map); + return NULL; + } + + evsel->mmap = map; + return map->base; +} + int perf_evsel__read_size(struct perf_evsel *evsel) { u64 read_format = evsel->attr.read_format; diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h index 1ffd083b235e..a7985dbb68ff 100644 --- a/tools/lib/perf/include/internal/evsel.h +++ b/tools/lib/perf/include/internal/evsel.h @@ -9,6 +9,7 @@ struct perf_cpu_map; struct perf_thread_map; +struct perf_mmap; struct xyarray; /* @@ -40,6 +41,7 @@ struct perf_evsel { struct perf_cpu_map *cpus; struct perf_cpu_map *own_cpus; struct perf_thread_map *threads; + struct perf_mmap *mmap; struct xyarray *fd; struct xyarray *sample_id; u64 *id; diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/perf/evsel.h index c82ec39a4ad0..1b1534439334 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -3,6 +3,7 @@ #define __LIBPERF_EVSEL_H #include <stdint.h> +#include <stddef.h> #include <perf/core.h> struct perf_evsel; @@ -27,6 +28,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, int pages); 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; -- 2.25.1 _______________________________________________ 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-10-01 14:01 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-10-01 14:01 [PATCH v4 0/9] libperf and arm64 userspace counter access support Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 1/9] arm64: pmu: Add function implementation to update event index in userpage Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 2/9] arm64: perf: Enable pmu counter direct access for perf event on armv8 Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-11-13 18:06 ` Mark Rutland 2020-11-13 18:06 ` Mark Rutland 2020-11-19 18:35 ` Rob Herring 2020-11-19 18:35 ` Rob Herring 2020-11-19 19:15 ` Will Deacon 2020-11-19 19:15 ` Will Deacon 2020-11-20 20:03 ` Rob Herring 2020-11-20 20:03 ` Rob Herring 2020-11-20 22:08 ` Rob Herring 2020-11-20 22:08 ` Rob Herring 2020-12-02 14:57 ` Rob Herring 2020-12-02 14:57 ` Rob Herring 2021-01-07 0:17 ` Rob Herring 2021-01-07 0:17 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 3/9] tools/include: Add an initial math64.h Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` Rob Herring [this message] 2020-10-01 14:01 ` [PATCH v4 4/9] libperf: Add libperf_evsel__mmap() Rob Herring 2020-10-14 11:05 ` Jiri Olsa 2020-10-14 11:05 ` Jiri Olsa 2020-10-16 21:39 ` Rob Herring 2020-10-16 21:39 ` Rob Herring 2020-10-19 20:15 ` Jiri Olsa 2020-10-19 20:15 ` Jiri Olsa 2020-10-20 14:38 ` Rob Herring 2020-10-20 14:38 ` Rob Herring 2020-10-20 15:35 ` Jiri Olsa 2020-10-20 15:35 ` Jiri Olsa 2020-10-20 17:11 ` Rob Herring 2020-10-20 17:11 ` Rob Herring 2020-10-21 11:24 ` Jiri Olsa 2020-10-21 11:24 ` Jiri Olsa 2020-11-05 16:19 ` Rob Herring 2020-11-05 16:19 ` Rob Herring 2020-11-05 22:41 ` Jiri Olsa 2020-11-05 22:41 ` Jiri Olsa 2020-11-06 21:56 ` Rob Herring 2020-11-06 21:56 ` Rob Herring 2020-11-11 12:00 ` Jiri Olsa 2020-11-11 12:00 ` Jiri Olsa 2020-11-11 14:50 ` Rob Herring 2020-11-11 14:50 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 5/9] libperf: tests: Add support for verbose printing Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 6/9] libperf: Add support for user space counter access Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 7/9] libperf: Add arm64 support to perf_mmap__read_self() Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 8/9] perf: arm64: Add test for userspace counter access on heterogeneous systems Rob Herring 2020-10-01 14:01 ` Rob Herring 2020-10-01 14:01 ` [PATCH v4 9/9] Documentation: arm64: Document PMU counters access from userspace Rob Herring 2020-10-01 14:01 ` Rob Herring
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=20201001140116.651970-5-robh@kernel.org \ --to=robh@kernel.org \ --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=itaru.kitayama@gmail.com \ --cc=jolsa@redhat.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=will@kernel.org \ --subject='Re: [PATCH v4 4/9] libperf: Add libperf_evsel__mmap()' \ /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
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.