All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robh@kernel.org>
To: Jiri Olsa <jolsa@redhat.com>
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-kernel@vger.kernel.org>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" 
	<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 <honnappa.nagarahalli@arm.com>
Subject: Re: [PATCH v2 5/9] libperf: Add support for user space counter access
Date: Wed, 2 Sep 2020 10:58:34 -0600	[thread overview]
Message-ID: <CAL_Jsq+rrQWObtaTQpoxjJbFJeWPf5VxnOZyp6pZzZcb3Ybv+w@mail.gmail.com> (raw)
In-Reply-To: <20200831091123.GB406859@krava>

On Mon, Aug 31, 2020 at 3:11 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> On Fri, Aug 28, 2020 at 02:56:10PM -0600, Rob Herring wrote:
>
> 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

I was thinking cap_user_rdpmc could change, but I guess idx will
always be 0 in that case.

> > +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

Would you like me to just comment this out then for now?

Rob

WARNING: multiple messages have this Message-ID (diff)
From: Rob Herring <robh@kernel.org>
To: Jiri Olsa <jolsa@redhat.com>
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" <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 <honnappa.nagarahalli@arm.com>,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>,
	Namhyung Kim <namhyung@kernel.org>, Will Deacon <will@kernel.org>,
	"moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 5/9] libperf: Add support for user space counter access
Date: Wed, 2 Sep 2020 10:58:34 -0600	[thread overview]
Message-ID: <CAL_Jsq+rrQWObtaTQpoxjJbFJeWPf5VxnOZyp6pZzZcb3Ybv+w@mail.gmail.com> (raw)
In-Reply-To: <20200831091123.GB406859@krava>

On Mon, Aug 31, 2020 at 3:11 AM Jiri Olsa <jolsa@redhat.com> wrote:
>
> On Fri, Aug 28, 2020 at 02:56:10PM -0600, Rob Herring wrote:
>
> 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

I was thinking cap_user_rdpmc could change, but I guess idx will
always be 0 in that case.

> > +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

Would you like me to just comment this out then for now?

Rob

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-09-02 17:00 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
2020-08-31  9:11     ` Jiri Olsa
2020-09-02 16:58     ` Rob Herring [this message]
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=CAL_Jsq+rrQWObtaTQpoxjJbFJeWPf5VxnOZyp6pZzZcb3Ybv+w@mail.gmail.com \
    --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=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 \
    /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
Be 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.