LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86
@ 2018-05-16 23:56 Masami Hiramatsu
  2018-05-16 23:57 ` [PATCH -tip v3 1/7] Documentation/kprobes: Fix to remove remaining jprobe Masami Hiramatsu
                   ` (7 more replies)
  0 siblings, 8 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:56 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Hello,

Since we decided to remove jprobe from kernel last year,
its APIs are disabled and we worked on moving in-kernel
jprobe users to kprobes or trace-events. And now no jprobe
users are here anymore.

This is the 3rd version of the series for removing jprobe
from x86 and generic code. V2 is here;

 http://lkml.org/lkml/2018/3/12/558

Changes from v2 are;
 - [1/7] Imported from another series. Just a documentation
   fix.
 - [6/7] Imported from another series. Simplifying execution
   path modifying behavior.
 - [7/7] Modified based on [6/7], because it has done a half
   of changes what this patch does.

I am preparing other series which removes jprobe from
each arch. After all those patches are merged, I will remove
jprobes APIs and data structures, since changing those
definitions will break build on other archs.

Thank you,

---

Masami Hiramatsu (7):
      Documentation/kprobes: Fix to remove remaining jprobe
      kprobes: Remove jprobe API implementation
      x86: kprobes: Remove jprobe implementation
      kprobes: Ignore break_handler
      x86: kprobes: Ignore break_handler
      bpf: error-inject: x86: Fix unbalanced preempt-count for function override
      x86: kprobes: Do not disable preempt on int3 path


 Documentation/kprobes.txt        |   15 ++---
 arch/x86/include/asm/kprobes.h   |    3 -
 arch/x86/kernel/kprobes/common.h |   10 ---
 arch/x86/kernel/kprobes/core.c   |  116 ++------------------------------------
 arch/x86/kernel/kprobes/ftrace.c |   31 +++-------
 arch/x86/kernel/kprobes/opt.c    |    1 
 include/linux/kprobes.h          |    3 -
 kernel/fail_function.c           |    3 -
 kernel/kprobes.c                 |  115 ++------------------------------------
 kernel/test_kprobes.c            |   94 -------------------------------
 kernel/trace/trace_kprobe.c      |   11 +---
 11 files changed, 32 insertions(+), 370 deletions(-)

--
Masami Hiramatsu (Linaro)

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 1/7] Documentation/kprobes: Fix to remove remaining jprobe
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
@ 2018-05-16 23:57 ` Masami Hiramatsu
  2018-05-16 23:57 ` [PATCH -tip v3 2/7] kprobes: Remove jprobe API implementation Masami Hiramatsu
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:57 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Remove jps from the document, since jprobe is removed.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 Documentation/kprobes.txt |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt
index 22208bf2386d..5ae80baf3921 100644
--- a/Documentation/kprobes.txt
+++ b/Documentation/kprobes.txt
@@ -474,7 +474,7 @@ error occurs during registration, all probes in the array, up to
 the bad probe, are safely unregistered before the register_*probes
 function returns.
 
-- kps/rps/jps: an array of pointers to ``*probe`` data structures
+- kps/rps: an array of pointers to ``*probe`` data structures
 - num: the number of the array entries.
 
 .. note::

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 2/7] kprobes: Remove jprobe API implementation
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
  2018-05-16 23:57 ` [PATCH -tip v3 1/7] Documentation/kprobes: Fix to remove remaining jprobe Masami Hiramatsu
@ 2018-05-16 23:57 ` Masami Hiramatsu
  2018-05-16 23:58 ` [PATCH -tip v3 3/7] x86: kprobes: Remove jprobe implementation Masami Hiramatsu
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:57 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Remove jprobe API implementations and test cases for
those APIs which is no more used.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 Changes in v3:
  - Remove test cases.
---
 include/linux/kprobes.h |    3 --
 kernel/kprobes.c        |   78 +--------------------------------------
 kernel/test_kprobes.c   |   94 -----------------------------------------------
 3 files changed, 1 insertion(+), 174 deletions(-)

diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
index 9440a2fc8893..b520baa65682 100644
--- a/include/linux/kprobes.h
+++ b/include/linux/kprobes.h
@@ -389,9 +389,6 @@ int register_kprobe(struct kprobe *p);
 void unregister_kprobe(struct kprobe *p);
 int register_kprobes(struct kprobe **kps, int num);
 void unregister_kprobes(struct kprobe **kps, int num);
-int setjmp_pre_handler(struct kprobe *, struct pt_regs *);
-int longjmp_break_handler(struct kprobe *, struct pt_regs *);
-void jprobe_return(void);
 unsigned long arch_deref_entry_point(void *);
 
 int register_kretprobe(struct kretprobe *rp);
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index ea619021d901..69de130595f7 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -1272,7 +1272,7 @@ NOKPROBE_SYMBOL(cleanup_rp_inst);
 
 /*
 * Add the new probe to ap->list. Fail if this is the
-* second jprobe at the address - two jprobes can't coexist
+* second break_handler at the address
 */
 static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
 {
@@ -1812,77 +1812,6 @@ unsigned long __weak arch_deref_entry_point(void *entry)
 	return (unsigned long)entry;
 }
 
-#if 0
-int register_jprobes(struct jprobe **jps, int num)
-{
-	int ret = 0, i;
-
-	if (num <= 0)
-		return -EINVAL;
-
-	for (i = 0; i < num; i++) {
-		ret = register_jprobe(jps[i]);
-
-		if (ret < 0) {
-			if (i > 0)
-				unregister_jprobes(jps, i);
-			break;
-		}
-	}
-
-	return ret;
-}
-EXPORT_SYMBOL_GPL(register_jprobes);
-
-int register_jprobe(struct jprobe *jp)
-{
-	unsigned long addr, offset;
-	struct kprobe *kp = &jp->kp;
-
-	/*
-	 * Verify probepoint as well as the jprobe handler are
-	 * valid function entry points.
-	 */
-	addr = arch_deref_entry_point(jp->entry);
-
-	if (kallsyms_lookup_size_offset(addr, NULL, &offset) && offset == 0 &&
-	    kprobe_on_func_entry(kp->addr, kp->symbol_name, kp->offset)) {
-		kp->pre_handler = setjmp_pre_handler;
-		kp->break_handler = longjmp_break_handler;
-		return register_kprobe(kp);
-	}
-
-	return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(register_jprobe);
-
-void unregister_jprobe(struct jprobe *jp)
-{
-	unregister_jprobes(&jp, 1);
-}
-EXPORT_SYMBOL_GPL(unregister_jprobe);
-
-void unregister_jprobes(struct jprobe **jps, int num)
-{
-	int i;
-
-	if (num <= 0)
-		return;
-	mutex_lock(&kprobe_mutex);
-	for (i = 0; i < num; i++)
-		if (__unregister_kprobe_top(&jps[i]->kp) < 0)
-			jps[i]->kp.addr = NULL;
-	mutex_unlock(&kprobe_mutex);
-
-	synchronize_sched();
-	for (i = 0; i < num; i++) {
-		if (jps[i]->kp.addr)
-			__unregister_kprobe_bottom(&jps[i]->kp);
-	}
-}
-EXPORT_SYMBOL_GPL(unregister_jprobes);
-#endif
-
 #ifdef CONFIG_KRETPROBES
 /*
  * This kprobe pre_handler is registered with every kretprobe. When probe
@@ -2329,8 +2258,6 @@ static void report_probe(struct seq_file *pi, struct kprobe *p,
 
 	if (p->pre_handler == pre_handler_kretprobe)
 		kprobe_type = "r";
-	else if (p->pre_handler == setjmp_pre_handler)
-		kprobe_type = "j";
 	else
 		kprobe_type = "k";
 
@@ -2637,6 +2564,3 @@ late_initcall(debugfs_kprobe_init);
 #endif /* CONFIG_DEBUG_FS */
 
 module_init(init_kprobes);
-
-/* defined in arch/.../kernel/kprobes.c */
-EXPORT_SYMBOL_GPL(jprobe_return);
diff --git a/kernel/test_kprobes.c b/kernel/test_kprobes.c
index dd53e354f630..7bca480151b0 100644
--- a/kernel/test_kprobes.c
+++ b/kernel/test_kprobes.c
@@ -162,90 +162,6 @@ static int test_kprobes(void)
 
 }
 
-#if 0
-static u32 jph_val;
-
-static u32 j_kprobe_target(u32 value)
-{
-	if (preemptible()) {
-		handler_errors++;
-		pr_err("jprobe-handler is preemptible\n");
-	}
-	if (value != rand1) {
-		handler_errors++;
-		pr_err("incorrect value in jprobe handler\n");
-	}
-
-	jph_val = rand1;
-	jprobe_return();
-	return 0;
-}
-
-static struct jprobe jp = {
-	.entry		= j_kprobe_target,
-	.kp.symbol_name = "kprobe_target"
-};
-
-static int test_jprobe(void)
-{
-	int ret;
-
-	ret = register_jprobe(&jp);
-	if (ret < 0) {
-		pr_err("register_jprobe returned %d\n", ret);
-		return ret;
-	}
-
-	ret = target(rand1);
-	unregister_jprobe(&jp);
-	if (jph_val == 0) {
-		pr_err("jprobe handler not called\n");
-		handler_errors++;
-	}
-
-	return 0;
-}
-
-static struct jprobe jp2 = {
-	.entry          = j_kprobe_target,
-	.kp.symbol_name = "kprobe_target2"
-};
-
-static int test_jprobes(void)
-{
-	int ret;
-	struct jprobe *jps[2] = {&jp, &jp2};
-
-	/* addr and flags should be cleard for reusing kprobe. */
-	jp.kp.addr = NULL;
-	jp.kp.flags = 0;
-	ret = register_jprobes(jps, 2);
-	if (ret < 0) {
-		pr_err("register_jprobes returned %d\n", ret);
-		return ret;
-	}
-
-	jph_val = 0;
-	ret = target(rand1);
-	if (jph_val == 0) {
-		pr_err("jprobe handler not called\n");
-		handler_errors++;
-	}
-
-	jph_val = 0;
-	ret = target2(rand1);
-	if (jph_val == 0) {
-		pr_err("jprobe handler2 not called\n");
-		handler_errors++;
-	}
-	unregister_jprobes(jps, 2);
-
-	return 0;
-}
-#else
-#define test_jprobe() (0)
-#define test_jprobes() (0)
-#endif
 #ifdef CONFIG_KRETPROBES
 static u32 krph_val;
 
@@ -383,16 +299,6 @@ int init_test_probes(void)
 	if (ret < 0)
 		errors++;
 
-	num_tests++;
-	ret = test_jprobe();
-	if (ret < 0)
-		errors++;
-
-	num_tests++;
-	ret = test_jprobes();
-	if (ret < 0)
-		errors++;
-
 #ifdef CONFIG_KRETPROBES
 	num_tests++;
 	ret = test_kretprobe();

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 3/7] x86: kprobes: Remove jprobe implementation
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
  2018-05-16 23:57 ` [PATCH -tip v3 1/7] Documentation/kprobes: Fix to remove remaining jprobe Masami Hiramatsu
  2018-05-16 23:57 ` [PATCH -tip v3 2/7] kprobes: Remove jprobe API implementation Masami Hiramatsu
@ 2018-05-16 23:58 ` Masami Hiramatsu
  2018-05-16 23:58 ` [PATCH -tip v3 4/7] kprobes: Ignore break_handler Masami Hiramatsu
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:58 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Remove arch dependent setjump/longjump functions
and unused fields in kprobe_ctlblk for jprobes.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 arch/x86/include/asm/kprobes.h |    3 -
 arch/x86/kernel/kprobes/core.c |   87 ----------------------------------------
 2 files changed, 90 deletions(-)

diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
index 367d99cff426..06782c2efa04 100644
--- a/arch/x86/include/asm/kprobes.h
+++ b/arch/x86/include/asm/kprobes.h
@@ -111,9 +111,6 @@ struct kprobe_ctlblk {
 	unsigned long kprobe_status;
 	unsigned long kprobe_old_flags;
 	unsigned long kprobe_saved_flags;
-	unsigned long *jprobe_saved_sp;
-	struct pt_regs jprobe_saved_regs;
-	kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE];
 	struct prev_kprobe prev_kprobe;
 };
 
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 6f4d42377fe5..7d4b8e870635 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -1083,93 +1083,6 @@ int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val,
 }
 NOKPROBE_SYMBOL(kprobe_exceptions_notify);
 
-int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
-{
-	struct jprobe *jp = container_of(p, struct jprobe, kp);
-	unsigned long addr;
-	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
-
-	kcb->jprobe_saved_regs = *regs;
-	kcb->jprobe_saved_sp = stack_addr(regs);
-	addr = (unsigned long)(kcb->jprobe_saved_sp);
-
-	/*
-	 * As Linus pointed out, gcc assumes that the callee
-	 * owns the argument space and could overwrite it, e.g.
-	 * tailcall optimization. So, to be absolutely safe
-	 * we also save and restore enough stack bytes to cover
-	 * the argument area.
-	 * Use __memcpy() to avoid KASAN stack out-of-bounds reports as we copy
-	 * raw stack chunk with redzones:
-	 */
-	__memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr, MIN_STACK_SIZE(addr));
-	regs->ip = (unsigned long)(jp->entry);
-
-	/*
-	 * jprobes use jprobe_return() which skips the normal return
-	 * path of the function, and this messes up the accounting of the
-	 * function graph tracer to get messed up.
-	 *
-	 * Pause function graph tracing while performing the jprobe function.
-	 */
-	pause_graph_tracing();
-	return 1;
-}
-NOKPROBE_SYMBOL(setjmp_pre_handler);
-
-void jprobe_return(void)
-{
-	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
-
-	/* Unpoison stack redzones in the frames we are going to jump over. */
-	kasan_unpoison_stack_above_sp_to(kcb->jprobe_saved_sp);
-
-	asm volatile (
-#ifdef CONFIG_X86_64
-			"       xchg   %%rbx,%%rsp	\n"
-#else
-			"       xchgl   %%ebx,%%esp	\n"
-#endif
-			"       int3			\n"
-			"       .globl jprobe_return_end\n"
-			"       jprobe_return_end:	\n"
-			"       nop			\n"::"b"
-			(kcb->jprobe_saved_sp):"memory");
-}
-NOKPROBE_SYMBOL(jprobe_return);
-NOKPROBE_SYMBOL(jprobe_return_end);
-
-int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
-{
-	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
-	u8 *addr = (u8 *) (regs->ip - 1);
-	struct jprobe *jp = container_of(p, struct jprobe, kp);
-	void *saved_sp = kcb->jprobe_saved_sp;
-
-	if ((addr > (u8 *) jprobe_return) &&
-	    (addr < (u8 *) jprobe_return_end)) {
-		if (stack_addr(regs) != saved_sp) {
-			struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
-			printk(KERN_ERR
-			       "current sp %p does not match saved sp %p\n",
-			       stack_addr(regs), saved_sp);
-			printk(KERN_ERR "Saved registers for jprobe %p\n", jp);
-			show_regs(saved_regs);
-			printk(KERN_ERR "Current registers\n");
-			show_regs(regs);
-			BUG();
-		}
-		/* It's OK to start function graph tracing again */
-		unpause_graph_tracing();
-		*regs = kcb->jprobe_saved_regs;
-		__memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp));
-		preempt_enable_no_resched();
-		return 1;
-	}
-	return 0;
-}
-NOKPROBE_SYMBOL(longjmp_break_handler);
-
 bool arch_within_kprobe_blacklist(unsigned long addr)
 {
 	bool is_in_entry_trampoline_section = false;

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 4/7] kprobes: Ignore break_handler
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
                   ` (2 preceding siblings ...)
  2018-05-16 23:58 ` [PATCH -tip v3 3/7] x86: kprobes: Remove jprobe implementation Masami Hiramatsu
@ 2018-05-16 23:58 ` Masami Hiramatsu
  2018-05-18  6:16   ` Ingo Molnar
  2018-05-18  6:20   ` Ingo Molnar
  2018-05-16 23:59 ` [PATCH -tip v3 5/7] x86: " Masami Hiramatsu
                   ` (3 subsequent siblings)
  7 siblings, 2 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:58 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Ignore break_handler related code because it was only
used by jprobe and jprobe is removed.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 Documentation/kprobes.txt |    2 +-
 kernel/kprobes.c          |   39 +++++----------------------------------
 2 files changed, 6 insertions(+), 35 deletions(-)

diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt
index 5ae80baf3921..907a3017c0f2 100644
--- a/Documentation/kprobes.txt
+++ b/Documentation/kprobes.txt
@@ -262,7 +262,7 @@ is optimized, that modification is ignored.  Thus, if you want to
 tweak the kernel's execution path, you need to suppress optimization,
 using one of the following techniques:
 
-- Specify an empty function for the kprobe's post_handler or break_handler.
+- Specify an empty function for the kprobe's post_handler.
 
 or
 
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index 69de130595f7..536ab451e96d 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -627,8 +627,8 @@ static void optimize_kprobe(struct kprobe *p)
 	    (kprobe_disabled(p) || kprobes_all_disarmed))
 		return;
 
-	/* Both of break_handler and post_handler are not supported. */
-	if (p->break_handler || p->post_handler)
+	/* kprobes with post_handler can not be optimized */
+	if (p->post_handler)
 		return;
 
 	op = container_of(p, struct optimized_kprobe, kp);
@@ -1116,20 +1116,6 @@ static int aggr_fault_handler(struct kprobe *p, struct pt_regs *regs,
 }
 NOKPROBE_SYMBOL(aggr_fault_handler);
 
-static int aggr_break_handler(struct kprobe *p, struct pt_regs *regs)
-{
-	struct kprobe *cur = __this_cpu_read(kprobe_instance);
-	int ret = 0;
-
-	if (cur && cur->break_handler) {
-		if (cur->break_handler(cur, regs))
-			ret = 1;
-	}
-	reset_kprobe_instance();
-	return ret;
-}
-NOKPROBE_SYMBOL(aggr_break_handler);
-
 /* Walks the list and increments nmissed count for multiprobe case */
 void kprobes_inc_nmissed_count(struct kprobe *p)
 {
@@ -1270,24 +1256,15 @@ static void cleanup_rp_inst(struct kretprobe *rp)
 }
 NOKPROBE_SYMBOL(cleanup_rp_inst);
 
