mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
KVM: Drop extra GUP (via check_user_page_hwpoison()) to detect poisoned page
Remove check_user_page_hwpoison() as it's effectively dead code. Prior to
commit 234b239bea
("kvm: Faults which trigger IO release the mmap_sem"),
hva_to_pfn_slow() wasn't actually a slow path in all cases, i.e. would do
get_user_pages_fast() without ever doing slow GUP with FOLL_HWPOISON.
Now that hva_to_pfn_slow() is a straight shot to get_user_pages_unlocked(),
and unconditionally passes FOLL_HWPOISON, it is impossible for hva_to_pfn()
to get an -errno that needs to be morphed to -EHWPOISON.
There are essentially four cases in KVM:
- npages == 0, then FOLL_NOWAIT, a.k.a. @async, must be true, and thus
check_user_page_hwpoison() will not be called
- npages == 1 || npages == -EHWPOISON, all good
- npages == -EINTR || npages == -EAGAIN, bail early, all good
- everything else, including -EFAULT, can go down the vma_lookup() path,
as npages < 0 means KVM went through hva_to_pfn_slow() which passes
FOLL_HWPOISON
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
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-16-seanjc@google.com>
This commit is contained in:
parent
d1331a4469
commit
b176f4b417
@ -2746,14 +2746,6 @@ unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *w
|
||||
return gfn_to_hva_memslot_prot(slot, gfn, writable);
|
||||
}
|
||||
|
||||
static inline int check_user_page_hwpoison(unsigned long addr)
|
||||
{
|
||||
int rc, flags = FOLL_HWPOISON | FOLL_WRITE;
|
||||
|
||||
rc = get_user_pages(addr, 1, flags, NULL);
|
||||
return rc == -EHWPOISON;
|
||||
}
|
||||
|
||||
/*
|
||||
* The fast path to get the writable pfn which will be stored in @pfn,
|
||||
* true indicates success, otherwise false is returned.
|
||||
@ -2948,14 +2940,10 @@ kvm_pfn_t hva_to_pfn(unsigned long addr, bool interruptible, bool *async,
|
||||
return pfn;
|
||||
if (npages == -EINTR || npages == -EAGAIN)
|
||||
return KVM_PFN_ERR_SIGPENDING;
|
||||
if (npages == -EHWPOISON)
|
||||
return KVM_PFN_ERR_HWPOISON;
|
||||
|
||||
mmap_read_lock(current->mm);
|
||||
if (npages == -EHWPOISON ||
|
||||
(!async && check_user_page_hwpoison(addr))) {
|
||||
pfn = KVM_PFN_ERR_HWPOISON;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
retry:
|
||||
vma = vma_lookup(current->mm, addr);
|
||||
|
||||
@ -2972,7 +2960,6 @@ kvm_pfn_t hva_to_pfn(unsigned long addr, bool interruptible, bool *async,
|
||||
*async = true;
|
||||
pfn = KVM_PFN_ERR_FAULT;
|
||||
}
|
||||
exit:
|
||||
mmap_read_unlock(current->mm);
|
||||
return pfn;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user