[PATCH v3 20/23] KVM: arm64: Extend pKVM page ownership selftests to cover guest block split
Vincent Donnefort
vdonnefort at google.com
Mon Nov 2 12:46:25 PST 2026
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 <vdonnefort at google.com>
---
arch/arm64/kvm/hyp/nvhe/mem_protect.c | 41 +++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index 7ecf4c98d7b5..82fcec43f16a 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -2128,6 +2128,47 @@ 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(-E2BIG, __pkvm_host_reclaim_guest, gfn, 1, vm);
+ assert_transition_res(-E2BIG, __pkvm_guest_share_host, vcpu, gfn, 1);
+ 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_guest, gfn, nr_pages, vm);
+ assert_transition_res(-E2BIG, __pkvm_guest_share_host, vcpu, gfn, nr_pages);
+
+ for (int i = 0; i < nr_pages; i++) {
+ WARN_ON(__pkvm_guest_share_host(vcpu, gfn + i, 1));
+ WARN_ON(__pkvm_guest_unshare_host(vcpu, gfn + i, 1));
+ }
+ assert_page_state();
+
+ for (int i = 0; i < nr_pages; i++)
+ WARN_ON(__pkvm_host_reclaim_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.56.0.385.gac671c819a-goog
More information about the linux-arm-kernel
mailing list