-/*
-* Add the new probe to ap->list. Fail if this is the
-* second break_handler at the address
-*/
+/* Add the new probe to ap->list */
 static int add_new_kprobe(struct kprobe *ap, struct kprobe *p)
 {
 	BUG_ON(kprobe_gone(ap) || kprobe_gone(p));
 
-	if (p->break_handler || p->post_handler)
+	if (p->post_handler)
 		unoptimize_kprobe(ap, true);	/* Fall back to normal kprobe */
 
-	if (p->break_handler) {
-		if (ap->break_handler)
-			return -EEXIST;
-		list_add_tail_rcu(&p->list, &ap->list);
-		ap->break_handler = aggr_break_handler;
-	} else
-		list_add_rcu(&p->list, &ap->list);
+	list_add_rcu(&p->list, &ap->list);
 	if (p->post_handler && !ap->post_handler)
 		ap->post_handler = aggr_post_handler;
 
@@ -1310,8 +1287,6 @@ static void init_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
 	/* We don't care the kprobe which has gone. */
 	if (p->post_handler && !kprobe_gone(p))
 		ap->post_handler = aggr_post_handler;
-	if (p->break_handler && !kprobe_gone(p))
-		ap->break_handler = aggr_break_handler;
 
 	INIT_LIST_HEAD(&ap->list);
 	INIT_HLIST_NODE(&ap->hlist);
@@ -1706,8 +1681,6 @@ static int __unregister_kprobe_top(struct kprobe *p)
 		goto disarmed;
 	else {
 		/* If disabling probe has special handlers, update aggrprobe */
-		if (p->break_handler && !kprobe_gone(p))
-			ap->break_handler = NULL;
 		if (p->post_handler && !kprobe_gone(p)) {
 			list_for_each_entry_rcu(list_p, &ap->list, list) {
 				if ((list_p != p) && (list_p->post_handler))
@@ -1911,7 +1884,6 @@ int register_kretprobe(struct kretprobe *rp)
 	rp->kp.pre_handler = pre_handler_kretprobe;
 	rp->kp.post_handler = NULL;
 	rp->kp.fault_handler = NULL;
-	rp->kp.break_handler = NULL;
 
 	/* Pre-allocate memory for max kretprobe instances */
 	if (rp->maxactive <= 0) {
@@ -2034,7 +2006,6 @@ static void kill_kprobe(struct kprobe *p)
 		list_for_each_entry_rcu(kp, &p->list, list)
 			kp->flags |= KPROBE_FLAG_GONE;
 		p->post_handler = NULL;
-		p->break_handler = NULL;
 		kill_optimized_kprobe(p);
 	}
 	/*

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 5/7] x86: kprobes: Ignore break_handler
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
                   ` (3 preceding siblings ...)
  2018-05-16 23:58 ` [PATCH -tip v3 4/7] kprobes: Ignore break_handler Masami Hiramatsu
@ 2018-05-16 23:59 ` Masami Hiramatsu
  2018-05-18  6:26   ` Ingo Molnar
  2018-05-16 23:59 ` [PATCH -tip v3 6/7] bpf: error-inject: x86: Fix unbalanced preempt-count for function override Masami Hiramatsu
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:59 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Remove break_handler related code since that was used
only for jprobe and jprobe is removed now.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 arch/x86/kernel/kprobes/common.h |   10 ----------
 arch/x86/kernel/kprobes/core.c   |   13 ++-----------
 arch/x86/kernel/kprobes/ftrace.c |   16 ++--------------
 3 files changed, 4 insertions(+), 35 deletions(-)

diff --git a/arch/x86/kernel/kprobes/common.h b/arch/x86/kernel/kprobes/common.h
index ae38dccf0c8f..2b949f4fd4d8 100644
--- a/arch/x86/kernel/kprobes/common.h
+++ b/arch/x86/kernel/kprobes/common.h
@@ -105,14 +105,4 @@ static inline unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsig
 }
 #endif
 
-#ifdef CONFIG_KPROBES_ON_FTRACE
-extern int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
-			   struct kprobe_ctlblk *kcb);
-#else
-static inline int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
-				  struct kprobe_ctlblk *kcb)
-{
-	return 0;
-}
-#endif
 #endif
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 7d4b8e870635..4badf22bb11f 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -690,10 +690,8 @@ int kprobe_int3_handler(struct pt_regs *regs)
 			/*
 			 * If we have no pre-handler or it returned 0, we
 			 * continue with normal processing.  If we have a
-			 * pre-handler and it returned non-zero, it prepped
-			 * for calling the break_handler below on re-entry
-			 * for jprobe processing, so get out doing nothing
-			 * more here.
+			 * pre-handler and it returned non-zero, it modified
+			 * regs->ip so no singlestep is needed.
 			 */
 			if (!p->pre_handler || !p->pre_handler(p, regs))
 				setup_singlestep(p, regs, kcb, 0);
@@ -712,13 +710,6 @@ int kprobe_int3_handler(struct pt_regs *regs)
 		regs->ip = (unsigned long)addr;
 		preempt_enable_no_resched();
 		return 1;
-	} else if (kprobe_running()) {
-		p = __this_cpu_read(current_kprobe);
-		if (p->break_handler && p->break_handler(p, regs)) {
-			if (!skip_singlestep(p, regs, kcb))
-				setup_singlestep(p, regs, kcb, 0);
-			return 1;
-		}
 	} /* else: not a kprobe fault; let the kernel handle it */
 
 	preempt_enable_no_resched();
diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c
index 8dc0161cec8f..c8696f2a583f 100644
--- a/arch/x86/kernel/kprobes/ftrace.c
+++ b/arch/x86/kernel/kprobes/ftrace.c
@@ -26,7 +26,7 @@
 #include "common.h"
 
 static nokprobe_inline
-void __skip_singlestep(struct kprobe *p, struct pt_regs *regs,
+void skip_singlestep(struct kprobe *p, struct pt_regs *regs,
 		      struct kprobe_ctlblk *kcb, unsigned long orig_ip)
 {
 	/*
@@ -43,18 +43,6 @@ void __skip_singlestep(struct kprobe *p, struct pt_regs *regs,
 		regs->ip = orig_ip;
 }
 
-int skip_singlestep(struct kprobe *p, struct pt_regs *regs,
-		    struct kprobe_ctlblk *kcb)
-{
-	if (kprobe_ftrace(p)) {
-		__skip_singlestep(p, regs, kcb, 0);
-		preempt_enable_no_resched();
-		return 1;
-	}
-	return 0;
-}
-NOKPROBE_SYMBOL(skip_singlestep);
-
 /* Ftrace callback handler for kprobes -- called under preepmt disabed */
 void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 			   struct ftrace_ops *ops, struct pt_regs *regs)
@@ -80,7 +68,7 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 		__this_cpu_write(current_kprobe, p);
 		kcb->kprobe_status = KPROBE_HIT_ACTIVE;
 		if (!p->pre_handler || !p->pre_handler(p, regs)) {
-			__skip_singlestep(p, regs, kcb, orig_ip);
+			skip_singlestep(p, regs, kcb, orig_ip);
 			preempt_enable_no_resched();
 		}
 		/*

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 6/7] bpf: error-inject: x86: Fix unbalanced preempt-count for function override
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
                   ` (4 preceding siblings ...)
  2018-05-16 23:59 ` [PATCH -tip v3 5/7] x86: " Masami Hiramatsu
@ 2018-05-16 23:59 ` Masami Hiramatsu
  2018-05-17  0:00 ` [PATCH -tip v3 7/7] x86: kprobes: Do not disable preempt on int3 path Masami Hiramatsu
  2018-05-18  6:23 ` [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Ingo Molnar
  7 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-16 23:59 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Fix unbalanced preempt-count for function override
using kprobes on x86.

Jprobe requires to keep preemption disabled and keep
current kprobes until it recovers to original function
entry. For this reason kprobe_int3_handler() makes
preempt-count unbalanced when user handler returns !0.

After removing the jprobe, Kprobes does not need to
keep preempt disabled even if user handler returns !0.

But since the function override handler is also returns
!0 if it overrides a function, to balancing the preempt
count, it enables preemption and reset current kprobe
by itself.

That is a bad design that is very buggy. This fixes
the unbalanced preempt-count in both kprobes and
function override on x86.
Of course we have to fix same code of kprobes on other
archs to keep the kprobes behavior consistent. But this
is bisect-safe because the function override
(CONFIG_FUNCTION_ERROR_INJECTION) implemented only
on x86 at this moment.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
 arch/x86/kernel/kprobes/core.c   |    4 ++++
 arch/x86/kernel/kprobes/ftrace.c |   15 ++++++++-------
 kernel/fail_function.c           |    3 ---
 kernel/trace/trace_kprobe.c      |   11 +++--------
 4 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 4badf22bb11f..215a28bdd9df 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -695,6 +695,10 @@ int kprobe_int3_handler(struct pt_regs *regs)
 			 */
 			if (!p->pre_handler || !p->pre_handler(p, regs))
 				setup_singlestep(p, regs, kcb, 0);
+			else {
+				reset_current_kprobe();
+				preempt_enable_no_resched();
+			}
 			return 1;
 		}
 	} else if (*addr != BREAKPOINT_INSTRUCTION) {
diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c
index c8696f2a583f..310ef737b9d4 100644
--- a/arch/x86/kernel/kprobes/ftrace.c
+++ b/arch/x86/kernel/kprobes/ftrace.c
@@ -63,18 +63,19 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip,
 		/* Kprobe handler expects regs->ip = ip + 1 as breakpoint hit */
 		regs->ip = ip + sizeof(kprobe_opcode_t);
 
-		/* To emulate trap based kprobes, preempt_disable here */
-		preempt_disable();
 		__this_cpu_write(current_kprobe, p);
 		kcb->kprobe_status = KPROBE_HIT_ACTIVE;
 		if (!p->pre_handler || !p->pre_handler(p, regs)) {
 			skip_singlestep(p, regs, kcb, orig_ip);
-			preempt_enable_no_resched();
+		} else {
+			/*
+			 * If pre_handler returns !0, this handler
+			 * modifies regs->ip and goes back to there
+			 * directly without single stepping.
+			 * So let's just clear current kprobe.
+			 */
+			__this_cpu_write(current_kprobe, NULL);
 		}
-		/*
-		 * If pre_handler returns !0, it sets regs->ip and
-		 * resets current kprobe, and keep preempt count +1.
-		 */
 	}
 }
 NOKPROBE_SYMBOL(kprobe_ftrace_handler);
diff --git a/kernel/fail_function.c b/kernel/fail_function.c
index 1d5632d8bbcc..b090688df94f 100644
--- a/kernel/fail_function.c
+++ b/kernel/fail_function.c
@@ -184,9 +184,6 @@ static int fei_kprobe_handler(struct kprobe *kp, struct pt_regs *regs)
 	if (should_fail(&fei_fault_attr, 1)) {
 		regs_set_return_value(regs, attr->retval);
 		override_function_with_return(regs);
-		/* Kprobe specific fixup */
-		reset_current_kprobe();
-		preempt_enable_no_resched();
 		return 1;
 	}
 
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 02aed76e0978..b65cd6834450 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -1217,16 +1217,11 @@ kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs)
 
 		/*
 		 * We need to check and see if we modified the pc of the
-		 * pt_regs, and if so clear the kprobe and return 1 so that we
-		 * don't do the single stepping.
-		 * The ftrace kprobe handler leaves it up to us to re-enable
-		 * preemption here before returning if we've modified the ip.
+		 * pt_regs, and if so return 1 so that we don't do the
+		 * single stepping.
 		 */
