[PATCH 17/20] KVM: arm64: Extend pKVM page ownership selftests to cover guest block split
Vincent Donnefort
vdonnefort at google.com
Mon Aug 3 03:09:01 PDT 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>
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
More information about the linux-arm-kernel
mailing list