Messages in this thread Patch in this message | | | From | Guo Ren <> | Date | Tue, 4 Jun 2019 14:36:45 +0800 | Subject | Re: [PATCH V4 6/6] csky: Fix perf record in kernel/user space |
| |
Just move attr.exclude_user after switch, like this:
OK?
diff --git a/arch/csky/kernel/perf_event.c b/arch/csky/kernel/perf_event.c index 376c972..3470cfa 100644 --- a/arch/csky/kernel/perf_event.c +++ b/arch/csky/kernel/perf_event.c @@ -844,15 +844,6 @@ static int csky_pmu_event_init(struct perf_event *event) struct hw_perf_event *hwc = &event->hw; int ret;
- if (event->attr.exclude_user) - csky_pmu.hpcr = BIT(2); - else if (event->attr.exclude_kernel) - csky_pmu.hpcr = BIT(3); - else - csky_pmu.hpcr = BIT(2) | BIT(3); - - csky_pmu.hpcr |= BIT(1) | BIT(0); - switch (event->attr.type) { case PERF_TYPE_HARDWARE: if (event->attr.config >= PERF_COUNT_HW_MAX) @@ -861,21 +852,31 @@ static int csky_pmu_event_init(struct perf_event *event) if (ret == HW_OP_UNSUPPORTED) return -ENOENT; hwc->idx = ret; - return 0; + break; case PERF_TYPE_HW_CACHE: ret = csky_pmu_cache_event(event->attr.config); if (ret == CACHE_OP_UNSUPPORTED) return -ENOENT; hwc->idx = ret; - return 0; + break; case PERF_TYPE_RAW: if (hw_raw_read_mapping[event->attr.config] == NULL) return -ENOENT; hwc->idx = event->attr.config; - return 0; + break; default: return -ENOENT; } + + if (event->attr.exclude_user) + csky_pmu.hpcr = BIT(2); + else if (event->attr.exclude_kernel) + csky_pmu.hpcr = BIT(3); + else + csky_pmu.hpcr = BIT(2) | BIT(3); + + csky_pmu.hpcr |= BIT(1) | BIT(0); + }
On Tue, Jun 4, 2019 at 10:25 AM Mao Han <han_mao@c-sky.com> wrote: > > csky_pmu_event_init is called several times during the perf record > initialzation. After configure the event counter in either kernel > space or user space, csky_pmu_event_init is called twice with no > attr specified. Configuration will be overwritten with sampling in > both kernel space and user space. --all-kernel/--all-user is > useless without this patch applied. > > Signed-off-by: Mao Han <han_mao@c-sky.com> > Cc: Guo Ren <guoren@kernel.org> > Cc: linux-csky@vger.kernel.org > --- > arch/csky/kernel/perf_event.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/arch/csky/kernel/perf_event.c b/arch/csky/kernel/perf_event.c > index dc84dc7..e3308ab 100644 > --- a/arch/csky/kernel/perf_event.c > +++ b/arch/csky/kernel/perf_event.c > @@ -983,6 +983,12 @@ static int csky_pmu_event_init(struct perf_event *event) > struct hw_perf_event *hwc = &event->hw; > int ret; > > + if (event->attr.type != PERF_TYPE_HARDWARE && > + event->attr.type != PERF_TYPE_HW_CACHE && > + event->attr.type != PERF_TYPE_RAW) { > + return -ENOENT; > + } > + > if (event->attr.exclude_user) > csky_pmu.hpcr = BIT(2); > else if (event->attr.exclude_kernel) > -- > 2.7.4 >
| |