Skip to content

Commit f6a27d6

Browse files
ouptonMarc Zyngier
authored and
Marc Zyngier
committed
KVM: arm64: Drop last page ref in kvm_pgtable_stage2_free_removed()
The reference count on page table allocations is increased for every 'counted' PTE (valid or donated) in the table in addition to the initial reference from ->zalloc_page(). kvm_pgtable_stage2_free_removed() fails to drop the last reference on the root of the table walk, meaning we leak memory. Fix it by dropping the last reference after the free walker returns, at which point all references for 'counted' PTEs have been released. Cc: [email protected] Fixes: 5c359cc ("KVM: arm64: Tear down unlinked stage-2 subtree after break-before-make") Reported-by: Yu Zhao <[email protected]> Signed-off-by: Oliver Upton <[email protected]> Tested-by: Yu Zhao <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 811154e commit f6a27d6

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

arch/arm64/kvm/hyp/pgtable.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,4 +1332,7 @@ void kvm_pgtable_stage2_free_removed(struct kvm_pgtable_mm_ops *mm_ops, void *pg
13321332
};
13331333

13341334
WARN_ON(__kvm_pgtable_walk(&data, mm_ops, ptep, level + 1));
1335+
1336+
WARN_ON(mm_ops->page_count(pgtable) != 1);
1337+
mm_ops->put_page(pgtable);
13351338
}

0 commit comments

Comments
 (0)