[PATCH 1/3] KVM: arm64: Don't walk the whole IPA space when destroying a pKVM stage-2
Oliver Upton
oupton at kernel.org
Tue Nov 3 08:48:14 PST 2026
On Tue, Nov 03, 2026 at 08:47:31AM -0800, Oliver Upton wrote:
> On Tue, Nov 03, 2026 at 04:37:54PM +0000, Vincent Donnefort wrote:
> > > @@ -513,10 +514,18 @@ void pkvm_pgtable_stage2_destroy_range(struct kvm_pgtable *pgt,
> > > kvm->arch.pkvm.is_dying = true;
> > > }
> > >
> > > - if (kvm_vm_is_protected(kvm))
> > > - __pkvm_pgtable_stage2_reclaim(pgt, addr, addr + size);
> > > - else
> > > - __pkvm_pgtable_stage2_unshare(pgt, addr, addr + size);
> > > + /* Called once for the whole IPA space, so reschedule between mappings */
> > > + for_each_mapping_in_range_safe(pgt, addr, addr + size, mapping) {
> > > + u64 start = __pkvm_mapping_start(mapping);
> > > + u64 end = __pkvm_mapping_end(mapping) + 1;
> > > +
> > > + if (kvm_vm_is_protected(kvm))
> > > + __pkvm_pgtable_stage2_reclaim(pgt, start, end);
> > > + else
> > > + __pkvm_pgtable_stage2_unshare(pgt, start, end);
> > > +
> > > + cond_resched();
> > > + }
> > > }
> >
> > Just thought that it is a bit weird that pkvm_pgtable_stage2_destroy_range()
> > does cond_resched() while kvm_pgtable_stage2_destroy_range() does not.
> >
> > How about instead kvm_stage2_destroy() refines start/end with some accessors
> > calling in pkvm.c pkvm_mapping_iter_first() / pkvm_mapping_iter_last()?
>
> Yeah, I'd rather we tackle this as a general problem than doing some
> pKVM specific hacks.
>
> Seems to me that we do a lot of wasted work even in the non-pKVM case
> where the outer loop will continue to iterate KVM_PGTABLE_MIN_BLOCK_LEVEL
> worth of IPA even if the underlying table is empty.
>
> What we'd want is for the kvm_pgtable_stage2_destroy_range()
> implementation to report back how much of the IPA space it actually
> iterated over. We wouldn't want to keep re-visiting the same invalid PGD
> entry only because it's larger than our max block size.
Next patch heh :)
More information about the linux-arm-kernel
mailing list