x86: add unlikely() to fatal signal check
PATCH 1/1 x86: add unlikely() to fatal signal check
Ingo suggested SIGKILL check should be moved into slowpath function. It may reduce page fault fastpath impact. This patch do that.
Suggested-by Ingo Molnar <[email protected]>
Signed-off-by KOSAKI Motohiro <[email protected]>
--- arch/x86/mm/fault.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-)
arch/x86/mm/fault.c +20 -15
@@ -823,16 +823,30 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,force_sig_info_fault (SIGBUS , code, address, tsk, fault); } -static noinline void +static noinline intmm_fault_error (struct pt_regs *regs,unsigned long error_code,unsigned long address,unsigned int fault) { +/* +* Pagefault was interrupted by SIGKILL. We have no reason to +* continue pagefault. +*/ +if (fatal_signal_pending (current)) { +if (!(fault &VM_FAULT_RETRY )) +up_read (¤t->mm->mmap_sem); +if (!(error_code &PF_USER )) +no_context (regs, error_code, address); +return 1 ; + } +if (!(fault &VM_FAULT_ERROR )) +return 0 ; +if (fault &VM_FAULT_OOM ) {/* Kernel mode? Handle exceptions or die: */ if (!(error_code &PF_USER )) {up_read (¤t->mm->mmap_sem);no_context (regs, error_code, address); -return ; +return 1 ; }out_of_memory (regs, error_code, address);
@@ -843,6 +857,7 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,else BUG (); } +return 1 ; }static int spurious_fault_check (unsigned long error_code,pte_t *pte)
@@ -1133,19 +1148,9 @@ good_area:*/ fault =handle_mm_fault (mm, vma, address, flags); -if (unlikely (fault &VM_FAULT_ERROR )) { -mm_fault_error (regs, error_code, address, fault); -return ; - } - -/* -* Pagefault was interrupted by SIGKILL. We have no reason to -* continue pagefault. -*/ -if ((fault &VM_FAULT_RETRY ) &&fatal_signal_pending (current)) { -if (!(error_code &PF_USER )) -no_context (regs, error_code, address); -return ; +if (unlikely (fault & (VM_FAULT_RETRY |VM_FAULT_ERROR ))) { +if (mm_fault_error (regs, error_code, address, fault)) +return ; }/*
Signature · 1 line
1.7.3.1
[tip:x86/urgent] x86: Move do_page_fault()'s error path under unlikely()
Commit-ID: b80ef10e84d85a06bcd0b3a24a752ec32d0e0e40 Gitweb: http://git.kernel.org/tip/b80ef10e84d85a06bcd0b3a24a752ec32d0e0e40 Author: KOSAKI Motohiro <[email protected]> AuthorDate: Thu, 26 May 2011 17:12:12 +0900 Committer: Ingo Molnar <[email protected]> CommitDate: Thu, 26 May 2011 13:54:03 +0200
x86: Move do_page_fault()'s error path under unlikely()
Ingo suggested SIGKILL check should be moved into slowpath function. This will reduce the page fault fastpath impact of this recent commit:
37b23e0525d3: x86,mm: make pagefault killable
Suggested-by Ingo Molnar <[email protected]>
Signed-off-by KOSAKI Motohiro <[email protected]>
Cc Andrew Morton <[email protected]>
Cc Linus Torvalds <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- arch/x86/mm/fault.c | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-)
arch/x86/mm/fault.c +20 -15
@@ -823,16 +823,30 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,force_sig_info_fault (SIGBUS , code, address, tsk, fault); } -static noinline void +static noinline intmm_fault_error (struct pt_regs *regs,unsigned long error_code,unsigned long address,unsigned int fault) { +/* +* Pagefault was interrupted by SIGKILL. We have no reason to +* continue pagefault. +*/ +if (fatal_signal_pending (current)) { +if (!(fault &VM_FAULT_RETRY )) +up_read (¤t->mm->mmap_sem); +if (!(error_code &PF_USER )) +no_context (regs, error_code, address); +return 1 ; + } +if (!(fault &VM_FAULT_ERROR )) +return 0 ; +if (fault &VM_FAULT_OOM ) {/* Kernel mode? Handle exceptions or die: */ if (!(error_code &PF_USER )) {up_read (¤t->mm->mmap_sem);no_context (regs, error_code, address); -return ; +return 1 ; }out_of_memory (regs, error_code, address);
@@ -843,6 +857,7 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,else BUG (); } +return 1 ; }static int spurious_fault_check (unsigned long error_code,pte_t *pte)
@@ -1133,19 +1148,9 @@ good_area:*/ fault =handle_mm_fault (mm, vma, address, flags); -if (unlikely (fault &VM_FAULT_ERROR )) { -mm_fault_error (regs, error_code, address, fault); -return ; - } - -/* -* Pagefault was interrupted by SIGKILL. We have no reason to -* continue pagefault. -*/ -if ((fault &VM_FAULT_RETRY ) &&fatal_signal_pending (current)) { -if (!(error_code &PF_USER )) -no_context (regs, error_code, address); -return ; +if (unlikely (fault & (VM_FAULT_RETRY |VM_FAULT_ERROR ))) { +if (mm_fault_error (regs, error_code, address, fault)) +return ; }/*