Skip to contentSkip to conversation

kprobes/x86: Use preempt_enable() in optimized_callback()

PATCH In review Masami Hiramatsu 3 participants 3 messages Oct 20, 2018 – Oct 22, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 kprobes/x86: Use preempt_enable() in optimized_callback()

Since commit a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”) removes local_irq_save/restore() from optimized_callback(), the handler does not protected against reschedule interrupt. If it is able to be preempted (rescheduled) by such interrupt, we don't need to use _no_resched macro. Let's use preempt_enable() instead.

Fixes a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”)
---
 arch/x86/kernel/kprobes/opt.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/kprobes/opt.c +1 -1
index eaf02f2e7300..40b16b270656 100644
@@ -179,7 +179,7 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
 		opt_pre_handler(&op->kp, regs);
 		__this_cpu_write(current_kprobe, NULL);
 	}
-	preempt_enable_no_resched();
+	preempt_enable();
 }
 NOKPROBE_SYMBOL(optimized_callback);
 
Acked-by on v1 1/1
#1 lore raw
Quoted 5 lines · Masami Hiramatsu

Since commit a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”) removes local_irq_save/restore() from optimized_callback(), the handler does not protected against reschedule interrupt. If it is able to be preempted (rescheduled) by such interrupt, we don't need to use _no_resched macro.

must not.

Quoted 15 lines

Let's use preempt_enable() instead.

Fixes a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”)
---
 arch/x86/kernel/kprobes/opt.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/kprobes/opt.c +0 -0
index eaf02f2e7300..40b16b270656 100644

arch/x86/kernel/kprobes/opt.c optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs) · line 183

Quoted 6 lines
arch/x86/kernel/kprobes/opt.c +1 -1
@@ -179,7 +179,7 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
 		opt_pre_handler(&op->kp, regs);
 		__this_cpu_write(current_kprobe, NULL);
 	}
-	preempt_enable_no_resched();
+	preempt_enable();
 }

Indeed,

#2 lore raw
In reply to Masami Hiramatsu
kprobes/x86: Use preempt_enable() in optimized_callback()
Commit-ID:  2e62024c265aa69315ed02835623740030435380
Gitweb:     https://git.kernel.org/tip/2e62024c265aa69315ed02835623740030435380
Author:     Masami Hiramatsu <[email protected]>
AuthorDate: Sat, 20 Oct 2018 18:47:53 +0900
Committer:  Ingo Molnar <[email protected]>
CommitDate: Mon, 22 Oct 2018 03:31:01 +0200

kprobes/x86: Use preempt_enable() in optimized_callback()

The following commit:

a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”)

removed local_irq_save/restore() from optimized_callback(), the handler might be interrupted by the rescheduling interrupt and might be rescheduled - so we must not use the preempt_enable_no_resched() macro.

Use preempt_enable() instead, to not lose preemption events.

[ mingo: Improved the changelog. ]

Cc Alexei Starovoitov <[email protected]>
Cc Andy Lutomirski <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc Linus Torvalds <[email protected]>
Cc Oleg Nesterov <[email protected]>
Cc Thomas Gleixner <[email protected]>
Fixes a19b2e3d7839 ("kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes”)
---
 arch/x86/kernel/kprobes/opt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/kprobes/opt.c +1 -1
index eaf02f2e7300..40b16b270656 100644
@@ -179,7 +179,7 @@ optimized_callback(struct optimized_kprobe *op, struct pt_regs *regs)
 		opt_pre_handler(&op->kp, regs);
 		__this_cpu_write(current_kprobe, NULL);
 	}
-	preempt_enable_no_resched();
+	preempt_enable();
 }
 NOKPROBE_SYMBOL(optimized_callback);