| From 0ea9494be9c931ddbc084ad5e11fda91b554cf47 Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <seanjc@google.com> |
| Date: Thu, 13 Nov 2025 12:51:11 -0800 |
| Subject: KVM: x86: WARN if hrtimer callback for periodic APIC timer fires with period=0 |
| |
| From: Sean Christopherson <seanjc@google.com> |
| |
| commit 0ea9494be9c931ddbc084ad5e11fda91b554cf47 upstream. |
| |
| WARN and don't restart the hrtimer if KVM's callback runs with the guest's |
| APIC timer in periodic mode but with a period of '0', as not advancing the |
| hrtimer's deadline would put the CPU into an infinite loop of hrtimer |
| events. Observing a period of '0' should be impossible, even when the |
| hrtimer is running on a different CPU than the vCPU, as KVM is supposed to |
| cancel the hrtimer before changing (or zeroing) the period, e.g. when |
| switching from periodic to one-shot. |
| |
| Cc: stable@vger.kernel.org |
| Link: https://patch.msgid.link/20251113205114.1647493-2-seanjc@google.com |
| Signed-off-by: Sean Christopherson <seanjc@google.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/kvm/lapic.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/x86/kvm/lapic.c |
| +++ b/arch/x86/kvm/lapic.c |
| @@ -2855,7 +2855,7 @@ static enum hrtimer_restart apic_timer_f |
| |
| apic_timer_expired(apic, true); |
| |
| - if (lapic_is_periodic(apic)) { |
| + if (lapic_is_periodic(apic) && !WARN_ON_ONCE(!apic->lapic_timer.period)) { |
| advance_periodic_target_expiration(apic); |
| hrtimer_add_expires_ns(&ktimer->timer, ktimer->period); |
| return HRTIMER_RESTART; |