[PATCH v2 19/22] KVM: arm64: Extend pKVM page ownership selftests to cover guest block split
Vincent Donnefort
vdonnefort at google.com
Fri Sep 11 06:50:50 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>
---
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 f4943c2a237f..e318b5a3f600 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -2105,6 +2105,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.55.0.1007.g17ff1f9808-goog
More information about the linux-arm-kernel
mailing list