[PATCH 17/20] KVM: arm64: Extend pKVM page ownership selftests to cover guest block split
Vincent Donnefort <[email protected]> Mon, 3 Aug 2026 11:09:01 +0100
| Newsgroups | dev.linux.lists.kvmarm,org.infradead.lists.linux-arm-kernel |
|---|---|
| Message-ID | <[email protected]> |
Extend the pKVM page ownership selftests to test the split of a guest stage-2 block and the per-page reclaim of that same block. Signed-off-by: Vincent Donnefort <[email protected]> diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index 71ebd1856cb0..e22a7991f8ec 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -2070,6 +2070,38 @@ int __pkvm_ownership_selftest(u64 pfn, u64 nr_pages, u64 pgtable_pfn, assert_transition_res(-EPERM, __pkvm_host_donate_guest, pfn, gfn, nr_pages, vcpu); assert_transition_res(-EPERM, __pkvm_host_share_guest, pfn, gfn, nr_pages, vcpu, prot); + if (size == PMD_SIZE) { + /* [gfn, gfn + nr_pages) was poisoned. Skip it */ + gfn += nr_pages; + + selftest_state.host = PKVM_NOPAGE; + selftest_state.guest[1] = PKVM_PAGE_OWNED; + assert_transition_res(0, __pkvm_host_donate_guest, pfn, gfn, nr_pages, vcpu); + assert_transition_res(0, __pkvm_host_split_guest, gfn, nr_pages, vcpu); + + assert_transition_res(-E2BIG, __pkvm_host_split_guest, gfn, nr_pages, vcpu); + assert_transition_res(-E2BIG, __pkvm_host_reclaim_page_guest, gfn, nr_pages, vm); + + for (int i = 0; i < nr_pages; i++) + WARN_ON(__pkvm_host_reclaim_page_guest(gfn + i, 1, vm)); + + selftest_state.host = PKVM_PAGE_OWNED; + selftest_state.guest[1] = PKVM_NOPAGE; + assert_page_state(); + + selftest_state.host = PKVM_NOPAGE; + selftest_state.guest[1] = PKVM_PAGE_OWNED; + assert_transition_res(0, __pkvm_host_donate_guest, pfn, gfn, nr_pages, vcpu); + assert_transition_res(0, __pkvm_host_split_guest, gfn, nr_pages, vcpu); + + for (int i = 0; i < nr_pages; i++) + WARN_ON(__pkvm_host_force_reclaim_page_guest(phys + i * PAGE_SIZE)); + + selftest_state.host = PKVM_PAGE_OWNED; + selftest_state.guest[1] = PKVM_POISON; + assert_page_state(); + } + selftest_state.host = PKVM_NOPAGE; selftest_state.hyp = PKVM_PAGE_OWNED; assert_transition_res(0, __pkvm_host_donate_hyp, pfn, nr_pages); -- 2.55.0.508.g3f0d502094-goog