Commit 725ce669 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

KVM: arm64: pmu: Set the CHAINED attribute before creating the in-kernel event



The current convention for KVM to request a chained event from the
host PMU is to set bit[0] in attr.config1 (PERF_ATTR_CFG1_KVM_PMU_CHAINED).

But as it turns out, this bit gets set *after* we create the kernel
event that backs our virtual counter, meaning that we never get
a 64bit counter.

Moving the setting to an earlier point solves the problem.

Fixes: 80f393a2 ("KVM: arm/arm64: Support chained PMU counters")
Reviewed-by: default avatarAndrew Murray <andrew.murray@arm.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 6f163714
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -569,12 +569,12 @@ static void kvm_pmu_create_perf_event(struct kvm_vcpu *vcpu, u64 select_idx)
		 * high counter.
		 */
		attr.sample_period = (-counter) & GENMASK(63, 0);
		if (kvm_pmu_counter_is_enabled(vcpu, pmc->idx + 1))
			attr.config1 |= PERF_ATTR_CFG1_KVM_PMU_CHAINED;

		event = perf_event_create_kernel_counter(&attr, -1, current,
							 kvm_pmu_perf_overflow,
							 pmc + 1);

		if (kvm_pmu_counter_is_enabled(vcpu, pmc->idx + 1))
			attr.config1 |= PERF_ATTR_CFG1_KVM_PMU_CHAINED;
	} else {
		/* The initial sample period (overflow count) of an event. */
		if (kvm_pmu_idx_is_64bit(vcpu, pmc->idx))