Message ID | 20230608220558.39094-1-ctshao@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1,1/3] KVM: arm64: Consistently use free_removed_table() for stage-2 | expand |
On Thu, Jun 8, 2023 at 4:06 PM Chun-Tse Shao <ctshao@google.com> wrote: > > From: Oliver Upton <oliver.upton@linux.dev> > > free_removed_table() is essential to the RCU-protected parallel walking > scheme, as behind the scenes the cleanup is deferred until an RCU grace > period. Nonetheless, the stage-2 unmap path calls put_page() directly, > which leads to table memory being freed inline with the table walk. > > This is safe for the time being, as the stage-2 unmap walker is called > while holding the write lock. A future change to KVM will further relax > the locking mechanics around the stage-2 page tables to allow lock-free > walkers protected only by RCU. As such, switch to the RCU-safe mechanism > for freeing table memory. > > Signed-off-by: Oliver Upton <oliver.upton@linux.dev> > Signed-off-by: Chun-Tse Shao <ctshao@google.com> Acked-by: Yu Zhao <yuzhao@google.com>
diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 5282cb9ca4cf..cc1af0286755 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -1042,7 +1042,7 @@ static int stage2_unmap_walker(const struct kvm_pgtable_visit_ctx *ctx, kvm_granule_size(ctx->level)); if (childp) - mm_ops->put_page(childp); + mm_ops->free_removed_table(childp, ctx->level); return 0; }