Re: [PATCH v4] KVM: x86: Add x2APIC "features" to control EOI broadcast suppression
From: David Woodhouse
Date: Fri Dec 12 2025 - 02:31:58 EST
On Fri, 2025-12-12 at 07:08 +0000, Khushit Shah wrote:
>
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 0ae7f913d782..7b368284ec0b 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
Surely the point of helper functions is that they live in a header file
somewhere and are not *duplicated* in the different C files that use
them?
> @@ -105,6 +105,43 @@ bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector)
> apic_test_vector(vector, apic->regs + APIC_IRR);
> }
>
> +static bool kvm_lapic_advertise_suppress_eoi_broadcast(struct kvm *kvm)
> +{
> + /*
> + * Returns true if KVM should advertise Suppress EOI broadcast support
> + * to the guest.
> + *
> + * In split IRQCHIP mode: advertise unless the VMM explicitly disabled
> + * it. This preserves legacy quirky behavior where KVM advertised the
> + * capability even though it did not actually suppress EOIs.
> + *
> + * In kernel IRQCHIP mode: only advertise if the VMM explicitly
> + * enabled it (and use the IOAPIC version 0x20).
> + */
> + if (irqchip_split(kvm)) {
> + return kvm->arch.suppress_eoi_broadcast_mode !=
> + KVM_SUPPRESS_EOI_BROADCAST_DISABLED;
> + } else {
> + return kvm->arch.suppress_eoi_broadcast_mode ==
> + KVM_SUPPRESS_EOI_BROADCAST_ENABLED;
> + }
Ick, that makes my brain hurt, and obfuscates the nice clean simple
ENABLED/DISABLED cases. How about:
switch(kvm->arch.suppress_eoi_broadcast_mode) {
case KVM_SUPPRESS_EOI_BROADCAST_ENABLED: return true;
case KVM_SUPPRESS_EOI_BROADCAST_DISABLED: return false;
default: return !ioapic_in_kernel(kvm);
}
(You can do it with if/else if you prefer; this was easier to type into
email).
> +}
> +
> +static bool kvm_lapic_ignore_suppress_eoi_broadcast(struct kvm *kvm)
> +{
> + /*
> + * Returns true if KVM should ignore the suppress EOI broadcast bit set by
> + * the guest and broadcast EOIs anyway.
> + *
> + * Only returns false when the VMM explicitly enabled Suppress EOI
> + * broadcast. If disabled by VMM, the bit should be ignored as it is not
> + * supported. Legacy behavior was to ignore the bit and broadcast EOIs
> + * anyway.
> + */
> + return kvm->arch.suppress_eoi_broadcast_mode !=
> + KVM_SUPPRESS_EOI_BROADCAST_ENABLED;
> +}
Still kind of hate the inverse logic and the conjunction of 'ignore
suppress' which is hard to parse as a double-negative. What was wrong
with a 'kvm_lapic_implement_suppress_eoi_broadcast() which returns true
if suppress_eoi_broadcast_mode == KVM_SUPPRESS_EOI_BROADCAST_ENABLED?
Attachment:
smime.p7s
Description: S/MIME cryptographic signature