]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Remove evaluation of timer state in kvm_cpu_has_pending_timer()
authorMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 10:36:07 +0000 (11:36 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 1 Apr 2026 14:42:26 +0000 (15:42 +0100)
The vgic-v5 code added some evaluations of the timers in a helper funtion
(kvm_cpu_has_pending_timer()) that is called to determine whether
the vcpu can wake-up.

But looking at the timer there is wrong:

- we want to see timers that are signalling an interrupt to the
  vcpu, and not just that have a pending interrupt

- we already have kvm_arch_vcpu_runnable() that evaluates the
  state of interrupts

- kvm_cpu_has_pending_timer() really is about WFIT, as the timeout
  does not generate an interrupt, and is therefore distinct from
  the point above

As a consequence, revert these changes and teach vgic_v5_has_pending_ppi()
about checking for pending HW interrupts instead.

Fixes: 9491c63b6cd7b ("KVM: arm64: gic-v5: Enlighten arch timer for GICv5")
Link: https://sashiko.dev/#/patchset/20260319154937.3619520-1-sascha.bischoff%40arm.com
Link: https://patch.msgid.link/20260401103611.357092-13-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/arch_timer.c
arch/arm64/kvm/vgic/vgic-v5.c

index 37279f87486956a0a715d7e9f7f6f9a3768d30b2..6608c47d1f6282ddb20cf2ddf66e8399d259e185 100644 (file)
@@ -402,11 +402,7 @@ static bool kvm_timer_should_fire(struct arch_timer_context *timer_ctx)
 
 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
 {
-       struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
-       struct arch_timer_context *ptimer = vcpu_ptimer(vcpu);
-
-       return kvm_timer_should_fire(vtimer) || kvm_timer_should_fire(ptimer) ||
-              (vcpu_has_wfit_active(vcpu) && wfit_delay_ns(vcpu) == 0);
+       return vcpu_has_wfit_active(vcpu) && wfit_delay_ns(vcpu) == 0;
 }
 
 /*
index 31040cfb61fc7a01693f029f25dda43f734be36a..8680a8354db9db90fb2348621e3d0c3c691eefa9 100644 (file)
@@ -366,8 +366,8 @@ bool vgic_v5_has_pending_ppi(struct kvm_vcpu *vcpu)
                irq = vgic_get_vcpu_irq(vcpu, intid);
 
                scoped_guard(raw_spinlock_irqsave, &irq->irq_lock)
-                       has_pending = (irq->enabled && irq_is_pending(irq) &&
-                                      irq->priority < priority_mask);
+                       if (irq->enabled && irq->priority < priority_mask)
+                               has_pending = irq->hw ? vgic_get_phys_line_level(irq) : irq_is_pending(irq);
 
                vgic_put_irq(vcpu->kvm, irq);