On Sun, 22 Aug 2021 16:25:26 +0100 Marc Zyngier <maz@xxxxxxxxxx> wrote: Hi Marc, > There is some value in keeping the IPA space small, as it reduces > the size of the stage-2 page tables. > > Let's compute the required space at VM creation time, and inform > the kernel of our requirements. You mentioned some kernel bug in the first version of this patch, I guess the fix for this is 262b003d059c? It seems to me that this is somewhat of a regression on older host kernels, when trying to run a guest with "-m 2048", for instance? Should we teach kvmtool about this bug, and do a check for the bug condition, when kvm__register_ram() returns with -EFAULT? And give users a hint to try with one MB more or less guest RAM? Or maybe try this automatically? > > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arm/aarch64/kvm.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/arm/aarch64/kvm.c b/arm/aarch64/kvm.c > index d03a27f2..4e66a22e 100644 > --- a/arm/aarch64/kvm.c > +++ b/arm/aarch64/kvm.c > @@ -3,6 +3,7 @@ > #include <asm/image.h> > > #include <linux/byteorder.h> > +#include <kvm/util.h> > > /* > * Return the TEXT_OFFSET value that the guest kernel expects. Note > @@ -59,5 +60,22 @@ int kvm__arch_get_ipa_limit(struct kvm *kvm) > > int kvm__get_vm_type(struct kvm *kvm) > { > - return KVM_VM_TYPE_ARM_IPA_SIZE(kvm__arch_get_ipa_limit(kvm)); > + unsigned int ipa_bits, max_ipa_bits; > + unsigned long max_ipa; > + > + /* If we're running on an old kernel, use 0 as the VM type */ > + max_ipa_bits = kvm__arch_get_ipa_limit(kvm); > + if (!max_ipa_bits) > + return 0; Should this return KVM_VM_TYPE, as it does at the moment? Or is this more confusing than helpful? Just a nit anyway, the patch looks correct otherwise: Reviewed-by: Andre Przywara <andre.przywara@xxxxxxx> Cheers, Andre > + > + /* Otherwise, compute the minimal required IPA size */ > + max_ipa = ARM_MEMORY_AREA + kvm->cfg.ram_size - 1; > + ipa_bits = max(32, fls_long(max_ipa)); > + pr_debug("max_ipa %lx ipa_bits %d max_ipa_bits %d", > + max_ipa, ipa_bits, max_ipa_bits); > + > + if (ipa_bits > max_ipa_bits) > + die("Memory too large for this system (needs %d bits, %d available)", ipa_bits, max_ipa_bits); > + > + return KVM_VM_TYPE_ARM_IPA_SIZE(ipa_bits); > } _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm