mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-17 19:18:38 +00:00
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: 5bd5db385b ("KVM: x86: allow hotplug of VCPU with APIC ID over 0xff")
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20230106011306.85230-23-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
51 lines
1.9 KiB
ReStructuredText
51 lines
1.9 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
=======================================
|
|
Known limitations of CPU virtualization
|
|
=======================================
|
|
|
|
Whenever perfect emulation of a CPU feature is impossible or too hard, KVM
|
|
has to choose between not implementing the feature at all or introducing
|
|
behavioral differences between virtual machines and bare metal systems.
|
|
|
|
This file documents some of the known limitations that KVM has in
|
|
virtualizing CPU features.
|
|
|
|
x86
|
|
===
|
|
|
|
``KVM_GET_SUPPORTED_CPUID`` issues
|
|
----------------------------------
|
|
|
|
x87 features
|
|
~~~~~~~~~~~~
|
|
|
|
Unlike most other CPUID feature bits, CPUID[EAX=7,ECX=0]:EBX[6]
|
|
(FDP_EXCPTN_ONLY) and CPUID[EAX=7,ECX=0]:EBX]13] (ZERO_FCS_FDS) are
|
|
clear if the features are present and set if the features are not present.
|
|
|
|
Clearing these bits in CPUID has no effect on the operation of the guest;
|
|
if these bits are set on hardware, the features will not be present on
|
|
any virtual machine that runs on that hardware.
|
|
|
|
**Workaround:** It is recommended to always set these bits in guest CPUID.
|
|
Note however that any software (e.g ``WIN87EM.DLL``) expecting these features
|
|
to be present likely predates these CPUID feature bits, and therefore
|
|
doesn't know to check for them anyway.
|
|
|
|
Nested virtualization features
|
|
------------------------------
|
|
|
|
TBD
|
|
|
|
x2APIC
|
|
------
|
|
When KVM_X2APIC_API_USE_32BIT_IDS is enabled, KVM activates a hack/quirk that
|
|
allows sending events to a single vCPU using its x2APIC ID even if the target
|
|
vCPU has legacy xAPIC enabled, e.g. to bring up hotplugged vCPUs via INIT-SIPI
|
|
on VMs with > 255 vCPUs. A side effect of the quirk is that, if multiple vCPUs
|
|
have the same physical APIC ID, KVM will deliver events targeting that APIC ID
|
|
only to the vCPU with the lowest vCPU ID. If KVM_X2APIC_API_USE_32BIT_IDS is
|
|
not enabled, KVM follows x86 architecture when processing interrupts (all vCPUs
|
|
matching the target APIC ID receive the interrupt).
|