aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memory.c
diff options
context:
space:
mode:
authorHuang Ying <ying.huang@intel.com>2011-01-29 22:15:48 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2011-03-17 12:08:27 -0400
commit69ebb83e13e514222b0ae4f8bd813a17679ed876 (patch)
tree62ccc7ee1e840d0a6cc01a9fc1c44a5f4e6f1edd /mm/memory.c
parent0014bd990e69063b0fb78940b35439d7980ce3ee (diff)
mm: make __get_user_pages return -EHWPOISON for HWPOISON page optionally
Make __get_user_pages return -EHWPOISON for HWPOISON page only if FOLL_HWPOISON is specified. With this patch, the interested callers can distinguish HWPOISON pages from general FAULT pages, while other callers will still get -EFAULT for all these pages, so the user space interface need not to be changed. This feature is needed by KVM, where UCR MCE should be relayed to guest for HWPOISON page, while instruction emulation and MMIO will be tried for general FAULT page. The idea comes from Andrew Morton. Signed-off-by: Huang Ying <ying.huang@intel.com> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'mm/memory.c')
-rw-r--r--mm/memory.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/mm/memory.c b/mm/memory.c
index 806a37ec71bd..346ee7e041fd 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1576,9 +1576,16 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
1576 if (ret & VM_FAULT_ERROR) { 1576 if (ret & VM_FAULT_ERROR) {
1577 if (ret & VM_FAULT_OOM) 1577 if (ret & VM_FAULT_OOM)
1578 return i ? i : -ENOMEM; 1578 return i ? i : -ENOMEM;
1579 if (ret & 1579 if (ret & (VM_FAULT_HWPOISON |
1580 (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE| 1580 VM_FAULT_HWPOISON_LARGE)) {
1581 VM_FAULT_SIGBUS)) 1581 if (i)
1582 return i;
1583 else if (gup_flags & FOLL_HWPOISON)
1584 return -EHWPOISON;
1585 else
1586 return -EFAULT;
1587 }
1588 if (ret & VM_FAULT_SIGBUS)
1582 return i ? i : -EFAULT; 1589 return i ? i : -EFAULT;
1583 BUG(); 1590 BUG();
1584 } 1591 }