diff options
author | John David Anglin <dave.anglin@bell.net> | 2013-10-05 10:55:36 -0400 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2013-10-13 17:45:40 +0200 |
commit | 2d8b22de6e5241a6f27f7f290f027223156a7d3f (patch) | |
tree | 6d81d56b2cae2f2b50acd1210222d036fddd22ae /arch | |
parent | 59b33f148cc08fb33cbe823fca1e34f7f023765e (diff) | |
download | lwn-2d8b22de6e5241a6f27f7f290f027223156a7d3f.tar.gz lwn-2d8b22de6e5241a6f27f7f290f027223156a7d3f.zip |
parisc: optimize variable initialization in do_page_fault
The attached change defers the initialization of the variables tsk, mm
and flags until they are needed. As a result, the code won't crash if a
kernel probe is done with a corrupt context and the code will be better
optimized.
Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/parisc/mm/fault.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index 00c0ed333a3d..0293588d5b8c 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c @@ -171,20 +171,25 @@ void do_page_fault(struct pt_regs *regs, unsigned long code, unsigned long address) { struct vm_area_struct *vma, *prev_vma; - struct task_struct *tsk = current; - struct mm_struct *mm = tsk->mm; + struct task_struct *tsk; + struct mm_struct *mm; unsigned long acc_type; int fault; - unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; + unsigned int flags; - if (in_atomic() || !mm) + if (in_atomic()) goto no_context; + tsk = current; + mm = tsk->mm; + if (!mm) + goto no_context; + + flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; if (user_mode(regs)) flags |= FAULT_FLAG_USER; acc_type = parisc_acctyp(code, regs->iir); - if (acc_type & VM_WRITE) flags |= FAULT_FLAG_WRITE; retry: |