]> www.infradead.org Git - users/hch/misc.git/commitdiff
KVM: arm64: Improve error handling from check_host_shared_guest()
authorQuentin Perret <qperret@google.com>
Fri, 7 Feb 2025 14:54:37 +0000 (14:54 +0000)
committerMarc Zyngier <maz@kernel.org>
Sun, 9 Feb 2025 10:20:38 +0000 (10:20 +0000)
The check_host_shared_guest() path expects to find a last-level valid
PTE in the guest's stage-2 page-table. However, it checks the PTE's
level before its validity, which makes it hard for callers to figure out
what went wrong.

To make error handling simpler, check the PTE's validity first.

Signed-off-by: Quentin Perret <qperret@google.com>
Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20250207145438.1333475-2-qperret@google.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/mem_protect.c

index 7ad7b133b81a86cce5e75172fcb2abb4faffe4ae..41847c04b270f246f9c92c8ac02521ee9c8aff7e 100644 (file)
@@ -943,10 +943,10 @@ static int __check_host_shared_guest(struct pkvm_hyp_vm *vm, u64 *__phys, u64 ip
        ret = kvm_pgtable_get_leaf(&vm->pgt, ipa, &pte, &level);
        if (ret)
                return ret;
-       if (level != KVM_PGTABLE_LAST_LEVEL)
-               return -E2BIG;
        if (!kvm_pte_valid(pte))
                return -ENOENT;
+       if (level != KVM_PGTABLE_LAST_LEVEL)
+               return -E2BIG;
 
        state = guest_get_page_state(pte, ipa);
        if (state != PKVM_PAGE_SHARED_BORROWED)