public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
* [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out  from debugfs code
@ 2010-04-28 11:52 Masami Hiramatsu
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Masami Hiramatsu @ 2010-04-28 11:52 UTC (permalink / raw)
  To: Ingo Molnar, lkml
  Cc: systemtap, DLE, Masami Hiramatsu, Ananth N Mavinakayanahalli,
	Tony Luck, Ingo Molnar

Move enable/disable_kprobe() API out from debugfs related code,
because these interfaces are not related to debugfs interface.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by:  Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Acked-by: Tony Luck <tony.luck@intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
---

 kernel/kprobes.c |  132 +++++++++++++++++++++++++++---------------------------
 1 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index 0ed46f3..282035f 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -1588,6 +1588,72 @@ static void __kprobes kill_kprobe(struct kprobe *p)
 	arch_remove_kprobe(p);
 }
 
+/* Disable one kprobe */
+int __kprobes disable_kprobe(struct kprobe *kp)
+{
+	int ret = 0;
+	struct kprobe *p;
+
+	mutex_lock(&kprobe_mutex);
+
+	/* Check whether specified probe is valid. */
+	p = __get_valid_kprobe(kp);
+	if (unlikely(p == NULL)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	/* If the probe is already disabled (or gone), just return */
+	if (kprobe_disabled(kp))
+		goto out;
+
+	kp->flags |= KPROBE_FLAG_DISABLED;
+	if (p != kp)
+		/* When kp != p, p is always enabled. */
+		try_to_disable_aggr_kprobe(p);
+
+	if (!kprobes_all_disarmed && kprobe_disabled(p))
+		disarm_kprobe(p);
+out:
+	mutex_unlock(&kprobe_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(disable_kprobe);
+
+/* Enable one kprobe */
+int __kprobes enable_kprobe(struct kprobe *kp)
+{
+	int ret = 0;
+	struct kprobe *p;
+
+	mutex_lock(&kprobe_mutex);
+
+	/* Check whether specified probe is valid. */
+	p = __get_valid_kprobe(kp);
+	if (unlikely(p == NULL)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	if (kprobe_gone(kp)) {
+		/* This kprobe has gone, we couldn't enable it. */
+		ret = -EINVAL;
+		goto out;
+	}
+
+	if (p != kp)
+		kp->flags &= ~KPROBE_FLAG_DISABLED;
+
+	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
+		p->flags &= ~KPROBE_FLAG_DISABLED;
+		arm_kprobe(p);
+	}
+out:
+	mutex_unlock(&kprobe_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(enable_kprobe);
+
 void __kprobes dump_kprobe(struct kprobe *kp)
 {
 	printk(KERN_WARNING "Dumping kprobe:\n");
@@ -1805,72 +1871,6 @@ static const struct file_operations debugfs_kprobes_operations = {
 	.release        = seq_release,
 };
 
-/* Disable one kprobe */
-int __kprobes disable_kprobe(struct kprobe *kp)
-{
-	int ret = 0;
-	struct kprobe *p;
-
-	mutex_lock(&kprobe_mutex);
-
-	/* Check whether specified probe is valid. */
-	p = __get_valid_kprobe(kp);
-	if (unlikely(p == NULL)) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	/* If the probe is already disabled (or gone), just return */
-	if (kprobe_disabled(kp))
-		goto out;
-
-	kp->flags |= KPROBE_FLAG_DISABLED;
-	if (p != kp)
-		/* When kp != p, p is always enabled. */
-		try_to_disable_aggr_kprobe(p);
-
-	if (!kprobes_all_disarmed && kprobe_disabled(p))
-		disarm_kprobe(p);
-out:
-	mutex_unlock(&kprobe_mutex);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(disable_kprobe);
-
-/* Enable one kprobe */
-int __kprobes enable_kprobe(struct kprobe *kp)
-{
-	int ret = 0;
-	struct kprobe *p;
-
-	mutex_lock(&kprobe_mutex);
-
-	/* Check whether specified probe is valid. */
-	p = __get_valid_kprobe(kp);
-	if (unlikely(p == NULL)) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	if (kprobe_gone(kp)) {
-		/* This kprobe has gone, we couldn't enable it. */
-		ret = -EINVAL;
-		goto out;
-	}
-
-	if (p != kp)
-		kp->flags &= ~KPROBE_FLAG_DISABLED;
-
-	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
-		p->flags &= ~KPROBE_FLAG_DISABLED;
-		arm_kprobe(p);
-	}
-out:
-	mutex_unlock(&kprobe_mutex);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(enable_kprobe);
-
 static void __kprobes arm_all_kprobes(void)
 {
 	struct hlist_head *head;


-- 
Masami Hiramatsu
e-mail: mhiramat@redhat.com

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

* [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order
  2010-04-28 11:52 [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
@ 2010-04-28 11:56 ` Masami Hiramatsu
  2010-04-28 17:30   ` Ananth N Mavinakayanahalli
                     ` (2 more replies)
  2010-05-10 17:06 ` [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
  2010-05-10 17:47 ` [tip:perf/core] " tip-bot for Masami Hiramatsu
  2 siblings, 3 replies; 10+ messages in thread
From: Masami Hiramatsu @ 2010-04-28 11:56 UTC (permalink / raw)
  To: Ingo Molnar, lkml
  Cc: systemtap, DLE, Masami Hiramatsu, Ananth N Mavinakayanahalli,
	Dave Anderson, Ingo Molnar

Fix kprobe/x86 to check removed int3 when failing to get kprobe
from hlist. Since we have a time window between checking int3
exists on probed address and getting kprobe on that address,
we can have following senario.
-------
CPU1                     CPU2
hit int3
check int3 exists
                         remove int3
                         remove kprobe from hlist
get kprobe from hlist
no kprobe->OOPS!
-------
This patch moves int3 checking if there is no kprobe on that
address for fixing this problem as follows;
------
CPU1                     CPU2
hit int3
                         remove int3
                         remove kprobe from hlist
get kprobe from hlist
no kprobe->check int3 exists
         ->rollback&retry
------

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Dave Anderson <anderson@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
---

 arch/x86/kernel/kprobes.c |   27 +++++++++++++--------------
 1 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
index f2f56c0..345a4b1 100644
--- a/arch/x86/kernel/kprobes.c
+++ b/arch/x86/kernel/kprobes.c
@@ -542,20 +542,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 	struct kprobe_ctlblk *kcb;
 
 	addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t));
-	if (*addr != BREAKPOINT_INSTRUCTION) {
-		/*
-		 * The breakpoint instruction was removed right
-		 * after we hit it.  Another cpu has removed
-		 * either a probepoint or a debugger breakpoint
-		 * at this address.  In either case, no further
-		 * handling of this interrupt is appropriate.
-		 * Back up over the (now missing) int3 and run
-		 * the original instruction.
-		 */
-		regs->ip = (unsigned long)addr;
-		return 1;
-	}
-
 	/*
 	 * We don't want to be preempted for the entire
 	 * duration of kprobe processing. We conditionally
@@ -587,6 +573,19 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 				setup_singlestep(p, regs, kcb, 0);
 			return 1;
 		}
+	} else if (*addr != BREAKPOINT_INSTRUCTION) {
+		/*
+		 * The breakpoint instruction was removed right
+		 * after we hit it.  Another cpu has removed
+		 * either a probepoint or a debugger breakpoint
+		 * at this address.  In either case, no further
+		 * handling of this interrupt is appropriate.
+		 * Back up over the (now missing) int3 and run
+		 * the original instruction.
+		 */
+		regs->ip = (unsigned long)addr;
+		preempt_enable_no_resched();
+		return 1;
 	} else if (kprobe_running()) {
 		p = __get_cpu_var(current_kprobe);
 		if (p->break_handler && p->break_handler(p, regs)) {


-- 
Masami Hiramatsu
e-mail: mhiramat@redhat.com

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

* Re: [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3  checking order
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
@ 2010-04-28 17:30   ` Ananth N Mavinakayanahalli
  2010-04-28 17:54     ` Masami Hiramatsu
  2010-05-10 14:27   ` [tip:perf/urgent] " tip-bot for Masami Hiramatsu
  2010-05-11 16:15   ` tip-bot for Masami Hiramatsu
  2 siblings, 1 reply; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2010-04-28 17:30 UTC (permalink / raw)
  To: Masami Hiramatsu; +Cc: Ingo Molnar, lkml, systemtap, DLE, Dave Anderson

On Tue, Apr 27, 2010 at 06:33:49PM -0400, Masami Hiramatsu wrote:
> Fix kprobe/x86 to check removed int3 when failing to get kprobe
> from hlist. Since we have a time window between checking int3
> exists on probed address and getting kprobe on that address,
> we can have following senario.
> -------
> CPU1                     CPU2
> hit int3
> check int3 exists
>                          remove int3
>                          remove kprobe from hlist
> get kprobe from hlist
> no kprobe->OOPS!
> -------

Do you have a testcase for this issue?

> This patch moves int3 checking if there is no kprobe on that
> address for fixing this problem as follows;
> ------
> CPU1                     CPU2
> hit int3
>                          remove int3
>                          remove kprobe from hlist
> get kprobe from hlist
> no kprobe->check int3 exists
>          ->rollback&retry
> ------

You may also want to fix up the comment on top of kprobe_handler() about
the interrupt gate as its only true for x86_32 and not x86_64, right?

> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> Cc: Dave Anderson <anderson@redhat.com>
> Cc: Ingo Molnar <mingo@elte.hu>

Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>

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

* Re: [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking  order
  2010-04-28 17:30   ` Ananth N Mavinakayanahalli
@ 2010-04-28 17:54     ` Masami Hiramatsu
  2010-04-30 19:45       ` Ananth N Mavinakayanahalli
  0 siblings, 1 reply; 10+ messages in thread
From: Masami Hiramatsu @ 2010-04-28 17:54 UTC (permalink / raw)
  To: ananth; +Cc: Ingo Molnar, lkml, systemtap, DLE, Dave Anderson

Ananth N Mavinakayanahalli wrote:
> On Tue, Apr 27, 2010 at 06:33:49PM -0400, Masami Hiramatsu wrote:
>> Fix kprobe/x86 to check removed int3 when failing to get kprobe
>> from hlist. Since we have a time window between checking int3
>> exists on probed address and getting kprobe on that address,
>> we can have following senario.
>> -------
>> CPU1                     CPU2
>> hit int3
>> check int3 exists
>>                          remove int3
>>                          remove kprobe from hlist
>> get kprobe from hlist
>> no kprobe->OOPS!
>> -------
> 
> Do you have a testcase for this issue?

I heard this issue was found by systemtap team on stable kernel(means
no jump optimization). Their testsuites caused an oops (but not 100%
reproducible) with "pr10854" testcase, which registers over 5000
probes at once and removes it soon.

>> This patch moves int3 checking if there is no kprobe on that
>> address for fixing this problem as follows;
>> ------
>> CPU1                     CPU2
>> hit int3
>>                          remove int3
>>                          remove kprobe from hlist
>> get kprobe from hlist
>> no kprobe->check int3 exists
>>          ->rollback&retry
>> ------
> 
> You may also want to fix up the comment on top of kprobe_handler() about
> the interrupt gate as its only true for x86_32 and not x86_64, right?

Hmm, I couldn't find it, could you tell me more details?
(and maybe, it's another issue)

what I could find is int3 handler is registered as interrupt gate
on both of x86-32/64.

void __init trap_init(void)
{
...
        /* int3 can be called from all */
        set_system_intr_gate_ist(3, &int3, DEBUG_STACK);


> 
>> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
>> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
>> Cc: Dave Anderson <anderson@redhat.com>
>> Cc: Ingo Molnar <mingo@elte.hu>
> 
> Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>

Thank you,

-- 
Masami Hiramatsu
e-mail: mhiramat@redhat.com

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

* Re: [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order
  2010-04-28 17:54     ` Masami Hiramatsu
@ 2010-04-30 19:45       ` Ananth N Mavinakayanahalli
  0 siblings, 0 replies; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2010-04-30 19:45 UTC (permalink / raw)
  To: Masami Hiramatsu; +Cc: Ingo Molnar, lkml, systemtap, DLE, Dave Anderson

On Wed, Apr 28, 2010 at 11:39:40AM -0400, Masami Hiramatsu wrote:
> Ananth N Mavinakayanahalli wrote:
> > On Tue, Apr 27, 2010 at 06:33:49PM -0400, Masami Hiramatsu wrote:

...

> > You may also want to fix up the comment on top of kprobe_handler() about
> > the interrupt gate as its only true for x86_32 and not x86_64, right?
> 
> Hmm, I couldn't find it, could you tell me more details?
> (and maybe, it's another issue)
> 
> what I could find is int3 handler is registered as interrupt gate
> on both of x86-32/64.
> 
> void __init trap_init(void)
> {
> ...
>         /* int3 can be called from all */
>         set_system_intr_gate_ist(3, &int3, DEBUG_STACK);

Ah, never mind. I was wrong. IIRC, before the 32-64 bit merger, 64bit
still used a trap gate.

Ananth

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

* [tip:perf/urgent] kprobes/x86: Fix removed int3 checking order
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
  2010-04-28 17:30   ` Ananth N Mavinakayanahalli
@ 2010-05-10 14:27   ` tip-bot for Masami Hiramatsu
  2010-05-11 16:15   ` tip-bot for Masami Hiramatsu
  2 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Masami Hiramatsu @ 2010-05-10 14:27 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, acme, paulus, hpa, mingo, a.p.zijlstra, efault,
	ananth, anderson, fweisbec, dle-develop, tglx, mhiramat, mingo,
	systemtap

Commit-ID:  51a66680aa450c81a1f31570700b6ade4886c841
Gitweb:     http://git.kernel.org/tip/51a66680aa450c81a1f31570700b6ade4886c841
Author:     Masami Hiramatsu <mhiramat@redhat.com>
AuthorDate: Tue, 27 Apr 2010 18:33:49 -0400
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Sat, 8 May 2010 13:19:29 +0200

kprobes/x86: Fix removed int3 checking order

Fix kprobe/x86 to check removed int3 when failing to get kprobe
from hlist. Since we have a time window between checking int3
exists on probed address and getting kprobe on that address,
we can have following scenario:

 -------
 CPU1                     CPU2
 hit int3
 check int3 exists
                          remove int3
                          remove kprobe from hlist
 get kprobe from hlist
 no kprobe->OOPS!
 -------

This patch moves int3 checking if there is no kprobe on that
address for fixing this problem as follows:

 ------
 CPU1                     CPU2
 hit int3
                          remove int3
                          remove kprobe from hlist
 get kprobe from hlist
 no kprobe->check int3 exists
          ->rollback&retry
 ------

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Dave Anderson <anderson@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20100427223348.2322.9112.stgit@localhost6.localdomain6>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 arch/x86/kernel/kprobes.c |   27 +++++++++++++--------------
 1 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
index b43bbae..1658efd 100644
--- a/arch/x86/kernel/kprobes.c
+++ b/arch/x86/kernel/kprobes.c
@@ -534,20 +534,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 	struct kprobe_ctlblk *kcb;
 
 	addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t));
-	if (*addr != BREAKPOINT_INSTRUCTION) {
-		/*
-		 * The breakpoint instruction was removed right
-		 * after we hit it.  Another cpu has removed
-		 * either a probepoint or a debugger breakpoint
-		 * at this address.  In either case, no further
-		 * handling of this interrupt is appropriate.
-		 * Back up over the (now missing) int3 and run
-		 * the original instruction.
-		 */
-		regs->ip = (unsigned long)addr;
-		return 1;
-	}
-
 	/*
 	 * We don't want to be preempted for the entire
 	 * duration of kprobe processing. We conditionally
@@ -579,6 +565,19 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 				setup_singlestep(p, regs, kcb, 0);
 			return 1;
 		}
+	} else if (*addr != BREAKPOINT_INSTRUCTION) {
+		/*
+		 * The breakpoint instruction was removed right
+		 * after we hit it.  Another cpu has removed
+		 * either a probepoint or a debugger breakpoint
+		 * at this address.  In either case, no further
+		 * handling of this interrupt is appropriate.
+		 * Back up over the (now missing) int3 and run
+		 * the original instruction.
+		 */
+		regs->ip = (unsigned long)addr;
+		preempt_enable_no_resched();
+		return 1;
 	} else if (kprobe_running()) {
 		p = __get_cpu_var(current_kprobe);
 		if (p->break_handler && p->break_handler(p, regs)) {

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

* Re: [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code
  2010-04-28 11:52 [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
@ 2010-05-10 17:06 ` Masami Hiramatsu
  2010-05-10 17:29   ` Ingo Molnar
  2010-05-10 17:47 ` [tip:perf/core] " tip-bot for Masami Hiramatsu
  2 siblings, 1 reply; 10+ messages in thread
From: Masami Hiramatsu @ 2010-05-10 17:06 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Masami Hiramatsu, lkml, systemtap, DLE,
	Ananth N Mavinakayanahalli, Tony Luck

Masami Hiramatsu wrote:
> Move enable/disable_kprobe() API out from debugfs related code,
> because these interfaces are not related to debugfs interface.

Hi Ingo,

Could you also merge this fix too?
This fixes a compiler warning when CONFIG_KPROBES && !CONFIG_DEBUG_FS.

Thank you,

> 
> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
> Acked-by:  Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> Acked-by: Tony Luck <tony.luck@intel.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> ---
> 
>  kernel/kprobes.c |  132 +++++++++++++++++++++++++++---------------------------
>  1 files changed, 66 insertions(+), 66 deletions(-)
> 
> diff --git a/kernel/kprobes.c b/kernel/kprobes.c
> index 0ed46f3..282035f 100644
> --- a/kernel/kprobes.c
> +++ b/kernel/kprobes.c
> @@ -1588,6 +1588,72 @@ static void __kprobes kill_kprobe(struct kprobe *p)
>  	arch_remove_kprobe(p);
>  }
>  
> +/* Disable one kprobe */
> +int __kprobes disable_kprobe(struct kprobe *kp)
> +{
> +	int ret = 0;
> +	struct kprobe *p;
> +
> +	mutex_lock(&kprobe_mutex);
> +
> +	/* Check whether specified probe is valid. */
> +	p = __get_valid_kprobe(kp);
> +	if (unlikely(p == NULL)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	/* If the probe is already disabled (or gone), just return */
> +	if (kprobe_disabled(kp))
> +		goto out;
> +
> +	kp->flags |= KPROBE_FLAG_DISABLED;
> +	if (p != kp)
> +		/* When kp != p, p is always enabled. */
> +		try_to_disable_aggr_kprobe(p);
> +
> +	if (!kprobes_all_disarmed && kprobe_disabled(p))
> +		disarm_kprobe(p);
> +out:
> +	mutex_unlock(&kprobe_mutex);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(disable_kprobe);
> +
> +/* Enable one kprobe */
> +int __kprobes enable_kprobe(struct kprobe *kp)
> +{
> +	int ret = 0;
> +	struct kprobe *p;
> +
> +	mutex_lock(&kprobe_mutex);
> +
> +	/* Check whether specified probe is valid. */
> +	p = __get_valid_kprobe(kp);
> +	if (unlikely(p == NULL)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	if (kprobe_gone(kp)) {
> +		/* This kprobe has gone, we couldn't enable it. */
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	if (p != kp)
> +		kp->flags &= ~KPROBE_FLAG_DISABLED;
> +
> +	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
> +		p->flags &= ~KPROBE_FLAG_DISABLED;
> +		arm_kprobe(p);
> +	}
> +out:
> +	mutex_unlock(&kprobe_mutex);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(enable_kprobe);
> +
>  void __kprobes dump_kprobe(struct kprobe *kp)
>  {
>  	printk(KERN_WARNING "Dumping kprobe:\n");
> @@ -1805,72 +1871,6 @@ static const struct file_operations debugfs_kprobes_operations = {
>  	.release        = seq_release,
>  };
>  
> -/* Disable one kprobe */
> -int __kprobes disable_kprobe(struct kprobe *kp)
> -{
> -	int ret = 0;
> -	struct kprobe *p;
> -
> -	mutex_lock(&kprobe_mutex);
> -
> -	/* Check whether specified probe is valid. */
> -	p = __get_valid_kprobe(kp);
> -	if (unlikely(p == NULL)) {
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
> -	/* If the probe is already disabled (or gone), just return */
> -	if (kprobe_disabled(kp))
> -		goto out;
> -
> -	kp->flags |= KPROBE_FLAG_DISABLED;
> -	if (p != kp)
> -		/* When kp != p, p is always enabled. */
> -		try_to_disable_aggr_kprobe(p);
> -
> -	if (!kprobes_all_disarmed && kprobe_disabled(p))
> -		disarm_kprobe(p);
> -out:
> -	mutex_unlock(&kprobe_mutex);
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(disable_kprobe);
> -
> -/* Enable one kprobe */
> -int __kprobes enable_kprobe(struct kprobe *kp)
> -{
> -	int ret = 0;
> -	struct kprobe *p;
> -
> -	mutex_lock(&kprobe_mutex);
> -
> -	/* Check whether specified probe is valid. */
> -	p = __get_valid_kprobe(kp);
> -	if (unlikely(p == NULL)) {
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
> -	if (kprobe_gone(kp)) {
> -		/* This kprobe has gone, we couldn't enable it. */
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
> -	if (p != kp)
> -		kp->flags &= ~KPROBE_FLAG_DISABLED;
> -
> -	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
> -		p->flags &= ~KPROBE_FLAG_DISABLED;
> -		arm_kprobe(p);
> -	}
> -out:
> -	mutex_unlock(&kprobe_mutex);
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(enable_kprobe);
> -
>  static void __kprobes arm_all_kprobes(void)
>  {
>  	struct hlist_head *head;
> 
> 

-- 
Masami Hiramatsu
e-mail: mhiramat@redhat.com

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

* Re: [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code
  2010-05-10 17:06 ` [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
@ 2010-05-10 17:29   ` Ingo Molnar
  0 siblings, 0 replies; 10+ messages in thread
From: Ingo Molnar @ 2010-05-10 17:29 UTC (permalink / raw)
  To: Masami Hiramatsu
  Cc: lkml, systemtap, DLE, Ananth N Mavinakayanahalli, Tony Luck


* Masami Hiramatsu <mhiramat@redhat.com> wrote:

> Masami Hiramatsu wrote:
> > Move enable/disable_kprobe() API out from debugfs related code,
> > because these interfaces are not related to debugfs interface.
> 
> Hi Ingo,
> 
> Could you also merge this fix too?
> This fixes a compiler warning when CONFIG_KPROBES && !CONFIG_DEBUG_FS.

Sure, i've applied it to the v2.6.35 queue.

	Ingo

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

* [tip:perf/core] kprobes: Move enable/disable_kprobe() out from debugfs code
  2010-04-28 11:52 [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
  2010-05-10 17:06 ` [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
@ 2010-05-10 17:47 ` tip-bot for Masami Hiramatsu
  2 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Masami Hiramatsu @ 2010-05-10 17:47 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, tony.luck, ananth, dle-develop, tglx,
	mhiramat, mingo, systemtap

Commit-ID:  c0614829c16ab9d31f1b7d40516decfbf3d32102
Gitweb:     http://git.kernel.org/tip/c0614829c16ab9d31f1b7d40516decfbf3d32102
Author:     Masami Hiramatsu <mhiramat@redhat.com>
AuthorDate: Tue, 27 Apr 2010 18:33:12 -0400
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Sat, 8 May 2010 18:08:30 +0200

kprobes: Move enable/disable_kprobe() out from debugfs code

Move enable/disable_kprobe() API out from debugfs related code,
because these interfaces are not related to debugfs interface.

This fixes a compiler warning.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by:  Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Acked-by: Tony Luck <tony.luck@intel.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
LKML-Reference: <20100427223312.2322.60512.stgit@localhost6.localdomain6>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 kernel/kprobes.c |  132 +++++++++++++++++++++++++++---------------------------
 1 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index 0ed46f3..282035f 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -1588,6 +1588,72 @@ static void __kprobes kill_kprobe(struct kprobe *p)
 	arch_remove_kprobe(p);
 }
 
+/* Disable one kprobe */
+int __kprobes disable_kprobe(struct kprobe *kp)
+{
+	int ret = 0;
+	struct kprobe *p;
+
+	mutex_lock(&kprobe_mutex);
+
+	/* Check whether specified probe is valid. */
+	p = __get_valid_kprobe(kp);
+	if (unlikely(p == NULL)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	/* If the probe is already disabled (or gone), just return */
+	if (kprobe_disabled(kp))
+		goto out;
+
+	kp->flags |= KPROBE_FLAG_DISABLED;
+	if (p != kp)
+		/* When kp != p, p is always enabled. */
+		try_to_disable_aggr_kprobe(p);
+
+	if (!kprobes_all_disarmed && kprobe_disabled(p))
+		disarm_kprobe(p);
+out:
+	mutex_unlock(&kprobe_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(disable_kprobe);
+
+/* Enable one kprobe */
+int __kprobes enable_kprobe(struct kprobe *kp)
+{
+	int ret = 0;
+	struct kprobe *p;
+
+	mutex_lock(&kprobe_mutex);
+
+	/* Check whether specified probe is valid. */
+	p = __get_valid_kprobe(kp);
+	if (unlikely(p == NULL)) {
+		ret = -EINVAL;
+		goto out;
+	}
+
+	if (kprobe_gone(kp)) {
+		/* This kprobe has gone, we couldn't enable it. */
+		ret = -EINVAL;
+		goto out;
+	}
+
+	if (p != kp)
+		kp->flags &= ~KPROBE_FLAG_DISABLED;
+
+	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
+		p->flags &= ~KPROBE_FLAG_DISABLED;
+		arm_kprobe(p);
+	}
+out:
+	mutex_unlock(&kprobe_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(enable_kprobe);
+
 void __kprobes dump_kprobe(struct kprobe *kp)
 {
 	printk(KERN_WARNING "Dumping kprobe:\n");
@@ -1805,72 +1871,6 @@ static const struct file_operations debugfs_kprobes_operations = {
 	.release        = seq_release,
 };
 
-/* Disable one kprobe */
-int __kprobes disable_kprobe(struct kprobe *kp)
-{
-	int ret = 0;
-	struct kprobe *p;
-
-	mutex_lock(&kprobe_mutex);
-
-	/* Check whether specified probe is valid. */
-	p = __get_valid_kprobe(kp);
-	if (unlikely(p == NULL)) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	/* If the probe is already disabled (or gone), just return */
-	if (kprobe_disabled(kp))
-		goto out;
-
-	kp->flags |= KPROBE_FLAG_DISABLED;
-	if (p != kp)
-		/* When kp != p, p is always enabled. */
-		try_to_disable_aggr_kprobe(p);
-
-	if (!kprobes_all_disarmed && kprobe_disabled(p))
-		disarm_kprobe(p);
-out:
-	mutex_unlock(&kprobe_mutex);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(disable_kprobe);
-
-/* Enable one kprobe */
-int __kprobes enable_kprobe(struct kprobe *kp)
-{
-	int ret = 0;
-	struct kprobe *p;
-
-	mutex_lock(&kprobe_mutex);
-
-	/* Check whether specified probe is valid. */
-	p = __get_valid_kprobe(kp);
-	if (unlikely(p == NULL)) {
-		ret = -EINVAL;
-		goto out;
-	}
-
-	if (kprobe_gone(kp)) {
-		/* This kprobe has gone, we couldn't enable it. */
-		ret = -EINVAL;
-		goto out;
-	}
-
-	if (p != kp)
-		kp->flags &= ~KPROBE_FLAG_DISABLED;
-
-	if (!kprobes_all_disarmed && kprobe_disabled(p)) {
-		p->flags &= ~KPROBE_FLAG_DISABLED;
-		arm_kprobe(p);
-	}
-out:
-	mutex_unlock(&kprobe_mutex);
-	return ret;
-}
-EXPORT_SYMBOL_GPL(enable_kprobe);
-
 static void __kprobes arm_all_kprobes(void)
 {
 	struct hlist_head *head;

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

* [tip:perf/urgent] kprobes/x86: Fix removed int3 checking order
  2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
  2010-04-28 17:30   ` Ananth N Mavinakayanahalli
  2010-05-10 14:27   ` [tip:perf/urgent] " tip-bot for Masami Hiramatsu
@ 2010-05-11 16:15   ` tip-bot for Masami Hiramatsu
  2 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Masami Hiramatsu @ 2010-05-11 16:15 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, acme, paulus, hpa, mingo, a.p.zijlstra, efault,
	ananth, anderson, fweisbec, dle-develop, tglx, mhiramat, mingo,
	systemtap

Commit-ID:  829e92458532b1dbfeb972435d45bb060cdbf5a3
Gitweb:     http://git.kernel.org/tip/829e92458532b1dbfeb972435d45bb060cdbf5a3
Author:     Masami Hiramatsu <mhiramat@redhat.com>
AuthorDate: Tue, 27 Apr 2010 18:33:49 -0400
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Tue, 11 May 2010 09:14:25 +0200

kprobes/x86: Fix removed int3 checking order

Fix kprobe/x86 to check removed int3 when failing to get kprobe
from hlist. Since we have a time window between checking int3
exists on probed address and getting kprobe on that address,
we can have following scenario:

 -------
 CPU1                     CPU2
 hit int3
 check int3 exists
                          remove int3
                          remove kprobe from hlist
 get kprobe from hlist
 no kprobe->OOPS!
 -------

This patch moves int3 checking if there is no kprobe on that
address for fixing this problem as follows:

 ------
 CPU1                     CPU2
 hit int3
                          remove int3
                          remove kprobe from hlist
 get kprobe from hlist
 no kprobe->check int3 exists
          ->rollback&retry
 ------

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Dave Anderson <anderson@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20100427223348.2322.9112.stgit@localhost6.localdomain6>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
 arch/x86/kernel/kprobes.c |   27 +++++++++++++--------------
 1 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
index b43bbae..1658efd 100644
--- a/arch/x86/kernel/kprobes.c
+++ b/arch/x86/kernel/kprobes.c
@@ -534,20 +534,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 	struct kprobe_ctlblk *kcb;
 
 	addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t));
-	if (*addr != BREAKPOINT_INSTRUCTION) {
-		/*
-		 * The breakpoint instruction was removed right
-		 * after we hit it.  Another cpu has removed
-		 * either a probepoint or a debugger breakpoint
-		 * at this address.  In either case, no further
-		 * handling of this interrupt is appropriate.
-		 * Back up over the (now missing) int3 and run
-		 * the original instruction.
-		 */
-		regs->ip = (unsigned long)addr;
-		return 1;
-	}
-
 	/*
 	 * We don't want to be preempted for the entire
 	 * duration of kprobe processing. We conditionally
@@ -579,6 +565,19 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
 				setup_singlestep(p, regs, kcb, 0);
 			return 1;
 		}
+	} else if (*addr != BREAKPOINT_INSTRUCTION) {
+		/*
+		 * The breakpoint instruction was removed right
+		 * after we hit it.  Another cpu has removed
+		 * either a probepoint or a debugger breakpoint
+		 * at this address.  In either case, no further
+		 * handling of this interrupt is appropriate.
+		 * Back up over the (now missing) int3 and run
+		 * the original instruction.
+		 */
+		regs->ip = (unsigned long)addr;
+		preempt_enable_no_resched();
+		return 1;
 	} else if (kprobe_running()) {
 		p = __get_cpu_var(current_kprobe);
 		if (p->break_handler && p->break_handler(p, regs)) {

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

end of thread, other threads:[~2010-05-11  7:26 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-28 11:52 [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
2010-04-28 11:56 ` [PATCH -tip 2/2] [BUGFIX] kprobes/x86: Fix removed int3 checking order Masami Hiramatsu
2010-04-28 17:30   ` Ananth N Mavinakayanahalli
2010-04-28 17:54     ` Masami Hiramatsu
2010-04-30 19:45       ` Ananth N Mavinakayanahalli
2010-05-10 14:27   ` [tip:perf/urgent] " tip-bot for Masami Hiramatsu
2010-05-11 16:15   ` tip-bot for Masami Hiramatsu
2010-05-10 17:06 ` [PATCH -tip 1/2] [RESEND] kprobes: Move enable/disable_kprobe() out from debugfs code Masami Hiramatsu
2010-05-10 17:29   ` Ingo Molnar
2010-05-10 17:47 ` [tip:perf/core] " tip-bot for 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 read-only IMAP folder(s) and NNTP newsgroup(s).