Re: CPU Lockups in KVM with deferred hrtimer rearming

Verma, Vishal L
2026-04-21T19:18:26Z

On Tue, 2026-04-21 at 19:11 +0200, Thomas Gleixner wrote:
>
> Now for VMX, that hrtimer_rearm_deferred() call should really go into
> handle_external_interrupt_irqoff(), which in turn requires to export
> __hrtimer_rearm_deferred().
>
> But we can avoid that alltogether. Something like the untested below.

Tested with the below patch and the tests pass with this too.

>
> Thanks,
>
>         tglx
> ---
> --- a/kernel/time/hrtimer.c
> +++ b/kernel/time/hrtimer.c
> @@ -42,9 +42,10 @@
>  #include <linux/timer.h>
>  #include <linux/freezer.h>
>  #include <linux/compat.h>
> -
>  #include <linux/uaccess.h>
>
> +#include <asm/irq_regs.h>
> +
>  #include <trace/events/timer.h>
>
>  #include "tick-internal.h"
> @@ -2062,11 +2063,16 @@ void __hrtimer_rearm_deferred(void)
>  static __always_inline void
>  hrtimer_interrupt_rearm(struct hrtimer_cpu_base *cpu_base, ktime_t expires_next)
>  {
> - /* hrtimer_interrupt() just re-evaluated the first expiring timer */
> - cpu_base->deferred_needs_update = false;
> - /* Cache the expiry time */
> - cpu_base->deferred_expires_next = expires_next;
> - set_thread_flag(TIF_HRTIMER_REARM);
> + /* Lies, damned lies and virt */
> + if (likely(!regs_irqs_disabled(get_irq_regs()))) {
> + /* hrtimer_interrupt() just re-evaluated the first expiring timer */
> + cpu_base->deferred_needs_update = false;
> + /* Cache the expiry time */
> + cpu_base->deferred_expires_next = expires_next;
> + set_thread_flag(TIF_HRTIMER_REARM);
> + } else {
> + hrtimer_rearm(cpu_base, expires_next, false);
> + }
>  }
>  #else  /* CONFIG_HRTIMER_REARM_DEFERRED */
>  static __always_inline void
>