• Wanpeng Li's avatar
    x86/kvm: Fix broken irq restoration in kvm_wait · f4e61f0c
    Wanpeng Li authored
    After commit 997acaf6 (lockdep: report broken irq restoration), the guest
    splatting below during boot:
    
     raw_local_irq_restore() called with IRQs enabled
     WARNING: CPU: 1 PID: 169 at kernel/locking/irqflag-debug.c:10 warn_bogus_irq_restore+0x26/0x30
     Modules linked in: hid_generic usbhid hid
     CPU: 1 PID: 169 Comm: systemd-udevd Not tainted 5.11.0+ #25
     RIP: 0010:warn_bogus_irq_restore+0x26/0x30
     Call Trace:
      kvm_wait+0x76/0x90
      __pv_queued_spin_lock_slowpath+0x285/0x2e0
      do_raw_spin_lock+0xc9/0xd0
      _raw_spin_lock+0x59/0x70
      lockref_get_not_dead+0xf/0x50
      __legitimize_path+0x31/0x60
      legitimize_root+0x37/0x50
      try_to_unlazy_next+0x7f/0x1d0
      lookup_fast+0xb0/0x170
      path_openat+0x165/0x9b0
      do_filp_open+0x99/0x110
      do_sys_openat2+0x1f1/0x2e0
      do_sys_open+0x5c/0x80
      __x64_sys_open+0x21/0x30
      do_syscall_64+0x32/0x50
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    The new consistency checking,  expects local_irq_save() and
    local_irq_restore() to be paired and sanely nested, and therefore expects
    local_irq_restore() to be called with irqs disabled.
    The irqflags handling in kvm_wait() which ends up doing:
    
    	local_irq_save(flags);
    	safe_halt();
    	local_irq_restore(flags);
    
    instead triggers it.  This patch fixes it by using
    local_irq_disable()/enable() directly.
    
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Reported-by: default avatarDmitry Vyukov <dvyukov@google.com>
    Signed-off-by: default avatarWanpeng Li <wanpengli@tencent.com>
    Message-Id: <1615791328-2735-1-git-send-email-wanpengli@tencent.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    f4e61f0c
kvm.c 23 KB