Skip to content

Commit

Permalink
x86/mm: Break out user address space handling
Browse files Browse the repository at this point in the history
The last patch broke out kernel address space handing into its own
helper.  Now, do the same for user address space handling.

Cc: [email protected]
Cc: Jann Horn <[email protected]>
Cc: Sean Christopherson <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Andy Lutomirski <[email protected]>
Signed-off-by: Dave Hansen <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
  • Loading branch information
hansendc authored and Peter Zijlstra committed Oct 9, 2018
1 parent 8fed620 commit aa37c51
Showing 1 changed file with 28 additions and 19 deletions.
47 changes: 28 additions & 19 deletions arch/x86/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,7 @@ bad_area_access_error(struct pt_regs *regs, unsigned long error_code,
__bad_area(regs, error_code, address, vma, SEGV_ACCERR);
}

/* Handle faults in the kernel portion of the address space */
static void
do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
u32 *pkey, unsigned int fault)
Expand Down Expand Up @@ -1254,14 +1255,11 @@ do_kern_addr_fault(struct pt_regs *regs, unsigned long hw_error_code,
}
NOKPROBE_SYMBOL(do_kern_addr_fault);

/*
* This routine handles page faults. It determines the address,
* and the problem, and then passes it off to one of the appropriate
* routines.
*/
static noinline void
__do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,
unsigned long address)
/* Handle faults in the user portion of the address space */
static inline
void do_user_addr_fault(struct pt_regs *regs,
unsigned long hw_error_code,
unsigned long address)
{
unsigned long sw_error_code;
struct vm_area_struct *vma;
Expand All @@ -1274,17 +1272,6 @@ __do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,
tsk = current;
mm = tsk->mm;

prefetchw(&mm->mmap_sem);

if (unlikely(kmmio_fault(regs, address)))
return;

/* Was the fault on kernel-controlled part of the address space? */
if (unlikely(fault_in_kernel_space(address))) {
do_kern_addr_fault(regs, hw_error_code, address);
return;
}

/* kprobes don't want to hook the spurious faults: */
if (unlikely(kprobes_fault(regs)))
return;
Expand Down Expand Up @@ -1488,6 +1475,28 @@ __do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,

check_v8086_mode(regs, address, tsk);
}
NOKPROBE_SYMBOL(do_user_addr_fault);

/*
* This routine handles page faults. It determines the address,
* and the problem, and then passes it off to one of the appropriate
* routines.
*/
static noinline void
__do_page_fault(struct pt_regs *regs, unsigned long hw_error_code,
unsigned long address)
{
prefetchw(&current->mm->mmap_sem);

if (unlikely(kmmio_fault(regs, address)))
return;

/* Was the fault on kernel-controlled part of the address space? */
if (unlikely(fault_in_kernel_space(address)))
do_kern_addr_fault(regs, hw_error_code, address);
else
do_user_addr_fault(regs, hw_error_code, address);
}
NOKPROBE_SYMBOL(__do_page_fault);

static nokprobe_inline void
Expand Down

0 comments on commit aa37c51

Please sign in to comment.