[PATCH] MIPS: Add FAULT_FLAG_ALLOW_RETRY in page fault handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


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@xxxxxxxxx>
---

--- 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);



[Linux MIPS Home]     [LKML Archive]     [Linux ARM]     [Linux]     [Git]     [Photo]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

Add to Google Powered by Linux