]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: pkvm: Fallback to level-3 mapping on host stage-2 fault
authorMarc Zyngier <maz@kernel.org>
Thu, 5 Mar 2026 13:27:51 +0000 (13:27 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 5 Mar 2026 15:18:47 +0000 (15:18 +0000)
If, for any odd reason, we cannot converge to mapping size that is
completely contained in a memblock region, we fail to install a S2
mapping and go back to the faulting instruction. Rince, repeat.

This happens when faulting in regions that are smaller than a page
or that do not have PAGE_SIZE-aligned boundaries (as witnessed on
an O6 board that refuses to boot in protected mode).

In this situation, fallback to using a PAGE_SIZE mapping anyway --
it isn't like we can go any lower.

Fixes: e728e705802fe ("KVM: arm64: Adjust range correctly during host stage-2 faults")
Link: https://lore.kernel.org/r/86wlzr77cn.wl-maz@kernel.org
Cc: stable@vger.kernel.org
Cc: Quentin Perret <qperret@google.com>
Reviewed-by: Quentin Perret <qperret@google.com>
Link: https://patch.msgid.link/20260305132751.2928138-1-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/mem_protect.c

index 38f66a56a76655a21ca3233536bf94bdd90b3d38..d815265bd374fa0a83443877302a323598f71057 100644 (file)
@@ -518,7 +518,7 @@ static int host_stage2_adjust_range(u64 addr, struct kvm_mem_range *range)
                granule = kvm_granule_size(level);
                cur.start = ALIGN_DOWN(addr, granule);
                cur.end = cur.start + granule;
-               if (!range_included(&cur, range))
+               if (!range_included(&cur, range) && level < KVM_PGTABLE_LAST_LEVEL)
                        continue;
                *range = cur;
                return 0;