x86: Reduce ifdef sections in fault.c
PATCH 1/1 x86: Reduce ifdef sections in fault.c
Signed-off-by Harvey Harrison <[email protected]>
--- arch/x86/mm/fault.c | 31 +++++++++---------------------- 1 files changed, 9 insertions(+), 22 deletions(-)
arch/x86/mm/fault.c +9 -22
@@ -508,6 +508,10 @@ static int vmalloc_fault(unsigned long address)pmd_t *pmd, *pmd_ref;pte_t *pte, *pte_ref; +/* Make sure we are in vmalloc area */ +if (!(address >=VMALLOC_START && address <VMALLOC_END )) +return -1 ; +/* Copy kernel mappings over when needed. This can also happen within a race in page table update. In the later case just flush. */
@@ -603,6 +607,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)*/ #ifdef CONFIG_X86_32 if (unlikely (address >=TASK_SIZE )) { +#else +if (unlikely (address >=TASK_SIZE64 )) { +#endif if (!(error_code & (PF_RSVD |PF_USER |PF_PROT )) &&vmalloc_fault (address) >=0 )return ;
@@ -618,6 +625,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) goto bad_area_nosemaphore; } + +#ifdef CONFIG_X86_32 /* It's safe to allow irq's after cr2 has been saved and the vmalloc fault has been handled. */ if (regs->flags & (X86_EFLAGS_IF |VM_MASK ))
@@ -630,28 +639,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)if (in_atomic () || !mm) goto bad_area_nosemaphore;#else /* CONFIG_X86_64 */ -if (unlikely (address >=TASK_SIZE64 )) { -/* -* Don't check for the module range here: its PML4 -* is always initialized because it's shared with the main -* kernel text. Only vmalloc may need PML4 syncups. -*/ -if (!(error_code & (PF_RSVD |PF_USER |PF_PROT )) && - ((address >=VMALLOC_START && address <VMALLOC_END ))) { -if (vmalloc_fault (address) >=0 ) -return ; - } - -/* Can handle a stale RO->RW TLB */ -if (spurious_fault (address, error_code)) -return ; - -/* -* Don't take the mm semaphore here. If we fixup a prefetch -* fault we could otherwise deadlock. -*/ - goto bad_area_nosemaphore; - }if (likely (regs->flags &X86_EFLAGS_IF ))local_irq_enable ();
Signature · 1 line
1.5.4.rc4.1142.gf5a97
Quoted 2 lines · Harvey Harrison
Signed-off-by Harvey Harrison <[email protected]>
x86.git has my patch which makes the pgd_list the same for 32-bit and 64-bit, which means the code which traverses that list can be common now.
J
Quoted 68 lines
--- arch/x86/mm/fault.c | 31 +++++++++---------------------- 1 files changed, 9 insertions(+), 22 deletions(-)arch/x86/mm/fault.c +9
-22@@ -508,6 +508,10 @@ static int vmalloc_fault(unsigned long address)pmd_t *pmd, *pmd_ref;pte_t *pte, *pte_ref; +/* Make sure we are in vmalloc area */ +if (!(address >=VMALLOC_START && address <VMALLOC_END )) +return -1 ; +/* Copy kernel mappings over when needed. This can also happen within a race in page table update. In the later case just flush. */ @@ -603,6 +607,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)*/ #ifdef CONFIG_X86_32 if (unlikely (address >=TASK_SIZE )) { +#else +if (unlikely (address >=TASK_SIZE64 )) { +#endif if (!(error_code & (PF_RSVD |PF_USER |PF_PROT )) &&vmalloc_fault (address) >=0 )return ;@@ -618,6 +625,8 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) goto bad_area_nosemaphore; } + +#ifdef CONFIG_X86_32 /* It's safe to allow irq's after cr2 has been saved and the vmalloc fault has been handled. */ if (regs->flags & (X86_EFLAGS_IF |VM_MASK ))@@ -630,28 +639,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)if (in_atomic () || !mm) goto bad_area_nosemaphore;#else /* CONFIG_X86_64 */ -if (unlikely (address >=TASK_SIZE64 )) { -/* -* Don't check for the module range here: its PML4 -* is always initialized because it's shared with the main -* kernel text. Only vmalloc may need PML4 syncups. -*/ -if (!(error_code & (PF_RSVD |PF_USER |PF_PROT )) && - ((address >=VMALLOC_START && address <VMALLOC_END ))) { -if (vmalloc_fault (address) >=0 ) -return ; - } - -/* Can handle a stale RO->RW TLB */ -if (spurious_fault (address, error_code)) -return ; - -/* -* Don't take the mm semaphore here. If we fixup a prefetch -* fault we could otherwise deadlock. -*/ - goto bad_area_nosemaphore; - }if (likely (regs->flags &X86_EFLAGS_IF ))local_irq_enable ();
Ingo Molnar
Appliedthanks, applied.
Ingo