On Tue, Jan 16, 2024, David Woodhouse wrote: > From: David Woodhouse <dwmw@xxxxxxxxxxxx> > > Linux guests since commit b1c3497e604d ("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. > > Astute reviewers may note that kvm_xen_inject_vcpu_vector() function has > a WARN_ON_ONCE() in the case where kvm_irq_delivery_to_apic_fast() fails > and returns false. In the case where the MSI is not delivered due to the > local APIC being disabled, kvm_irq_delivery_to_apic_fast() still returns > true but the value in *r is zero. So the WARN_ON_ONCE() remains correct, > as that case should still never happen. > > Fixes: fde0451be8fb3 ("KVM: x86/xen: Support per-vCPU event channel upcall via local APIC") > Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx> > Reviewed-by: Paul Durrant <paul@xxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > --- > v4: Reword commit message, > rename kvm_xen_enable_lapic() → kvm_xen_sw_enable_lapic(). > v3: Repost, add Cc:stable. > v2: Add Fixes: tag. > > arch/x86/kvm/lapic.c | 5 ++++- > arch/x86/kvm/xen.c | 2 +- > arch/x86/kvm/xen.h | 18 ++++++++++++++++++ > 3 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > index 3242f3da2457..75bc7d3f0022 100644 > --- a/arch/x86/kvm/lapic.c > +++ b/arch/x86/kvm/lapic.c > @@ -41,6 +41,7 @@ > #include "ioapic.h" > #include "trace.h" > #include "x86.h" > +#include "xen.h" > #include "cpuid.h" > #include "hyperv.h" > #include "smm.h" Patch is corrupt. git am /home/seanjc/patches/v4_20240116_dwmw2_kvm_x86_xen_inject_vcpu_upcall_vector_when_local_apic_is_enabled.mbx Applying: KVM: x86/xen: Inject vCPU upcall vector when local APIC is enabled error: corrupt patch at line 17 cat ~/patches/v4_20240116_dwmw2_kvm_x86_xen_inject_vcpu_upcall_vector_when_local_apic_is_enabled.mbx | patch -p 1 --merge patching file arch/x86/kvm/lapic.c patch: **** malformed patch at line 59: #include "ioapic.h" Based on what I see in a web view, I suspect something on your end is converting whitespace to fancy unicode equivalents. diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 3242f3da2457..75bc7d3f0022 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -41,6 +41,7 @@ =C2=A0#include "ioapic.h" =C2=A0#include "trace.h" =C2=A0#include "x86.h" +#include "xen.h" =C2=A0#include "cpuid.h" =C2=A0#include "hyperv.h" =C2=A0#include "smm.h"