|
@@ -44,17 +44,19 @@ kmmio_fault(struct pt_regs *regs, unsigned long addr)
|
|
|
|
|
|
static nokprobe_inline int kprobes_fault(struct pt_regs *regs)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- /* kprobe_running() needs smp_processor_id() */
|
|
|
- if (kprobes_built_in() && !user_mode(regs)) {
|
|
|
- preempt_disable();
|
|
|
- if (kprobe_running() && kprobe_fault_handler(regs, 14))
|
|
|
- ret = 1;
|
|
|
- preempt_enable();
|
|
|
- }
|
|
|
-
|
|
|
- return ret;
|
|
|
+ if (!kprobes_built_in())
|
|
|
+ return 0;
|
|
|
+ if (user_mode(regs))
|
|
|
+ return 0;
|
|
|
+ /*
|
|
|
+ * To be potentially processing a kprobe fault and to be allowed to call
|
|
|
+ * kprobe_running(), we have to be non-preemptible.
|
|
|
+ */
|
|
|
+ if (preemptible())
|
|
|
+ return 0;
|
|
|
+ if (!kprobe_running())
|
|
|
+ return 0;
|
|
|
+ return kprobe_fault_handler(regs, X86_TRAP_PF);
|
|
|
}
|
|
|
|
|
|
/*
|