Revert "ANDROID: KVM: arm64: Flag pages needing poisoning in hyp_vmemmap"

This reverts commit a0662e559d.

Bug: 233587962
Signed-off-by: Will Deacon <willdeacon@google.com>
Change-Id: I5e5ddab37e7ebfc0c1f25120e39760064f99871b
This commit is contained in:
Will Deacon
2022-07-07 15:49:07 +01:00
parent 567e5b159c
commit 6c23c215a6
3 changed files with 25 additions and 15 deletions

View File

@@ -58,6 +58,7 @@ typedef u32 pkvm_id;
static const pkvm_id pkvm_host_id = 0;
static const pkvm_id pkvm_hyp_id = (1 << 16);
static const pkvm_id pkvm_ffa_id = pkvm_hyp_id + 1; /* Secure world */
static const pkvm_id pkvm_host_poison = pkvm_ffa_id + 1;
extern unsigned long hyp_nr_cpus;

View File

@@ -7,12 +7,6 @@
#include <linux/types.h>
/*
* Accesses to struct hyp_page flags must be serialized by the host stage-2
* page-table lock due to the lack of atomics at EL2.
*/
#define HOST_PAGE_NEED_POISONING BIT(0)
struct hyp_page {
unsigned short refcount;
u8 order;

View File

@@ -286,13 +286,17 @@ static int reclaim_walker(u64 addr, u64 end, u32 level, kvm_pte_t *ptep,
void * const arg)
{
kvm_pte_t pte = *ptep;
struct hyp_page *page;
phys_addr_t phys;
if (!kvm_pte_valid(pte))
return 0;
page = hyp_phys_to_page(kvm_pte_to_phys(pte));
page->flags |= HOST_PAGE_NEED_POISONING;
/*
* Only update the host stage-2 -- we're about to tear-down the guest
* stage-2 so no need to waste effort trying to keep it in sync.
*/
phys = kvm_pte_to_phys(pte);
BUG_ON(host_stage2_set_owner_locked(phys, PAGE_SIZE, pkvm_host_poison));
return 0;
}
@@ -516,6 +520,11 @@ static kvm_pte_t kvm_init_invalid_leaf_owner(pkvm_id owner_id)
return FIELD_PREP(KVM_INVALID_PTE_OWNER_MASK, owner_id);
}
static pkvm_id kvm_get_owner_id(kvm_pte_t pte)
{
return FIELD_GET(KVM_INVALID_PTE_OWNER_MASK, pte);
}
int host_stage2_set_owner_locked(phys_addr_t addr, u64 size,
pkvm_id owner_id)
{
@@ -1855,7 +1864,7 @@ static int hyp_zero_page(phys_addr_t phys)
int __pkvm_host_reclaim_page(u64 pfn)
{
u64 addr = hyp_pfn_to_phys(pfn);
struct hyp_page *page;
enum pkvm_page_state state;
kvm_pte_t pte;
int ret;
@@ -1865,17 +1874,23 @@ int __pkvm_host_reclaim_page(u64 pfn)
if (ret)
goto unlock;
if (host_get_page_state(pte) == PKVM_PAGE_OWNED)
if (kvm_pte_valid(pte)) {
state = host_get_page_state(pte);
ret = (state == PKVM_PAGE_OWNED) ? 0 : -EPERM;
goto unlock;
}
page = hyp_phys_to_page(addr);
if (page->flags & HOST_PAGE_NEED_POISONING) {
switch (kvm_get_owner_id(pte)) {
case pkvm_host_id:
ret = 0;
break;
case pkvm_host_poison:
ret = hyp_zero_page(addr);
if (ret)
goto unlock;
page->flags &= ~HOST_PAGE_NEED_POISONING;
ret = host_stage2_set_owner_locked(addr, PAGE_SIZE, pkvm_host_id);
} else {
break;
default:
ret = -EPERM;
}