mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
ANDROID: KVM: arm64: Introduce kvm_pgtable_stage2_reclaim_leaves
We will soon improve the mechanism by which the host's stage-2 page-table pages are recycled whenever its pool runs out of pages. To prepare thecground for this, introduce a new helper function in the page-table code allowing to reclaim leaf pages that don't hold counted PTEs. Bug: 264070847 Change-Id: Ie172bf11f2980e45bc908002368759f74f42d195 Signed-off-by: Quentin Perret <qperret@google.com>
This commit is contained in:
committed by
Carlos Llamas
parent
5224fbb5b8
commit
a701418f2f
@@ -490,6 +490,21 @@ int kvm_pgtable_stage2_annotate(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
|||||||
*/
|
*/
|
||||||
int kvm_pgtable_stage2_unmap(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
int kvm_pgtable_stage2_unmap(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kvm_pgtable_stage2_reclaim_leaves() - Attempt to reclaim leaf page-table
|
||||||
|
* pages by coalescing table entries into
|
||||||
|
* block mappings.
|
||||||
|
* @pgt: Page-table structure initialised by kvm_pgtable_stage2_init*().
|
||||||
|
* @addr: Intermediate physical address from which to reclaim leaves.
|
||||||
|
* @size: Size of the range.
|
||||||
|
*
|
||||||
|
* The offset of @addr within a page is ignored and @size is rounded-up to
|
||||||
|
* the next page boundary.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, negative error code on failure.
|
||||||
|
*/
|
||||||
|
int kvm_pgtable_stage2_reclaim_leaves(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kvm_pgtable_stage2_wrprotect() - Write-protect guest stage-2 address range
|
* kvm_pgtable_stage2_wrprotect() - Write-protect guest stage-2 address range
|
||||||
* without TLB invalidation.
|
* without TLB invalidation.
|
||||||
|
|||||||
@@ -1017,6 +1017,30 @@ int kvm_pgtable_stage2_unmap(struct kvm_pgtable *pgt, u64 addr, u64 size)
|
|||||||
return kvm_pgtable_walk(pgt, addr, size, &walker);
|
return kvm_pgtable_walk(pgt, addr, size, &walker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int stage2_reclaim_leaf_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
|
||||||
|
enum kvm_pgtable_walk_flags flag, void * const arg)
|
||||||
|
{
|
||||||
|
stage2_coalesce_walk_table_post(addr, end, level, ptep, arg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int kvm_pgtable_stage2_reclaim_leaves(struct kvm_pgtable *pgt, u64 addr, u64 size)
|
||||||
|
{
|
||||||
|
struct stage2_map_data map_data = {
|
||||||
|
.phys = KVM_PHYS_INVALID,
|
||||||
|
.mmu = pgt->mmu,
|
||||||
|
.mm_ops = pgt->mm_ops,
|
||||||
|
};
|
||||||
|
struct kvm_pgtable_walker walker = {
|
||||||
|
.cb = stage2_reclaim_leaf_walker,
|
||||||
|
.arg = &map_data,
|
||||||
|
.flags = KVM_PGTABLE_WALK_TABLE_POST,
|
||||||
|
};
|
||||||
|
|
||||||
|
return kvm_pgtable_walk(pgt, addr, size, &walker);
|
||||||
|
}
|
||||||
|
|
||||||
struct stage2_attr_data {
|
struct stage2_attr_data {
|
||||||
kvm_pte_t attr_set;
|
kvm_pte_t attr_set;
|
||||||
kvm_pte_t attr_clr;
|
kvm_pte_t attr_clr;
|
||||||
|
|||||||
Reference in New Issue
Block a user