Skip to content

Commit 9917264

Browse files
author
Marc Zyngier
committed
KVM: arm64: PMU: Simplify setting a counter to a specific value
kvm_pmu_set_counter_value() is pretty odd, as it tries to update the counter value while taking into account the value that is currently held by the running perf counter. This is not only complicated, this is quite wrong. Nowhere in the architecture is it said that the counter would be offset by something that is pending. The counter should be updated with the value set by SW, and start counting from there if required. Remove the odd computation and just assign the provided value after having released the perf event (which is then restarted). Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 0cb9c3c commit 9917264

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

arch/arm64/kvm/pmu-emul.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ static LIST_HEAD(arm_pmus);
2323
static DEFINE_MUTEX(arm_pmus_lock);
2424

2525
static void kvm_pmu_create_perf_event(struct kvm_vcpu *vcpu, u64 select_idx);
26+
static void kvm_pmu_release_perf_event(struct kvm_pmc *pmc);
2627

2728
static u32 kvm_pmu_event_mask(struct kvm *kvm)
2829
{
@@ -131,8 +132,10 @@ void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val)
131132
if (!kvm_vcpu_has_pmu(vcpu))
132133
return;
133134

135+
kvm_pmu_release_perf_event(&vcpu->arch.pmu.pmc[select_idx]);
136+
134137
reg = counter_index_to_reg(select_idx);
135-
__vcpu_sys_reg(vcpu, reg) += (s64)val - kvm_pmu_get_counter_value(vcpu, select_idx);
138+
__vcpu_sys_reg(vcpu, reg) = val;
136139

137140
/* Recreate the perf event to reflect the updated sample_period */
138141
kvm_pmu_create_perf_event(vcpu, select_idx);

0 commit comments

Comments
 (0)