Re: [PATCH 11/20] KVM: arm64: Add a range to pKVM ownership selftest
[email protected] Mon, 03 Aug 2026 10:48:48 +0000
| Newsgroups | dev.linux.lists.kvmarm |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] The pKVM ownership selftest crashes the hypervisor during boot when testing block-granular ranges. -- --- Patch [11]: [PATCH 11/20] KVM: arm64: Add a range to pKVM ownership selftest --- commit e6586b2867cba4559d50173770f2de71da4f2380 Author: Vincent Donnefort <[email protected]> KVM: arm64: Add a range to pKVM ownership selftest Extends pkvm_ownership_selftest() with a nr_pages argument to test state transitions with both page-granular and block-granular ranges. > diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c > index a53600c853d4f..d5ee079a5d70d 100644 > --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c > +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c [ ... ] > @@ -1894,10 +1901,10 @@ int __pkvm_ownership_selftest(u64 pfn, u64 pgtable_pfn, unsigned long pgtable_nr > > selftest_state.host = PKVM_PAGE_OWNED; > selftest_state.guest[0] = PKVM_POISON; > assert_transition_res(0, __pkvm_host_force_reclaim_page_guest, phys); [Severity: High] Will this crash the hypervisor during boot when testing block-granular ranges? When the selftest executes with a block-level range via PMD_ORDER, this assertion expects __pkvm_host_force_reclaim_page_guest() to return 0. However, __pkvm_host_force_reclaim_page_guest() hardcodes PAGE_SIZE internally: arch/arm64/kvm/hyp/nvhe/mem_protect.c:__pkvm_host_force_reclaim_page_guest() { ... ret = get_valid_guest_pte(vm, ipa, PAGE_SIZE, &pte, &pa); ... } Because the mapping installed for this run is block-granular, get_valid_guest_pte() will return -E2BIG. This causes assert_transition_res() to fail, which triggers a WARN_ON at EL2. Since WARN_ON expands to a fatal BRK instruction at EL2, this results in a hypervisor panic during boot. [ ... ] > diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c > index a9645480d1648..4d41a16cd5962 100644 > --- a/arch/arm64/kvm/pkvm.c > +++ b/arch/arm64/kvm/pkvm.c [ ... ] > @@ -274,17 +283,9 @@ void __init pkvm_ownership_selftest(void) > /* Memory for the VM page-table */ > pgtable = __get_free_pages(GFP_KERNEL, pgtable_order); > if (!pgtable) > - goto out; > - > - /* Page whose ownership will be tested */ > - page = __get_free_page(GFP_KERNEL); > - if (!page) > - goto out; > + return; > > - ret = kvm_call_hyp_nvhe(__pkvm_ownership_selftest, virt_to_pfn((void *)page), > - virt_to_pfn((void *)pgtable), 1 << pgtable_order); > -out: > - if (ret) > - kvm_err("Failed to run %s (%ld)\n", __func__, ret); > + __pkvm_ownership_selftest(0, pgtable, pgtable_order); > + __pkvm_ownership_selftest(PMD_ORDER, pgtable, pgtable_order); > > free_pages(pgtable, pgtable_order); > - free_page(page); > } -- Sashiko AI review ยท https://sashiko.dev/#/patchset/[email protected]?part=11