Re: [PATCH 1/2] KVM: arm64: nv: Allocate the shadow S2 MMUs individually
From: Karl Mehltretter
Date: Fri Aug 07 2026 - 13:08:34 EST
On Tue, Aug 04, 2026 at 03:31:13PM +0100, Marc Zyngier wrote:
> See the hack below that seems to work OK.
>
Hi Marc,
Since error handling has come up again, I should clarify why
v2 did not use this sketch verbatim.
> - kvm_init_nested(kvm);
> + ret = kvm_init_nested(kvm);
> + if (ret)
> + return ret;
>
> ret = kvm_share_hyp(kvm, kvm + 1);
> if (ret)
Once kvm_init_nested() has allocated the pointer table, failure in
kvm_share_hyp() or any subsequent VM initialisation step leaks that
table.
v2 therefore calls kvm_init_nested() after the earlier initialisation
steps have succeeded and frees the table if a later step in
kvm_arch_init_vm() fails.
> + for (int i = 0; !ret && i < S2_MMU_PER_VCPU; i++)
> + ret = init_nested_s2_mmu(kvm, &tmp[i]);
> + if (ret) {
> + for (int i = 0; i < S2_MMU_PER_VCPU; i++)
> + kvm_free_stage2_pgd(&tmp[i]);
This cleanup includes the entry whose initialisation failed and any
entries whose initialisation was never attempted. An uninitialised
entry has no valid mmu->arch, but kvm_free_stage2_pgd() immediately
derives kvm from mmu->arch before checking mmu->pgt. It can therefore
dereference an invalid pointer.
This is why v2 tracks successfully initialised MMUs and frees only
those entries.
Thanks,
Karl