-		if (orig_ip != instruction_pointer(regs)) {
-			reset_current_kprobe();
-			preempt_enable_no_resched();
+		if (orig_ip != instruction_pointer(regs))
 			return 1;
-		}
 		if (!ret)
 			return 0;
 	}

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH -tip v3 7/7] x86: kprobes: Do not disable preempt on int3 path
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
                   ` (5 preceding siblings ...)
  2018-05-16 23:59 ` [PATCH -tip v3 6/7] bpf: error-inject: x86: Fix unbalanced preempt-count for function override Masami Hiramatsu
@ 2018-05-17  0:00 ` Masami Hiramatsu
  2018-05-18  6:23 ` [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Ingo Molnar
  7 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-17  0:00 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar
  Cc: x86, Masami Hiramatsu, Ingo Molnar, H . Peter Anvin,
	linux-kernel, Ananth N Mavinakayanahalli, Andrew Morton,
	Steven Rostedt, Laura Abbott, Josef Bacik, Alexei Starovoitov,
	Ravi Bangoria

Since int3 and debug exception(for singlestep) are run with
IRQ disabled and while running single stepping we drop IF
from regs->flags, that path must not be preemptible. So we
can remove the preempt disable/enable calls from that path.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Suggested-by: Ingo Molnar <mingo@kernel.org>
---
 Changes in v3:
  - Split user-side changes to another patch
 Changes in v2:
  - Include user-side changes.
---
 Documentation/kprobes.txt      |   11 +++++------
 arch/x86/kernel/kprobes/core.c |   18 ++++--------------
 arch/x86/kernel/kprobes/opt.c  |    1 -
 3 files changed, 9 insertions(+), 21 deletions(-)

diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt
index 907a3017c0f2..3e9e99ea751b 100644
--- a/Documentation/kprobes.txt
+++ b/Documentation/kprobes.txt
@@ -566,12 +566,11 @@ the same handler) may run concurrently on different CPUs.
 Kprobes does not use mutexes or allocate memory except during
 registration and unregistration.
 
