|
@@ -1183,12 +1183,13 @@ static void __kprobes optimized_callback(struct optimized_kprobe *op,
|
|
|
struct pt_regs *regs)
|
|
|
{
|
|
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
/* This is possible if op is under delayed unoptimizing */
|
|
|
if (kprobe_disabled(&op->kp))
|
|
|
return;
|
|
|
|
|
|
- preempt_disable();
|
|
|
+ local_irq_save(flags);
|
|
|
if (kprobe_running()) {
|
|
|
kprobes_inc_nmissed_count(&op->kp);
|
|
|
} else {
|
|
@@ -1207,7 +1208,7 @@ static void __kprobes optimized_callback(struct optimized_kprobe *op,
|
|
|
opt_pre_handler(&op->kp, regs);
|
|
|
__this_cpu_write(current_kprobe, NULL);
|
|
|
}
|
|
|
- preempt_enable_no_resched();
|
|
|
+ local_irq_restore(flags);
|
|
|
}
|
|
|
|
|
|
static int __kprobes copy_optimized_instructions(u8 *dest, u8 *src)
|