m32r/mm/fault.c: Port OOM changes to do_page_fault
PATCH 9/20 m32r/mm/fault.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 m32r.
Signed-off-by Kautuk Consul <[email protected]>
--- arch/m32r/mm/fault.c | 33 ++++++++++++++++++++++++++++----- 1 files changed, 28 insertions(+), 5 deletions(-)
arch/m32r/mm/fault.c +28 -5
@@ -82,6 +82,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,int write;int fault;siginfo_t info; +unsigned int flags =FAULT_FLAG_ALLOW_RETRY |FAULT_FLAG_KILLABLE ;/* * If BPSW IE bit enable --> set PSW IE bit
@@ -137,6 +138,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,if ((error_code &ACE_USERMODE ) ==0 && !search_exception_tables (regs->psw)) goto bad_area_nosemaphore; + +retry:down_read (&mm->mmap_sem); }
@@ -175,6 +178,7 @@ good_area:if (!(vma->vm_flags &VM_WRITE )) goto bad_area; write++; + flags |=FAULT_FLAG_WRITE ;break ;case ACE_PROTECTION :/* read, present */ case 0 :/* read, not present */
@@ -195,7 +199,11 @@ good_area:*/ addr = (address &PAGE_MASK );set_thread_fault_code (error_code); - fault =handle_mm_fault (mm, vma, addr, write ?FAULT_FLAG_WRITE :0 ); + fault =handle_mm_fault (mm, vma, addr, 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;
@@ -203,10 +211,25 @@ good_area: goto do_sigbus;BUG (); } -if (fault &VM_FAULT_MAJOR ) - tsk->maj_flt++; -else - tsk->min_flt++; + +if (flags &FAULT_FLAG_ALLOW_RETRY ) { +if (fault &VM_FAULT_MAJOR ) + tsk->maj_flt++; +else + tsk->min_flt++; +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; + } + } +set_thread_fault_code (0 );up_read (&mm->mmap_sem);return ;
Signature · 1 line
1.7.5.4