]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: Drop KVM_ERR_PTR_BAD_PAGE and instead return NULL to indicate an error
authorSean Christopherson <seanjc@google.com>
Thu, 10 Oct 2024 18:23:03 +0000 (11:23 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 25 Oct 2024 16:54:42 +0000 (12:54 -0400)
Remove KVM_ERR_PTR_BAD_PAGE and instead return NULL, as "bad page" is just
a leftover bit of weirdness from days of old when KVM stuffed a "bad" page
into the guest instead of actually handling missing pages.  See commit
cea7bb21280e ("KVM: MMU: Make gfn_to_page() always safe").

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20241010182427.1434605-2-seanjc@google.com>

arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/book3s_xive_native.c
arch/s390/kvm/vsie.c
arch/x86/kvm/lapic.c
include/linux/kvm_host.h
virt/kvm/kvm_main.c

index 7b8ae509328fe180d6251da6300b7cccbc2aae06..d7721297b9b6e36e836947cb2be5ddd4e2d06585 100644 (file)
@@ -645,7 +645,7 @@ static void kvmppc_patch_dcbz(struct kvm_vcpu *vcpu, struct kvmppc_pte *pte)
        int i;
 
        hpage = gfn_to_page(vcpu->kvm, pte->raddr >> PAGE_SHIFT);
-       if (is_error_page(hpage))
+       if (!hpage)
                return;
 
        hpage_offset = pte->raddr & ~PAGE_MASK;
index 6e2ebbd8aaace81c4566aa106ca88d131de2cc0e..d9bf1bc3ff61059fd58b43d0fb160ad5cae8a4c8 100644 (file)
@@ -654,7 +654,7 @@ static int kvmppc_xive_native_set_queue_config(struct kvmppc_xive *xive,
        }
 
        page = gfn_to_page(kvm, gfn);
-       if (is_error_page(page)) {
+       if (!page) {
                srcu_read_unlock(&kvm->srcu, srcu_idx);
                pr_err("Couldn't get queue page %llx!\n", kvm_eq.qaddr);
                return -EINVAL;
index 89cafea4c41f26c0af31eb00246c892e6c6b2e6f..763a070f595572592a1431a1565f044ca511b3e1 100644 (file)
@@ -661,7 +661,7 @@ static int pin_guest_page(struct kvm *kvm, gpa_t gpa, hpa_t *hpa)
        struct page *page;
 
        page = gfn_to_page(kvm, gpa_to_gfn(gpa));
-       if (is_error_page(page))
+       if (!page)
                return -EINVAL;
        *hpa = (hpa_t)page_to_phys(page) + (gpa & ~PAGE_MASK);
        return 0;
index 2098dc689088bbd4d53353d68fe6e0fb8a6b47a4..20526e4d6c6257b4c73c4fe75bbbe90cbd49c60a 100644 (file)
@@ -2664,7 +2664,7 @@ int kvm_alloc_apic_access_page(struct kvm *kvm)
        }
 
        page = gfn_to_page(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT);
-       if (is_error_page(page)) {
+       if (!page) {
                ret = -EFAULT;
                goto out;
        }
index 45be36e5285ffb5de3c161ff450275997aac7232..0b280e5bad0a52ca719494f7c101edd0b21a97b2 100644 (file)
@@ -153,13 +153,6 @@ static inline bool kvm_is_error_gpa(gpa_t gpa)
        return gpa == INVALID_GPA;
 }
 
-#define KVM_ERR_PTR_BAD_PAGE   (ERR_PTR(-ENOENT))
-
-static inline bool is_error_page(struct page *page)
-{
-       return IS_ERR(page);
-}
-
 #define KVM_REQUEST_MASK           GENMASK(7,0)
 #define KVM_REQUEST_NO_WAKEUP      BIT(8)
 #define KVM_REQUEST_WAIT           BIT(9)
index 141db5b79cd4080c0faf927923ad594305549296..5fc95504affeaaa1ab77cb3a484f09f799f4e0ef 100644 (file)
@@ -3066,19 +3066,14 @@ EXPORT_SYMBOL_GPL(gfn_to_page_many_atomic);
  */
 struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
 {
-       struct page *page;
        kvm_pfn_t pfn;
 
        pfn = gfn_to_pfn(kvm, gfn);
 
        if (is_error_noslot_pfn(pfn))
-               return KVM_ERR_PTR_BAD_PAGE;
-
-       page = kvm_pfn_to_refcounted_page(pfn);
-       if (!page)
-               return KVM_ERR_PTR_BAD_PAGE;
+               return NULL;
 
-       return page;
+       return kvm_pfn_to_refcounted_page(pfn);
 }
 EXPORT_SYMBOL_GPL(gfn_to_page);
 
@@ -3172,7 +3167,8 @@ static void kvm_set_page_accessed(struct page *page)
 
 void kvm_release_page_clean(struct page *page)
 {
-       WARN_ON(is_error_page(page));
+       if (WARN_ON(!page))
+               return;
 
        kvm_set_page_accessed(page);
        put_page(page);
@@ -3196,7 +3192,8 @@ EXPORT_SYMBOL_GPL(kvm_release_pfn_clean);
 
 void kvm_release_page_dirty(struct page *page)
 {
-       WARN_ON(is_error_page(page));
+       if (WARN_ON(!page))
+               return;
 
        kvm_set_page_dirty(page);
        kvm_release_page_clean(page);