• Vitaly Kuznetsov's avatar
    KVM: x86: Properly handle APF vs disabled LAPIC situation · 2f15d027
    Vitaly Kuznetsov authored
    Async PF 'page ready' event may happen when LAPIC is (temporary) disabled.
    In particular, Sebastien reports that when Linux kernel is directly booted
    by Cloud Hypervisor, LAPIC is 'software disabled' when APF mechanism is
    initialized. On initialization KVM tries to inject 'wakeup all' event and
    puts the corresponding token to the slot. It is, however, failing to inject
    an interrupt (kvm_apic_set_irq() -> __apic_accept_irq() -> !apic_enabled())
    so the guest never gets notified and the whole APF mechanism gets stuck.
    The same issue is likely to happen if the guest temporary disables LAPIC
    and a previously unavailable page becomes available.
    
    Do two things to resolve the issue:
    - Avoid dequeuing 'page ready' events from APF queue when LAPIC is
      disabled.
    - Trigger an attempt to deliver pending 'page ready' events when LAPIC
      becomes enabled (SPIV or MSR_IA32_APICBASE).
    Reported-by: default avatarSebastien Boeuf <sebastien.boeuf@intel.com>
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Message-Id: <20210422092948.568327-1-vkuznets@redhat.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    2f15d027
lapic.c 74.4 KB