diff options
author | Seth, Rohit <rohit.seth@intel.com> | 2005-10-18 17:15:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-19 16:56:27 -0400 |
commit | 3359b54c8c07338f3a863d1109b42eebccdcf379 (patch) | |
tree | f91edd52c71e57ce4b46e3875c9054666ca4e24c /mm | |
parent | bb7e257ef8d8ba43cab356aa1cc1b20d0106d45f (diff) |
[PATCH] Handle spurious page fault for hugetlb region
The hugetlb pages are currently pre-faulted. At the time of mmap of
hugepages, we populate the new PTEs. It is possible that HW has already
cached some of the unused PTEs internally. These stale entries never
get a chance to be purged in existing control flow.
This patch extends the check in page fault code for hugepages. Check if
a faulted address falls with in size for the hugetlb file backing it.
We return VM_FAULT_MINOR for these cases (assuming that the arch
specific page-faulting code purges the stale entry for the archs that
need it).
Signed-off-by: Rohit Seth <rohit.seth@intel.com>
[ This is apparently arguably an ia64 port bug. But the code won't
hurt, and for now it fixes a real problem on some ia64 machines ]
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/mm/memory.c b/mm/memory.c index ae8161f1f459..8c88b973abc5 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2045,8 +2045,18 @@ int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct * vma, | |||
2045 | 2045 | ||
2046 | inc_page_state(pgfault); | 2046 | inc_page_state(pgfault); |
2047 | 2047 | ||
2048 | if (is_vm_hugetlb_page(vma)) | 2048 | if (unlikely(is_vm_hugetlb_page(vma))) { |
2049 | return VM_FAULT_SIGBUS; /* mapping truncation does this. */ | 2049 | if (valid_hugetlb_file_off(vma, address)) |
2050 | /* We get here only if there was a stale(zero) TLB entry | ||
2051 | * (because of HW prefetching). | ||
2052 | * Low-level arch code (if needed) should have already | ||
2053 | * purged the stale entry as part of this fault handling. | ||
2054 | * Here we just return. | ||
2055 | */ | ||
2056 | return VM_FAULT_MINOR; | ||
2057 | else | ||
2058 | return VM_FAULT_SIGBUS; /* mapping truncation does this. */ | ||
2059 | } | ||
2050 | 2060 | ||
2051 | /* | 2061 | /* |
2052 | * We need the page table lock to synchronize with kswapd | 2062 | * We need the page table lock to synchronize with kswapd |