]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: arm64: Simplify nested VMA shift calculation
authorFuad Tabba <tabba@google.com>
Fri, 6 Mar 2026 14:02:26 +0000 (14:02 +0000)
committerMarc Zyngier <maz@kernel.org>
Sat, 28 Mar 2026 11:29:40 +0000 (11:29 +0000)
In the kvm_s2_resolve_vma_size() helper, the local variable vma_pagesize
is calculated from vma_shift, only to be used to bound the vma_pagesize
by max_map_size and subsequently convert it back to a shift via __ffs().

Because vma_pagesize and max_map_size are both powers of two, we can
simplify the logic by omitting vma_pagesize entirely and bounding the
vma_shift directly using the shift of max_map_size. This achieves the
same result while keeping the size-to-shift conversion out of the helper
logic.

Signed-off-by: Fuad Tabba <tabba@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/mmu.c

index 478fceeeb44b588c6a0dc2306623e6d473bbf691..1d423bc29e6c06a81eca5a5e80def261db0e17aa 100644 (file)
@@ -1646,7 +1646,6 @@ static short kvm_s2_resolve_vma_size(struct vm_area_struct *vma,
                                     bool *force_pte, phys_addr_t *ipa)
 {
        short vma_shift;
-       long vma_pagesize;
 
        if (*force_pte)
                vma_shift = PAGE_SHIFT;
@@ -1677,8 +1676,6 @@ static short kvm_s2_resolve_vma_size(struct vm_area_struct *vma,
                WARN_ONCE(1, "Unknown vma_shift %d", vma_shift);
        }
 
-       vma_pagesize = 1UL << vma_shift;
-
        if (nested) {
                unsigned long max_map_size;
 
@@ -1703,8 +1700,7 @@ static short kvm_s2_resolve_vma_size(struct vm_area_struct *vma,
                        max_map_size = PAGE_SIZE;
 
                *force_pte = (max_map_size == PAGE_SIZE);
-               vma_pagesize = min_t(long, vma_pagesize, max_map_size);
-               vma_shift = __ffs(vma_pagesize);
+               vma_shift = min_t(short, vma_shift, __ffs(max_map_size));
        }
 
        return vma_shift;