Re: [PATCH] KVM: arm64: Cap default IPA size to the host's own size
From: Andrew Jones <hidden>
Date: 2021-03-09 13:33:40
Also in:
kvm, kvmarm
Hi Marc, On Mon, Mar 08, 2021 at 05:46:43PM +0000, Marc Zyngier wrote:
KVM/arm64 has forever used a 40bit default IPA space, partially due to its 32bit heritage (where the only choice is 40bit). However, there are implementations in the wild that have a *cough* much smaller *cough* IPA space, which leads to a misprogramming of VTCR_EL2, and a guest that is stuck on its first memory access if userspace dares to ask for the default IPA setting (which most VMMs do). Instead, cap the default IPA size to what the host can actually do, and spit out a one-off message on the console. The boot warning is turned into a more meaningfull message, and the new behaviour is also documented. Although this is a userspace ABI change, it doesn't really change much for userspace: - the guest couldn't run before this change, while it now has a chance to if the memory range fits the reduced IPA space - a memory slot that was accepted because it did fit the default IPA space but didn't fit the HW constraints is now properly rejected
I'm not sure deferring the misconfiguration error until memslot request time is better than just failing to create a VM. If userspace doesn't use KVM_CAP_ARM_VM_IPA_SIZE to determine the limit (which it hasn't been obliged to do) and it is able to successfully create a VM, then it will assume up to 40-bit IPAs are supported. Later, when it tries to add memslots and fails it may be confused, especially if that later is much, much later with memory hotplug.
The other thing that's left doing is to convince userspace to actually use the IPA space setting instead of relying on the antiquated default.
Failing to create any VM which hasn't selected a valid IPA limit should be pretty convincing :-) Thanks, drew _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel