diff options
author | Huang Ying <ying.huang@intel.com> | 2011-01-29 22:15:48 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2011-03-17 12:08:27 -0400 |
commit | 69ebb83e13e514222b0ae4f8bd813a17679ed876 (patch) | |
tree | 62ccc7ee1e840d0a6cc01a9fc1c44a5f4e6f1edd /mm/memory.c | |
parent | 0014bd990e69063b0fb78940b35439d7980ce3ee (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.c | 13 |
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 | } |