Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -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 */