-Probe handlers are run with preemption disabled.  Depending on the
-architecture and optimization state, handlers may also run with
-interrupts disabled (e.g., kretprobe handlers and optimized kprobe
-handlers run without interrupt disabled on x86/x86-64).  In any case,
-your handler should not yield the CPU (e.g., by attempting to acquire
-a semaphore).
+Probe handlers are run with preemption disabled or interrupt disabled,
+which depends on the architecture and optimization state.  (e.g.,
+kretprobe handlers and optimized kprobe handlers run without interrupt
+disabled on x86/x86-64).  In any case, your handler should not yield
+the CPU (e.g., by attempting to acquire a semaphore, or waiting I/O).
 
 Since a return probe is implemented by replacing the return
 address with the trampoline's address, stack backtraces and calls
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 215a28bdd9df..a2896ff47ebc 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -596,7 +596,6 @@ static void setup_singlestep(struct kprobe *p, struct pt_regs *regs,
 		 * stepping.
 		 */
 		regs->ip = (unsigned long)p->ainsn.insn;
-		preempt_enable_no_resched();
 		return;
 	}
 #endif
@@ -669,12 +668,10 @@ int kprobe_int3_handler(struct pt_regs *regs)
 
 	addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t));
 	/*
-	 * We don't want to be preempted for the entire
-	 * duration of kprobe processing. We conditionally
-	 * re-enable preemption at the end of this function,
-	 * and also in reenter_kprobe() and setup_singlestep().
+	 * We don't want to be preempted for the entire duration of kprobe
+	 * processing. Since int3 and debug trap disables irqs and we clear
+	 * IF while singlestepping, it must be no preemptible.
 	 */
-	preempt_disable();
 
 	kcb = get_kprobe_ctlblk();
 	p = get_kprobe(addr);
@@ -695,10 +692,8 @@ int kprobe_int3_handler(struct pt_regs *regs)
 			 */
 			if (!p->pre_handler || !p->pre_handler(p, regs))
 				setup_singlestep(p, regs, kcb, 0);
-			else {
+			else
 				reset_current_kprobe();
-				preempt_enable_no_resched();
-			}
 			return 1;
 		}
 	} else if (*addr != BREAKPOINT_INSTRUCTION) {
@@ -712,11 +707,9 @@ int kprobe_int3_handler(struct pt_regs *regs)
 		 * the original instruction.
 		 */
 		regs->ip = (unsigned long)addr;
-		preempt_enable_no_resched();
 		return 1;
 	} /* else: not a kprobe fault; let the kernel handle it */
 
-	preempt_enable_no_resched();
 	return 0;
 }
 NOKPROBE_SYMBOL(kprobe_int3_handler);
@@ -967,8 +960,6 @@ int kprobe_debug_handler(struct pt_regs *regs)
 	}
 	reset_current_kprobe();
 out:
