arm64: kvm: avoid CONFIG_PGTABLE_LEVELS for runtime levels
authorArd Biesheuvel <ardb@kernel.org>
Wed, 14 Feb 2024 12:29:25 +0000 (13:29 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 16 Feb 2024 12:42:42 +0000 (12:42 +0000)
get_user_mapping_size() uses vabits_actual and CONFIG_PGTABLE_LEVELS to
provide the starting point for a table walk. This is fine for LVA, as
the number of translation levels is the same regardless of whether LVA
is enabled. However, with LPA2, this will no longer be the case, so
let's derive the number of levels from the number of VA bits directly.

Acked-by: Marc Zyngier <maz@kernel.org>
Acked-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-84-ardb+git@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kvm/mmu.c

index 6fa9e816df40440ef25520c736b485f5b21c4eb8..cd9456a03e3860eec81bdd12da69dc2725cca807 100644 (file)
@@ -805,7 +805,7 @@ static int get_user_mapping_size(struct kvm *kvm, u64 addr)
                .pgd            = (kvm_pteref_t)kvm->mm->pgd,
                .ia_bits        = vabits_actual,
                .start_level    = (KVM_PGTABLE_LAST_LEVEL -
-                                  CONFIG_PGTABLE_LEVELS + 1),
+                                  ARM64_HW_PGTABLE_LEVELS(pgt.ia_bits) + 1),
                .mm_ops         = &kvm_user_mm_ops,
        };
        unsigned long flags;