Skip to contentSkip to conversation

sparc/mm/fault_64.c: Port OOM changes to do_sparc64_fault

PATCH Superseded Kautuk Consul 2 participants 4 messages Mar 25, 2012 – Mar 26, 2012 SPARC + UltraSPARC (sparc/sparc64)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 20/20 sparc/mm/fault_64.c: Port OOM changes to do_sparc64_fault

Commit d065bd810b6deb67d4897a14bfe21f8eb526ba99 (mm: retry page fault when blocking on disk transfer) and commit 37b23e0525d393d48a7d59f870b3bc061a30ccdb (x86,mm: make pagefault killable)

The above commits introduced changes into the x86 pagefault handler for making the page fault handler retryable as well as killable.

These changes reduce the mmap_sem hold time, which is crucial during OOM killer invocation.

Port these changes to 64-bit sparc.

---
 arch/sparc/mm/fault_64.c |   37 ++++++++++++++++++++++++++++++-------
 1 files changed, 30 insertions(+), 7 deletions(-)
arch/sparc/mm/fault_64.c +30 -7
index 504c062..e6da8ca 100644
@@ -279,6 +279,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
 	unsigned int insn = 0;
 	int si_code, fault_code, fault;
 	unsigned long address, mm_rss;
+	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
 	fault_code = get_thread_fault_code();
 
@@ -333,6 +334,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
 			insn = get_fault_insn(regs, insn);
 			goto handle_kernel_fault;
 		}
+
+retry:
 		down_read(&mm->mmap_sem);
 	}
 
@@ -423,7 +426,12 @@ good_area:
 			goto bad_area;
 	}
 
-	fault = handle_mm_fault(mm, vma, address, (fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0);
+	fault = handle_mm_fault(mm, vma, address,
+	flags | ((fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0);
+
+	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
+		return;
+
 	if (unlikely(fault & VM_FAULT_ERROR)) {
 		if (fault & VM_FAULT_OOM)
 			goto out_of_memory;
@@ -431,12 +439,27 @@ good_area:
 			goto do_sigbus;
 		BUG();
 	}
-	if (fault & VM_FAULT_MAJOR) {
-		current->maj_flt++;
-		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, address);
-	} else {
-		current->min_flt++;
-		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
+
+	if (flags & FAULT_FLAG_ALLOW_RETRY) {
+		if (fault & VM_FAULT_MAJOR) {
+			current->maj_flt++;
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,
+					1, regs, address);
+		} else {
+			current->min_flt++;
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
+					1, regs, address);
+		}
+		if (fault & VM_FAULT_RETRY) {
+			flags &= ~FAULT_FLAG_ALLOW_RETRY;
+
+			/* No need to up_read(&mm->mmap_sem) as we would
+			 * have already released it in __lock_page_or_retry
+			 * in mm/filemap.c.
+			 */
+
+			goto retry;
+		}
 	}
 	up_read(&mm->mmap_sem);
 
Signature · 1 line
1.7.5.4
maintainer
#1 lore raw

From: Kautuk Consul <[email protected]>
Date: Sun, 25 Mar 2012 13:59:08 -0400

Review

Quoted 2 lines
(quoted diff) +2 -0
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,
+					1, regs, address);

Improperly indented still.

arch/sparc/mm/fault_64.c good_area: · line 451

Quoted 2 lines
arch/sparc/mm/fault_64.c +2 -0
+			perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
+					1, regs, address);

Likewise.

#2 lore raw
Quoted 6 lines · David Miller

From: Kautuk Consul <[email protected]>
Date: Sun, 25 Mar 2012 13:59:08 -0400

Quoted 2 lines

+                     perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ,
+                                     1, regs, address);

Quoted 6 lines

Improperly indented still.

Quoted 2 lines

+                     perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN,
+                                     1, regs, address);

Likewise.

I didn't understand what you were saying as I use gmaiil so I could not "see" what you meant exactly.
I have sent a v3 for this.

maintainer
#3 lore raw

From: Kautuk Consul <[email protected]>
Date: Mon, 26 Mar 2012 11:36:42 -0400

Quoted 2 lines

I didn't understand what you were saying as I use gmaiil so I could not "see" what you meant exactly.

This is not an excuse.

You need to be able to communicate with developers properly, and this means being able to properly formatted read pure ASCII text in their emails. Otherwise people who give you feedback are simply wasting their time.

We're on V3 of these two sparc patches, which is proof of how much you're wasting my time.