[PATCH] KVM: arm64: pkvm: Fallback to level-3 mapping on host stage-2 fault
Quentin Perret
qperret at google.com
Thu Mar 5 06:20:13 PST 2026
On Thursday 05 Mar 2026 at 13:27:51 (+0000), Marc Zyngier wrote:
> 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
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> Cc: stable at vger.kernel.org
> Cc: Quentin Perret <qperret at google.com>
> ---
> arch/arm64/kvm/hyp/nvhe/mem_protect.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> index 38f66a56a7665..d815265bd374f 100644
> --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
> @@ -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;
> --
> 2.47.3
>
Reviewed-by: Quentin Perret <qperret at google.com>
Thanks,
Quentin
More information about the linux-arm-kernel
mailing list