• David Woodhouse's avatar
    KVM: x86/xen: inject vCPU upcall vector when local APIC is enabled · 8e62bf2b
    David Woodhouse authored
    Linux guests since commit b1c3497e ("x86/xen: Add support for
    HVMOP_set_evtchn_upcall_vector") in v6.0 onwards will use the per-vCPU
    upcall vector when it's advertised in the Xen CPUID leaves.
    
    This upcall is injected through the guest's local APIC as an MSI, unlike
    the older system vector which was merely injected by the hypervisor any
    time the CPU was able to receive an interrupt and the upcall_pending
    flags is set in its vcpu_info.
    
    Effectively, that makes the per-CPU upcall edge triggered instead of
    level triggered, which results in the upcall being lost if the MSI is
    delivered when the local APIC is *disabled*.
    
    Xen checks the vcpu_info->evtchn_upcall_pending flag when the local APIC
    for a vCPU is software enabled (in fact, on any write to the SPIV
    register which doesn't disable the APIC). Do the same in KVM since KVM
    doesn't provide a way for userspace to intervene and trap accesses to
    the SPIV register of a local APIC emulated by KVM.
    
    Fixes: fde0451b ("KVM: x86/xen: Support per-vCPU event channel upcall via local APIC")
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Reviewed-by: default avatarPaul Durrant <paul@xen.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20240227115648.3104-3-dwmw2@infradead.orgSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    8e62bf2b
xen.c 63.3 KB