The flag, FAULT_FLAG_ALLOW_RETRY, was introduced by the patch,
mm: retry page fault when blocking on disk transfer
commit: d065bd810b6deb67d4897a14bfe21f8eb526ba99
for reducing mmap_sem hold times that are caused by waiting for disk
transfers when accessing file mapped VMAs. So add it now.
Signed-off-by: Hillf Danton <dhillf@gmail.com>
---
--- a/arch/mips/mm/fault.c Fri Nov 18 22:23:40 2011
+++ b/arch/mips/mm/fault.c Fri Nov 18 22:36:04 2011
@@ -42,6 +42,8 @@ asmlinkage void __kprobes do_page_fault(
const int field = sizeof(unsigned long) * 2;
siginfo_t info;
int fault;
+ unsigned int flags = FAULT_FLAG_ALLOW_RETRY |
+ (write ? FAULT_FLAG_WRITE : 0);
#if 0
printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(),
@@ -91,6 +93,7 @@ asmlinkage void __kprobes do_page_fault(
if (in_atomic() || !mm)
goto bad_area_nosemaphore;
+retry:
down_read(&mm->mmap_sem);
vma = find_vma(mm, address);
if (!vma)
@@ -144,7 +147,7 @@ good_area:
* make sure we exit gracefully rather than endlessly redo
* the fault.
*/
- fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
+ fault = handle_mm_fault(mm, vma, address, flags);
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
if (unlikely(fault & VM_FAULT_ERROR)) {
if (fault & VM_FAULT_OOM)
@@ -152,6 +155,12 @@ good_area:
else if (fault & VM_FAULT_SIGBUS)
goto do_sigbus;
BUG();
+ }
+ if (flags & FAULT_FLAG_ALLOW_RETRY) {
+ if (fault & VM_FAULT_RETRY) {
+ flags &= ~FAULT_FLAG_ALLOW_RETRY;
+ goto retry;
+ }
}
if (fault & VM_FAULT_MAJOR) {
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
|