Re: [PATCH 2/2] x86/kvm/vmx: Fix VMX vs hrtimer_rearm_deferred()

From: Binbin Wu

Date: Mon May 18 2026 - 04:17:04 EST


On 4/23/2026 11:56 PM, Peter Zijlstra wrote:
> Vishal reported that KVM unit test 'x2apic' started failing after commit
> 0e98eb14814e ("entry: Prepare for deferred hrtimer rearming").
>
> The reason is that KVM/VMX is injecting interrupts while it has IRQs disabled,
> for a context that will enable IRQs, this means that regs->flags.X86_EFLAGS_IF
> == 0 and the irqentry_exit() will not DTRT.
>
> Notably, irqentry_exit() must not call hrtimer_rearm_deferred() when the return
> context does not have IF set, because this will cause problems vs NMIs.
>
> Therefore, fix up the state after the injection.
>
> Fixes: 0e98eb14814e ("entry: Prepare for deferred hrtimer rearming")
> Reported-by: "Verma, Vishal L" <vishal.l.verma@xxxxxxxxx>
> Closes: https://lore.kernel.org/r/70cd3e97fbb796e2eb2ff8cd4b7614ada05a5f24.camel%40intel.com
> Suggested-by: Thomas Gleixner <tglx@xxxxxxxxxx>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
> Tested-by: "Verma, Vishal L" <vishal.l.verma@xxxxxxxxx>

Reviewed-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx>

> ---
> arch/x86/entry/common.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> --- a/arch/x86/entry/common.c
> +++ b/arch/x86/entry/common.c
> @@ -2,6 +2,7 @@
>
> #include <linux/entry-common.h>
> #include <linux/kvm_types.h>
> +#include <linux/hrtimer_rearm.h>
> #include <asm/fred.h>
> #include <asm/desc.h>
>
> @@ -27,6 +28,18 @@ noinstr void x86_entry_from_kvm(unsigned
> #else
> idt_entry_from_kvm(vector);
> #endif
> + /*
> + * Strictly speaking, only the NMI path requires noinstr.
> + */
> + instrumentation_begin();
> + /*
> + * KVM/VMX will dispatch from IRQ-disabled but for a context
> + * that will have IRQs-enabled. This confuses the entry code
> + * and it will not have reprogrammed the timer. Do so now.
> + */
> + hrtimer_rearm_deferred();
> + instrumentation_end();
> +
> return;
> }
>
>
>
>