|
@@ -1028,6 +1028,15 @@ static pfn_t get_fault_pfn(void)
|
|
return fault_pfn;
|
|
return fault_pfn;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline int check_user_page_hwpoison(unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ int rc, flags = FOLL_TOUCH | FOLL_HWPOISON | FOLL_WRITE;
|
|
|
|
+
|
|
|
|
+ rc = __get_user_pages(current, current->mm, addr, 1,
|
|
|
|
+ flags, NULL, NULL, NULL);
|
|
|
|
+ return rc == -EHWPOISON;
|
|
|
|
+}
|
|
|
|
+
|
|
static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic,
|
|
static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic,
|
|
bool *async, bool write_fault, bool *writable)
|
|
bool *async, bool write_fault, bool *writable)
|
|
{
|
|
{
|
|
@@ -1075,7 +1084,7 @@ static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic,
|
|
return get_fault_pfn();
|
|
return get_fault_pfn();
|
|
|
|
|
|
down_read(¤t->mm->mmap_sem);
|
|
down_read(¤t->mm->mmap_sem);
|
|
- if (is_hwpoison_address(addr)) {
|
|
|
|
|
|
+ if (check_user_page_hwpoison(addr)) {
|
|
up_read(¤t->mm->mmap_sem);
|
|
up_read(¤t->mm->mmap_sem);
|
|
get_page(hwpoison_page);
|
|
get_page(hwpoison_page);
|
|
return page_to_pfn(hwpoison_page);
|
|
return page_to_pfn(hwpoison_page);
|