ANDROID: KVM: arm64: Deprecate lazy pte mappings for hyp modules
Remove the lazy PTE mapping functionality for vendor modules since we now support donating memory through the ff-a lend interface. Bug: 352480558 Bug: 278749606 Bug: 381963586 Change-Id: I632d937cda52d8869b1157063d24dc86ee53085f Signed-off-by: Sebastian Ene <sebastianene@google.com>
This commit is contained in:
@@ -941,27 +941,4 @@ enum kvm_pgtable_prot kvm_pgtable_hyp_pte_prot(kvm_pte_t pte);
|
|||||||
*/
|
*/
|
||||||
void kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu,
|
void kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu,
|
||||||
phys_addr_t addr, size_t size);
|
phys_addr_t addr, size_t size);
|
||||||
|
|
||||||
/**
|
|
||||||
* kvm_pgtable_stage2_get_pages() - Raise the refcount for each entry and unmap them.
|
|
||||||
*
|
|
||||||
* @pgt: Page-table structure initialised by kvm_pgtable_*_init()
|
|
||||||
* or a similar initialiser.
|
|
||||||
* @addr: Input address for the start of the walk.
|
|
||||||
* @size: Size of the range.
|
|
||||||
* @mc: Cache of pre-allocated and zeroed memory from which to allocate
|
|
||||||
* page-table pages.
|
|
||||||
*/
|
|
||||||
int kvm_pgtable_stage2_get_pages(struct kvm_pgtable *pgt, u64 addr, u64 size, void *mc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* kvm_pgtable_stage2_put_pages() - Drop the refcount for each entry. This is the
|
|
||||||
* opposite of kvm_pgtable_get_pages().
|
|
||||||
*
|
|
||||||
* @pgt: Page-table structure initialised by kvm_pgtable_*_init()
|
|
||||||
* or a similar initialiser.
|
|
||||||
* @addr: Input address for the start of the walk.
|
|
||||||
* @size: Size of the range.
|
|
||||||
*/
|
|
||||||
int kvm_pgtable_stage2_put_pages(struct kvm_pgtable *pgt, u64 addr, u64 size);
|
|
||||||
#endif /* __ARM64_KVM_PGTABLE_H__ */
|
#endif /* __ARM64_KVM_PGTABLE_H__ */
|
||||||
|
|||||||
@@ -95,12 +95,14 @@ struct pkvm_sglist_page {
|
|||||||
* allows to apply this prot on a range of
|
* allows to apply this prot on a range of
|
||||||
* contiguous memory.
|
* contiguous memory.
|
||||||
* @host_stage2_enable_lazy_pte:
|
* @host_stage2_enable_lazy_pte:
|
||||||
|
* DEPRECATED
|
||||||
* Unmap a range of memory from the host stage-2,
|
* Unmap a range of memory from the host stage-2,
|
||||||
* leaving the pages host ownership intact. The
|
* leaving the pages host ownership intact. The
|
||||||
* pages will be remapped lazily (subject to the
|
* pages will be remapped lazily (subject to the
|
||||||
* usual ownership checks) in response to a
|
* usual ownership checks) in response to a
|
||||||
* faulting access from the host.
|
* faulting access from the host.
|
||||||
* @host_stage2_disable_lazy_pte:
|
* @host_stage2_disable_lazy_pte:
|
||||||
|
* DEPRECATED
|
||||||
* This is the opposite function of
|
* This is the opposite function of
|
||||||
* host_stage2_enable_lazy_pte. Must be called once
|
* host_stage2_enable_lazy_pte. Must be called once
|
||||||
* the module is done with the region.
|
* the module is done with the region.
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ int __pkvm_guest_relinquish_to_host(struct pkvm_hyp_vcpu *vcpu,
|
|||||||
u64 ipa, u64 *ppa);
|
u64 ipa, u64 *ppa);
|
||||||
int __pkvm_use_dma(u64 phys_addr, size_t size, struct pkvm_hyp_vcpu *hyp_vcpu);
|
int __pkvm_use_dma(u64 phys_addr, size_t size, struct pkvm_hyp_vcpu *hyp_vcpu);
|
||||||
int __pkvm_unuse_dma(u64 phys_addr, size_t size, struct pkvm_hyp_vcpu *hyp_vcpu);
|
int __pkvm_unuse_dma(u64 phys_addr, size_t size, struct pkvm_hyp_vcpu *hyp_vcpu);
|
||||||
int __pkvm_host_lazy_pte(u64 pfn, u64 nr_pages, bool enable);
|
|
||||||
u64 __pkvm_ptdump_get_config(pkvm_handle_t handle, enum pkvm_ptdump_ops op);
|
u64 __pkvm_ptdump_get_config(pkvm_handle_t handle, enum pkvm_ptdump_ops op);
|
||||||
u64 __pkvm_ptdump_walk_range(pkvm_handle_t handle, struct pkvm_ptdump_log_hdr *log_hva);
|
u64 __pkvm_ptdump_walk_range(pkvm_handle_t handle, struct pkvm_ptdump_log_hdr *log_hva);
|
||||||
|
|
||||||
|
|||||||
@@ -1779,45 +1779,6 @@ unlock:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __pkvm_host_lazy_pte(u64 pfn, u64 nr_pages, bool enable)
|
|
||||||
{
|
|
||||||
u64 size, end, addr = hyp_pfn_to_phys(pfn);
|
|
||||||
struct memblock_region *reg;
|
|
||||||
struct kvm_mem_range range;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (check_shl_overflow(nr_pages, PAGE_SHIFT, &size) ||
|
|
||||||
check_add_overflow(addr, size, &end))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Reject MMIO regions */
|
|
||||||
reg = find_mem_range(addr, &range);
|
|
||||||
if (!reg || !is_in_mem_range(end - 1, &range))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
host_lock_component();
|
|
||||||
|
|
||||||
ret = ___host_check_page_state_range(addr, size, PKVM_PAGE_OWNED, reg, true);
|
|
||||||
if (ret)
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
if (enable) {
|
|
||||||
ret = kvm_pgtable_stage2_get_pages(&host_mmu.pgt, addr, size,
|
|
||||||
&host_s2_pool);
|
|
||||||
} else {
|
|
||||||
ret = kvm_pgtable_stage2_put_pages(&host_mmu.pgt, addr, size);
|
|
||||||
if (ret)
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
WARN_ON(host_stage2_idmap_locked(addr, size, PKVM_HOST_MEM_PROT, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock:
|
|
||||||
host_unlock_component();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int hyp_pin_shared_mem(void *from, void *to)
|
int hyp_pin_shared_mem(void *from, void *to)
|
||||||
{
|
{
|
||||||
u64 cur, start = ALIGN_DOWN((u64)from, PAGE_SIZE);
|
u64 cur, start = ALIGN_DOWN((u64)from, PAGE_SIZE);
|
||||||
|
|||||||
@@ -116,12 +116,20 @@ static void tracing_mod_hyp_printk(u8 fmt_id, u64 a, u64 b, u64 c, u64 d)
|
|||||||
|
|
||||||
static int host_stage2_enable_lazy_pte(u64 pfn, u64 nr_pages)
|
static int host_stage2_enable_lazy_pte(u64 pfn, u64 nr_pages)
|
||||||
{
|
{
|
||||||
return __pkvm_host_lazy_pte(pfn, nr_pages, true);
|
/*
|
||||||
|
* Deprecating the lazy PTE functionality as now the
|
||||||
|
* host can unmap on FF-A lend.
|
||||||
|
*/
|
||||||
|
WARN_ON(1);
|
||||||
|
|
||||||
|
return -EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int host_stage2_disable_lazy_pte(u64 pfn, u64 nr_pages)
|
static int host_stage2_disable_lazy_pte(u64 pfn, u64 nr_pages)
|
||||||
{
|
{
|
||||||
return __pkvm_host_lazy_pte(pfn, nr_pages, false);
|
WARN_ON(1);
|
||||||
|
|
||||||
|
return -EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __hyp_smp_processor_id(void)
|
static int __hyp_smp_processor_id(void)
|
||||||
|
|||||||
@@ -1263,66 +1263,6 @@ int kvm_pgtable_stage2_annotate(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stage2_get_pages_walker(const struct kvm_pgtable_visit_ctx *ctx,
|
|
||||||
enum kvm_pgtable_walk_flags visit)
|
|
||||||
{
|
|
||||||
struct kvm_pgtable_mm_ops *mm_ops = ctx->mm_ops;
|
|
||||||
struct stage2_map_data *data = ctx->arg;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = stage2_map_walk_leaf(ctx, data);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (ctx->level == KVM_PGTABLE_LAST_LEVEL)
|
|
||||||
mm_ops->get_page(ctx->ptep);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int kvm_pgtable_stage2_get_pages(struct kvm_pgtable *pgt, u64 addr, u64 size,
|
|
||||||
void *mc)
|
|
||||||
{
|
|
||||||
struct stage2_map_data map_data = {
|
|
||||||
.phys = KVM_PHYS_INVALID,
|
|
||||||
.mmu = pgt->mmu,
|
|
||||||
.memcache = mc,
|
|
||||||
.force_pte = true,
|
|
||||||
};
|
|
||||||
struct kvm_pgtable_walker walker = {
|
|
||||||
.cb = stage2_get_pages_walker,
|
|
||||||
.flags = KVM_PGTABLE_WALK_LEAF,
|
|
||||||
.arg = &map_data,
|
|
||||||
};
|
|
||||||
|
|
||||||
return kvm_pgtable_walk(pgt, addr, size, &walker);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int stage2_put_pages_walker(const struct kvm_pgtable_visit_ctx *ctx,
|
|
||||||
enum kvm_pgtable_walk_flags visit)
|
|
||||||
{
|
|
||||||
struct kvm_pgtable_mm_ops *mm_ops = ctx->mm_ops;
|
|
||||||
|
|
||||||
/* get_pages has force_pte */
|
|
||||||
if (WARN_ON(ctx->level != KVM_PGTABLE_LAST_LEVEL))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
mm_ops->put_page(ctx->ptep);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int kvm_pgtable_stage2_put_pages(struct kvm_pgtable *pgt, u64 addr, u64 size)
|
|
||||||
{
|
|
||||||
struct kvm_pgtable_walker walker = {
|
|
||||||
.cb = stage2_put_pages_walker,
|
|
||||||
.flags = KVM_PGTABLE_WALK_LEAF,
|
|
||||||
.arg = pgt->mmu,
|
|
||||||
};
|
|
||||||
|
|
||||||
return kvm_pgtable_walk(pgt, addr, size, &walker);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int stage2_unmap_walker(const struct kvm_pgtable_visit_ctx *ctx,
|
static int stage2_unmap_walker(const struct kvm_pgtable_visit_ctx *ctx,
|
||||||
enum kvm_pgtable_walk_flags visit)
|
enum kvm_pgtable_walk_flags visit)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user