Commit 82488596 authored by Junhao He's avatar Junhao He
Browse files

drivers: perf: Add feature flag check in armpmu_add/del

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8EC9K


CVE: NA

--------------------------------

Function armpmu_add will call armv8pmu_branch_reset() to reset BRBE.
The BRBE feature depend on ARMV8 PMU hardware support for branch stack
sampling. On older platforms the kernel panics.

Internal error: Oops - Undefined instruction: 0000000002000000 [#1] SMP
Call trace:
armv8pmu_branch_reset+0xc/0x20
event_sched_in+0xc8/0x1a0
merge_sched_in+0x16c/0x41c

Fixes: 2690e65a ("drivers: perf: arm_pmuv3: Enable branch stack sampling via FEAT_BRBE")
Signed-off-by: default avatarJunhao He <hejunhao3@huawei.com>
parent c0386911
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -313,10 +313,12 @@ armpmu_del(struct perf_event *event, int flags)
	struct hw_perf_event *hwc = &event->hw;
	int idx = hwc->idx;

	if (has_branch_stack(event)) {
		WARN_ON_ONCE(!hw_events->brbe_users);
		hw_events->brbe_users--;
		if (!hw_events->brbe_users)
			hw_events->brbe_context = NULL;
	}

	armpmu_stop(event, PERF_EF_UPDATE);
	hw_events->events[idx] = NULL;
@@ -334,6 +336,7 @@ armpmu_add(struct perf_event *event, int flags)
	struct hw_perf_event *hwc = &event->hw;
	int idx;

	if (has_branch_stack(event)) {
		/*
		 * Reset branch records buffer if a new task event gets
		 * scheduled on a PMU which might have existing records.
@@ -346,6 +349,7 @@ armpmu_add(struct perf_event *event, int flags)
				armpmu->branch_reset();
		}
		hw_events->brbe_users++;
	}

	/* An event following a process won't be stopped earlier */
	if (!cpumask_test_cpu(smp_processor_id(), &armpmu->supported_cpus))