• Sean Christopherson's avatar
    KVM: x86: Honor architectural behavior for aliased 8-bit APIC IDs · 5b84b029
    Sean Christopherson authored
    Apply KVM's hotplug hack if and only if userspace has enabled 32-bit IDs
    for x2APIC.  If 32-bit IDs are not enabled, disable the optimized map to
    honor x86 architectural behavior if multiple vCPUs shared a physical APIC
    ID.  As called out in the changelog that added the hack, all CPUs whose
    (possibly truncated) APIC ID matches the target are supposed to receive
    the IPI.
    
      KVM intentionally differs from real hardware, because real hardware
      (Knights Landing) does just "x2apic_id & 0xff" to decide whether to
      accept the interrupt in xAPIC mode and it can deliver one interrupt to
      more than one physical destination, e.g. 0x123 to 0x123 and 0x23.
    
    Applying the hack even when x2APIC is not fully enabled means KVM doesn't
    correctly handle scenarios where the guest has aliased xAPIC IDs across
    multiple vCPUs, as only the vCPU with the lowest vCPU ID will receive any
    interrupts.  It's extremely unlikely any real world guest aliases APIC
    IDs, or even modifies APIC IDs, but KVM's behavior is arbitrary, e.g. the
    lowest vCPU ID "wins" regardless of which vCPU is "aliasing" and which
    vCPU is "normal".
    
    Furthermore, the hack is _not_ guaranteed to work!  The hack works if and
    only if the optimized APIC map is successfully allocated.  If the map
    allocation fails (unlikely), KVM will fall back to its unoptimized
    behavior, which _does_ honor the architectural behavior.
    
    Pivot on 32-bit x2APIC IDs being enabled as that is required to take
    advantage of the hotplug hack (see kvm_apic_state_fixup()), i.e. won't
    break existing setups unless they are way, way off in the weeds.
    
    And an entry in KVM's errata to document the hack.  Alternatively, KVM
    could provide an actual x2APIC quirk and document the hack that way, but
    there's unlikely to ever be a use case for disabling the quirk.  Go the
    errata route to avoid having to validate a quirk no one cares about.
    
    Fixes: 5bd5db38 ("KVM: x86: allow hotplug of VCPU with APIC ID over 0xff")
    Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20230106011306.85230-23-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    5b84b029
errata.rst 1.89 KB