sh/mm/fault_32.c: Port OOM changes to do_page_fault
PATCH v2 16/19 sh/mm/fault_32.c: Port OOM changes to do_page_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 the 32-bit SH platform.
--- arch/sh/mm/fault_32.c | 38 +++++++++++++++++++++++++++++--------- 1 files changed, 29 insertions(+), 9 deletions(-)
arch/sh/mm/fault_32.c +29 -9
@@ -129,6 +129,8 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,int si_code;int fault;siginfo_t info; +unsigned int flags = (FAULT_FLAG_ALLOW_RETRY |FAULT_FLAG_KILLABLE | + (writeaccess ?FAULT_FLAG_WRITE :0 )); tsk = current; mm = tsk->mm;
@@ -169,6 +171,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,if (in_atomic () || !mm) goto no_context; +retry:down_read (&mm->mmap_sem); vma =find_vma (mm, address);
@@ -200,7 +203,11 @@ good_area:* make sure we exit gracefully rather than endlessly redo * the fault. */ - fault =handle_mm_fault (mm, vma, address, writeaccess ?FAULT_FLAG_WRITE :0 ); + fault =handle_mm_fault (mm, vma, address, flags); + +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;
@@ -208,14 +215,27 @@ good_area: goto do_sigbus;BUG (); } -if (fault &VM_FAULT_MAJOR ) { - tsk->maj_flt++; -perf_sw_event (PERF_COUNT_SW_PAGE_FAULTS_MAJ ,1 , - regs, address); - }else { - tsk->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 ) { + tsk->maj_flt++; +perf_sw_event (PERF_COUNT_SW_PAGE_FAULTS_MAJ ,1 , + regs, address); + }else { + tsk->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
hi,
did anyone get a chance to review this ?
Paul Mundt
AppliedQuoted 8 lines · Kautuk Consul
Commit
d065bd810b6deb67d4897a14bfe21f8eb526ba99(mm: retry page fault when blocking on disk transfer) and commit37b23e0525d393d48a7d59f870b3bc061a30ccdb(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.
Quoted 6 lines
These changes reduce the
mmap_semhold time, which is crucial during OOM killer invocation.Port these changes to the 32-bit SH platform.
Signed-off-by Kautuk Consul <[email protected]>
Applied, thanks.
I've also made the change for sh64, and will send them out to Linus in the next round of updates.