-	preempt_enable_no_resched();
-
 	/*
 	 * if somebody else is singlestepping across a probe point, flags
 	 * will have TF set, in which case, continue the remaining processing
@@ -1015,7 +1006,6 @@ int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
 			restore_previous_kprobe(kcb);
 		else
 			reset_current_kprobe();
-		preempt_enable_no_resched();
 	} else if (kcb->kprobe_status == KPROBE_HIT_ACTIVE ||
 		   kcb->kprobe_status == KPROBE_HIT_SSDONE) {
 		/*
diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
index 203d398802a3..eaf02f2e7300 100644
--- a/arch/x86/kernel/kprobes/opt.c
+++ b/arch/x86/kernel/kprobes/opt.c
@@ -491,7 +491,6 @@ int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter)
 		regs->ip = (unsigned long)op->optinsn.insn + TMPL_END_IDX;
 		if (!reenter)
 			reset_current_kprobe();
-		preempt_enable_no_resched();
 		return 1;
 	}
 	return 0;

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 4/7] kprobes: Ignore break_handler
  2018-05-16 23:58 ` [PATCH -tip v3 4/7] kprobes: Ignore break_handler Masami Hiramatsu
@ 2018-05-18  6:16   ` Ingo Molnar
  2018-05-18 13:38     ` Masami Hiramatsu
  2018-05-18  6:20   ` Ingo Molnar
  1 sibling, 1 reply; 16+ messages in thread
From: Ingo Molnar @ 2018-05-18  6:16 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria


* Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Ignore break_handler related code because it was only
> used by jprobe and jprobe is removed.
> 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
>  Documentation/kprobes.txt |    2 +-
>  kernel/kprobes.c          |   39 +++++----------------------------------
>  2 files changed, 6 insertions(+), 35 deletions(-)

Even after all these changes there's quite a bit of ->break_handler() use:

triton:~/tip> git grep -w break_handler
arch/arc/kernel/kprobes.c:              if (p->break_handler && p->break_handler(p, regs)) {
arch/arm/probes/kprobes/core.c:                  * for calling the break_handler below on re-entry,
arch/arm/probes/kprobes/core.c:         if (cur->break_handler && cur->break_handler(cur, regs)) {
arch/arm64/kernel/probes/kprobes.c:                      * for calling the break_handler below on re-entry,
arch/arm64/kernel/probes/kprobes.c:             if (cur_kprobe->break_handler  &&
arch/arm64/kernel/probes/kprobes.c:                  cur_kprobe->break_handler(cur_kprobe, regs)) {
arch/ia64/kernel/kprobes.c:                     if (p->break_handler && p->break_handler(p, regs)) {
arch/mips/kernel/kprobes.c:                     if (p->break_handler && p->break_handler(p, regs))
arch/powerpc/kernel/kprobes.c:                  if (p->break_handler && p->break_handler(p, regs)) {
arch/s390/kernel/kprobes.c:                      * for calling the break_handler below on re-entry
arch/s390/kernel/kprobes.c:             if (p->break_handler && p->break_handler(p, regs)) {
arch/s390/kernel/kprobes.c:                      * break_handler "returns" to the original
arch/sh/kernel/kprobes.c:                       if (p->break_handler && p->break_handler(p, regs)) {
arch/sh/kernel/kprobes.c:                                       if (p->break_handler &&
arch/sh/kernel/kprobes.c:                                           p->break_handler(p, args->regs))
arch/sparc/kernel/kprobes.c:                    if (p->break_handler && p->break_handler(p, regs))
arch/x86/include/asm/kprobes.h:  * a post_handler or break_handler).
include/linux/kprobes.h:        kprobe_break_handler_t break_handler;

Nothing appears to be actually _setting_ the break_handler, so all of this is 
stale code as well which should be removed?

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 4/7] kprobes: Ignore break_handler
  2018-05-16 23:58 ` [PATCH -tip v3 4/7] kprobes: Ignore break_handler Masami Hiramatsu
  2018-05-18  6:16   ` Ingo Molnar
@ 2018-05-18  6:20   ` Ingo Molnar
  2018-05-18 14:14     ` Masami Hiramatsu
  1 sibling, 1 reply; 16+ messages in thread
From: Ingo Molnar @ 2018-05-18  6:20 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria


* Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Ignore break_handler related code because it was only
> used by jprobe and jprobe is removed.

I changed this description to:

 ============
 Subject: kprobes: Don't call the ->break_handler() in generic kprobes code

 Don't call the ->break_handler() from the core kprobes code, because it was only 
 used by jprobes which got removed.

 ( In a followup patch we'll remove the remaining calls in low level 
   arch handlers as well and remove the callback altogether. )
 ============

Please try to be a lot less vague in changelogs when it's possible and relevant!

I.e. saying "Ignore break_handler related code" is annoyingly vague, it doesn't 
explain things well at all. Saying "Don't call the ->break_handler()" is just as 
compact, yet it also makes it very clear what's done in the patch...

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86
  2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
                   ` (6 preceding siblings ...)
  2018-05-17  0:00 ` [PATCH -tip v3 7/7] x86: kprobes: Do not disable preempt on int3 path Masami Hiramatsu
@ 2018-05-18  6:23 ` Ingo Molnar
  2018-05-18 14:10   ` Masami Hiramatsu
  7 siblings, 1 reply; 16+ messages in thread
From: Ingo Molnar @ 2018-05-18  6:23 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria


* Masami Hiramatsu <mhiramat@kernel.org> wrote:

>       x86: kprobes: Remove jprobe implementation
>       x86: kprobes: Ignore break_handler
>       x86: kprobes: Do not disable preempt on int3 path

So this is another annoyance. Do you ever compare the changelogs and titles you 
write with the ones I actually commit? They are almost never the same, for example 
the titles to x86 level kprobes code are always trying to use this kind of prefix:

b664d57f39d0: kprobes/x86: Remove IRQ disabling from jprobe handlers
ee213fc72fd6: kprobes/x86: Set up frame pointer in kprobe trampoline
a19b2e3d7839: kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes
5bb4fc2d8641: kprobes/x86: Disable preemption in ftrace-based jprobes
9a09f261a4fa: kprobes/x86: Disable preemption in optprobe
cd52edad55fb: kprobes/x86: Move the get_kprobe_ctlblk() into irq-disabled block
a8976fc84b64: kprobes/x86: Remove addressof() operators

Not "x86: kprobes:" which is the wrong order anyway...

Could you please be more careful about all this in the future?

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 5/7] x86: kprobes: Ignore break_handler
  2018-05-16 23:59 ` [PATCH -tip v3 5/7] x86: " Masami Hiramatsu
@ 2018-05-18  6:26   ` Ingo Molnar
  2018-05-18 13:42     ` Masami Hiramatsu
  0 siblings, 1 reply; 16+ messages in thread
From: Ingo Molnar @ 2018-05-18  6:26 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria


* Masami Hiramatsu <mhiramat@kernel.org> wrote:

> Remove break_handler related code since that was used
> only for jprobe and jprobe is removed now.
> 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
>  arch/x86/kernel/kprobes/common.h |   10 ----------
>  arch/x86/kernel/kprobes/core.c   |   13 ++-----------
>  arch/x86/kernel/kprobes/ftrace.c |   16 ++--------------
>  3 files changed, 4 insertions(+), 35 deletions(-)

Even after this change there's a stale reference to ->break_handler():

  arch/x86/include/asm/kprobes.h:  * a post_handler or break_handler).

Please use 'git grep'!

Also, there's no reason to send an incomplete series: please remove _all_ 
->break_handler() references so that it's 100% gone! The pain of having and not 
having ->break_handler() is completely unnecessary.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 4/7] kprobes: Ignore break_handler
  2018-05-18  6:16   ` Ingo Molnar
@ 2018-05-18 13:38     ` Masami Hiramatsu
  0 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-18 13:38 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria

On Fri, 18 May 2018 08:16:36 +0200
Ingo Molnar <mingo@kernel.org> wrote:

> 
> * Masami Hiramatsu <mhiramat@kernel.org> wrote:
> 
> > Ignore break_handler related code because it was only
> > used by jprobe and jprobe is removed.
> > 
> > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > ---
> >  Documentation/kprobes.txt |    2 +-
> >  kernel/kprobes.c          |   39 +++++----------------------------------
> >  2 files changed, 6 insertions(+), 35 deletions(-)
> 
> Even after all these changes there's quite a bit of ->break_handler() use:
> 
> triton:~/tip> git grep -w break_handler
> arch/arc/kernel/kprobes.c:              if (p->break_handler && p->break_handler(p, regs)) {
> arch/arm/probes/kprobes/core.c:                  * for calling the break_handler below on re-entry,
> arch/arm/probes/kprobes/core.c:         if (cur->break_handler && cur->break_handler(cur, regs)) {
> arch/arm64/kernel/probes/kprobes.c:                      * for calling the break_handler below on re-entry,
> arch/arm64/kernel/probes/kprobes.c:             if (cur_kprobe->break_handler  &&
> arch/arm64/kernel/probes/kprobes.c:                  cur_kprobe->break_handler(cur_kprobe, regs)) {
> arch/ia64/kernel/kprobes.c:                     if (p->break_handler && p->break_handler(p, regs)) {
> arch/mips/kernel/kprobes.c:                     if (p->break_handler && p->break_handler(p, regs))
> arch/powerpc/kernel/kprobes.c:                  if (p->break_handler && p->break_handler(p, regs)) {
> arch/s390/kernel/kprobes.c:                      * for calling the break_handler below on re-entry
> arch/s390/kernel/kprobes.c:             if (p->break_handler && p->break_handler(p, regs)) {
> arch/s390/kernel/kprobes.c:                      * break_handler "returns" to the original
> arch/sh/kernel/kprobes.c:                       if (p->break_handler && p->break_handler(p, regs)) {
> arch/sh/kernel/kprobes.c:                                       if (p->break_handler &&
> arch/sh/kernel/kprobes.c:                                           p->break_handler(p, args->regs))
> arch/sparc/kernel/kprobes.c:                    if (p->break_handler && p->break_handler(p, regs))
> arch/x86/include/asm/kprobes.h:  * a post_handler or break_handler).
> include/linux/kprobes.h:        kprobe_break_handler_t break_handler;
> 
> Nothing appears to be actually _setting_ the break_handler, so all of this is 
> stale code as well which should be removed?

Yes, break_handler() is only for jprobe, not for user-defined handler.
I already have a series of those patches, but I think I need to send it
to each arch maintainer.

Thank you,

> 
> Thanks,
> 
> 	Ingo


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 5/7] x86: kprobes: Ignore break_handler
  2018-05-18  6:26   ` Ingo Molnar
@ 2018-05-18 13:42     ` Masami Hiramatsu
  0 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-18 13:42 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria

On Fri, 18 May 2018 08:26:38 +0200
Ingo Molnar <mingo@kernel.org> wrote:

> 
> * Masami Hiramatsu <mhiramat@kernel.org> wrote:
> 
> > Remove break_handler related code since that was used
> > only for jprobe and jprobe is removed now.
> > 
> > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > ---
> >  arch/x86/kernel/kprobes/common.h |   10 ----------
> >  arch/x86/kernel/kprobes/core.c   |   13 ++-----------
> >  arch/x86/kernel/kprobes/ftrace.c |   16 ++--------------
> >  3 files changed, 4 insertions(+), 35 deletions(-)
> 
> Even after this change there's a stale reference to ->break_handler():
> 
>   arch/x86/include/asm/kprobes.h:  * a post_handler or break_handler).
> 
> Please use 'git grep'!

Oops, I missed it. Thank you, I'll use git-grep next time.

> 
> Also, there's no reason to send an incomplete series: please remove _all_ 
> ->break_handler() references so that it's 100% gone! The pain of having and not 
> having ->break_handler() is completely unnecessary.

Would you mean a single patch for all arch?
I'm currently has arch-separated patches for removing it. Should I fold those?

Thank you,

-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86
  2018-05-18  6:23 ` [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Ingo Molnar
@ 2018-05-18 14:10   ` Masami Hiramatsu
  0 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-18 14:10 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria

On Fri, 18 May 2018 08:23:43 +0200
Ingo Molnar <mingo@kernel.org> wrote:

> 
> * Masami Hiramatsu <mhiramat@kernel.org> wrote:
> 
> >       x86: kprobes: Remove jprobe implementation
> >       x86: kprobes: Ignore break_handler
> >       x86: kprobes: Do not disable preempt on int3 path
> 
> So this is another annoyance. Do you ever compare the changelogs and titles you 
> write with the ones I actually commit? They are almost never the same, for example 
> the titles to x86 level kprobes code are always trying to use this kind of prefix:
> 
> b664d57f39d0: kprobes/x86: Remove IRQ disabling from jprobe handlers
> ee213fc72fd6: kprobes/x86: Set up frame pointer in kprobe trampoline
> a19b2e3d7839: kprobes/x86: Remove IRQ disabling from ftrace-based/optimized kprobes
> 5bb4fc2d8641: kprobes/x86: Disable preemption in ftrace-based jprobes
> 9a09f261a4fa: kprobes/x86: Disable preemption in optprobe
> cd52edad55fb: kprobes/x86: Move the get_kprobe_ctlblk() into irq-disabled block
> a8976fc84b64: kprobes/x86: Remove addressof() operators
> 
> Not "x86: kprobes:" which is the wrong order anyway...

OK, I got it. And sorry for the prefix change.

> 
> Could you please be more careful about all this in the future?

Yes, I promise it, use kprobes/x86: prefix for kprobes x86 part.

Thank you,

> 
> Thanks,
> 
> 	Ingo


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH -tip v3 4/7] kprobes: Ignore break_handler
  2018-05-18  6:20   ` Ingo Molnar
@ 2018-05-18 14:14     ` Masami Hiramatsu
  0 siblings, 0 replies; 16+ messages in thread
From: Masami Hiramatsu @ 2018-05-18 14:14 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Thomas Gleixner, x86, Ingo Molnar, H . Peter Anvin, linux-kernel,
	Ananth N Mavinakayanahalli, Andrew Morton, Steven Rostedt,
	Laura Abbott, Josef Bacik, Alexei Starovoitov, Ravi Bangoria

On Fri, 18 May 2018 08:20:34 +0200
Ingo Molnar <mingo@kernel.org> wrote:

> 
> * Masami Hiramatsu <mhiramat@kernel.org> wrote:
> 
> > Ignore break_handler related code because it was only
> > used by jprobe and jprobe is removed.
> 
> I changed this description to:
> 
>  ============
>  Subject: kprobes: Don't call the ->break_handler() in generic kprobes code
> 
>  Don't call the ->break_handler() from the core kprobes code, because it was only 
>  used by jprobes which got removed.
> 
>  ( In a followup patch we'll remove the remaining calls in low level 
>    arch handlers as well and remove the callback altogether. )
>  ============
> 
> Please try to be a lot less vague in changelogs when it's possible and relevant!
> 
> I.e. saying "Ignore break_handler related code" is annoyingly vague, it doesn't 
> explain things well at all. Saying "Don't call the ->break_handler()" is just as 
> compact, yet it also makes it very clear what's done in the patch...

OK, I'll try to describe more concretely and straightforwardly.

Thank you for telling me your advice!!

> 
> Thanks,
> 
> 	Ingo


-- 
Masami Hiramatsu <mhiramat@kernel.org>

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2018-05-18 14:14 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-16 23:56 [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Masami Hiramatsu
2018-05-16 23:57 ` [PATCH -tip v3 1/7] Documentation/kprobes: Fix to remove remaining jprobe Masami Hiramatsu
2018-05-16 23:57 ` [PATCH -tip v3 2/7] kprobes: Remove jprobe API implementation Masami Hiramatsu
2018-05-16 23:58 ` [PATCH -tip v3 3/7] x86: kprobes: Remove jprobe implementation Masami Hiramatsu
2018-05-16 23:58 ` [PATCH -tip v3 4/7] kprobes: Ignore break_handler Masami Hiramatsu
2018-05-18  6:16   ` Ingo Molnar
2018-05-18 13:38     ` Masami Hiramatsu
2018-05-18  6:20   ` Ingo Molnar
2018-05-18 14:14     ` Masami Hiramatsu
2018-05-16 23:59 ` [PATCH -tip v3 5/7] x86: " Masami Hiramatsu
2018-05-18  6:26   ` Ingo Molnar
2018-05-18 13:42     ` Masami Hiramatsu
2018-05-16 23:59 ` [PATCH -tip v3 6/7] bpf: error-inject: x86: Fix unbalanced preempt-count for function override Masami Hiramatsu
2018-05-17  0:00 ` [PATCH -tip v3 7/7] x86: kprobes: Do not disable preempt on int3 path Masami Hiramatsu
2018-05-18  6:23 ` [PATCH -tip v3 0/7] kprobes: x86: Cleanup jprobe implementation on x86 Ingo Molnar
2018-05-18 14:10   ` Masami Hiramatsu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).