Commit d41435d9 authored by Mao Han's avatar Mao Han Committed by Guo Ren

csky: Fix perf record in kernel/user space

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: default avatarMao Han <han_mao@c-sky.com>
Signed-off-by: default avatarGuo Ren <guoren@kernel.org>
parent f622fbf2
......@@ -922,15 +922,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)
......@@ -939,21 +930,32 @@ 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);
return 0;
}
/* starts all counters */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment