All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
@ 2018-11-22 16:10 Andrea Parri
  2018-11-22 16:19 ` Oleg Nesterov
  2018-11-23  7:33 ` [tip:perf/urgent] " tip-bot for Andrea Parri
  0 siblings, 2 replies; 6+ messages in thread
From: Andrea Parri @ 2018-11-22 16:10 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrea Parri, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, Oleg Nesterov, stable

Commit 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() +
register() race") added the UPROBE_COPY_INSN flag, and corresponding
smp_wmb() and smp_rmb() memory barriers, to ensure that handle_swbp()
uses fully-initialized uprobes only.

However, the smp_rmb() is mis-placed: this barrier should be placed
after handle_swbp() has tested for the flag, thus guaranteeing that
(program-order) subsequent loads from the uprobe can see the initial
stores performed by prepare_uprobe().

Move the smp_rmb() accordingly.  Also amend the comments associated
to the two memory barriers to indicate their actual locations.

Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: stable@kernel.org
Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")
---
 kernel/events/uprobes.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 96d4bee83489b..322e97bbb4370 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -829,7 +829,7 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,
 	BUG_ON((uprobe->offset & ~PAGE_MASK) +
 			UPROBE_SWBP_INSN_SIZE > PAGE_SIZE);
 
-	smp_wmb(); /* pairs with rmb() in find_active_uprobe() */
+	smp_wmb(); /* pairs with the smp_rmb() in handle_swbp() */
 	set_bit(UPROBE_COPY_INSN, &uprobe->flags);
 
  out:
@@ -2178,10 +2178,18 @@ static void handle_swbp(struct pt_regs *regs)
 	 * After we hit the bp, _unregister + _register can install the
 	 * new and not-yet-analyzed uprobe at the same address, restart.
 	 */
-	smp_rmb(); /* pairs with wmb() in install_breakpoint() */
 	if (unlikely(!test_bit(UPROBE_COPY_INSN, &uprobe->flags)))
 		goto out;
 
+	/*
+	 * Pairs with the smp_wmb() in prepare_uprobe().
+	 *
+	 * Guarantees that if we see the UPROBE_COPY_INSN bit set, then
+	 * we must also see the stores to &uprobe->arch performed by the
+	 * prepare_uprobe() call.
+	 */
+	smp_rmb();
+
 	/* Tracing handlers use ->utask to communicate with fetch methods */
 	if (!get_utask())
 		goto out;
-- 
2.17.1


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

* Re: [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
  2018-11-22 16:10 [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more Andrea Parri
@ 2018-11-22 16:19 ` Oleg Nesterov
  2018-11-22 16:27   ` Oleg Nesterov
  2018-11-23  7:33 ` [tip:perf/urgent] " tip-bot for Andrea Parri
  1 sibling, 1 reply; 6+ messages in thread
From: Oleg Nesterov @ 2018-11-22 16:19 UTC (permalink / raw)
  To: Andrea Parri
  Cc: linux-kernel, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, stable

On 11/22, Andrea Parri wrote:
>
> Commit 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() +
> register() race") added the UPROBE_COPY_INSN flag, and corresponding
> smp_wmb() and smp_rmb() memory barriers, to ensure that handle_swbp()
> uses fully-initialized uprobes only.
> 
> However, the smp_rmb() is mis-placed: this barrier should be placed
> after handle_swbp() has tested for the flag, thus guaranteeing that
> (program-order) subsequent loads from the uprobe can see the initial
> stores performed by prepare_uprobe().
> 
> Move the smp_rmb() accordingly.  Also amend the comments associated
> to the two memory barriers to indicate their actual locations.
> 
> Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Jiri Olsa <jolsa@redhat.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: stable@kernel.org
> Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")

Thanks,

Acked-by: Oleg Nesterov <oleg@redhat.com>



> ---
>  kernel/events/uprobes.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
> index 96d4bee83489b..322e97bbb4370 100644
> --- a/kernel/events/uprobes.c
> +++ b/kernel/events/uprobes.c
> @@ -829,7 +829,7 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,
>  	BUG_ON((uprobe->offset & ~PAGE_MASK) +
>  			UPROBE_SWBP_INSN_SIZE > PAGE_SIZE);
>  
> -	smp_wmb(); /* pairs with rmb() in find_active_uprobe() */
> +	smp_wmb(); /* pairs with the smp_rmb() in handle_swbp() */
>  	set_bit(UPROBE_COPY_INSN, &uprobe->flags);
>  
>   out:
> @@ -2178,10 +2178,18 @@ static void handle_swbp(struct pt_regs *regs)
>  	 * After we hit the bp, _unregister + _register can install the
>  	 * new and not-yet-analyzed uprobe at the same address, restart.
>  	 */
> -	smp_rmb(); /* pairs with wmb() in install_breakpoint() */
>  	if (unlikely(!test_bit(UPROBE_COPY_INSN, &uprobe->flags)))
>  		goto out;
>  
> +	/*
> +	 * Pairs with the smp_wmb() in prepare_uprobe().
> +	 *
> +	 * Guarantees that if we see the UPROBE_COPY_INSN bit set, then
> +	 * we must also see the stores to &uprobe->arch performed by the
> +	 * prepare_uprobe() call.
> +	 */
> +	smp_rmb();
> +
>  	/* Tracing handlers use ->utask to communicate with fetch methods */
>  	if (!get_utask())
>  		goto out;
> -- 
> 2.17.1
> 


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

* Re: [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
  2018-11-22 16:19 ` Oleg Nesterov
@ 2018-11-22 16:27   ` Oleg Nesterov
  2018-11-22 19:38     ` Andrea Parri
  2018-11-23  7:34     ` Ingo Molnar
  0 siblings, 2 replies; 6+ messages in thread
From: Oleg Nesterov @ 2018-11-22 16:27 UTC (permalink / raw)
  To: Andrea Parri
  Cc: linux-kernel, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, stable

On 11/22, Oleg Nesterov wrote:
> On 11/22, Andrea Parri wrote:
> >
> > Commit 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() +
> > register() race") added the UPROBE_COPY_INSN flag, and corresponding
> > smp_wmb() and smp_rmb() memory barriers, to ensure that handle_swbp()
> > uses fully-initialized uprobes only.
> > 
> > However, the smp_rmb() is mis-placed: this barrier should be placed
> > after handle_swbp() has tested for the flag, thus guaranteeing that
> > (program-order) subsequent loads from the uprobe can see the initial
> > stores performed by prepare_uprobe().
> > 
> > Move the smp_rmb() accordingly.  Also amend the comments associated
> > to the two memory barriers to indicate their actual locations.
> > 
> > Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
> > Cc: Peter Zijlstra <peterz@infradead.org>
> > Cc: Ingo Molnar <mingo@redhat.com>
> > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > Cc: Jiri Olsa <jolsa@redhat.com>
> > Cc: Namhyung Kim <namhyung@kernel.org>
> > Cc: Oleg Nesterov <oleg@redhat.com>
> > Cc: stable@kernel.org
> > Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")
> 
> Thanks,
> 
> Acked-by: Oleg Nesterov <oleg@redhat.com>

Yes, but I am not sure this is the -stable material...

Oleg.


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

* Re: [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
  2018-11-22 16:27   ` Oleg Nesterov
@ 2018-11-22 19:38     ` Andrea Parri
  2018-11-23  7:34     ` Ingo Molnar
  1 sibling, 0 replies; 6+ messages in thread
From: Andrea Parri @ 2018-11-22 19:38 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: linux-kernel, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, stable

On Thu, Nov 22, 2018 at 05:27:09PM +0100, Oleg Nesterov wrote:
> On 11/22, Oleg Nesterov wrote:
> > On 11/22, Andrea Parri wrote:
> > >
> > > Commit 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() +
> > > register() race") added the UPROBE_COPY_INSN flag, and corresponding
> > > smp_wmb() and smp_rmb() memory barriers, to ensure that handle_swbp()
> > > uses fully-initialized uprobes only.
> > > 
> > > However, the smp_rmb() is mis-placed: this barrier should be placed
> > > after handle_swbp() has tested for the flag, thus guaranteeing that
> > > (program-order) subsequent loads from the uprobe can see the initial
> > > stores performed by prepare_uprobe().
> > > 
> > > Move the smp_rmb() accordingly.  Also amend the comments associated
> > > to the two memory barriers to indicate their actual locations.
> > > 
> > > Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
> > > Cc: Peter Zijlstra <peterz@infradead.org>
> > > Cc: Ingo Molnar <mingo@redhat.com>
> > > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > > Cc: Jiri Olsa <jolsa@redhat.com>
> > > Cc: Namhyung Kim <namhyung@kernel.org>
> > > Cc: Oleg Nesterov <oleg@redhat.com>
> > > Cc: stable@kernel.org
> > > Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")
> > 
> > Thanks,
> > 
> > Acked-by: Oleg Nesterov <oleg@redhat.com>

Thanks, Oleg.


> 
> Yes, but I am not sure this is the -stable material...

I'm inclined to leave it to you/the maintainers in question to decide
about this, ;-)  but please let me know if a resend or another action
is needed from me.

  Andrea


> 
> Oleg.
> 

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

* [tip:perf/urgent] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
  2018-11-22 16:10 [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more Andrea Parri
  2018-11-22 16:19 ` Oleg Nesterov
@ 2018-11-23  7:33 ` tip-bot for Andrea Parri
  1 sibling, 0 replies; 6+ messages in thread
From: tip-bot for Andrea Parri @ 2018-11-23  7:33 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: eranian, tglx, mingo, akpm, hpa, torvalds, namhyung, jolsa,
	andrea.parri, paulmck, acme, oleg, vincent.weaver,
	alexander.shishkin, peterz, linux-kernel

Commit-ID:  09d3f015d1e1b4fee7e9bbdcf54201d239393391
Gitweb:     https://git.kernel.org/tip/09d3f015d1e1b4fee7e9bbdcf54201d239393391
Author:     Andrea Parri <andrea.parri@amarulasolutions.com>
AuthorDate: Thu, 22 Nov 2018 17:10:31 +0100
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 23 Nov 2018 08:31:19 +0100

uprobes: Fix handle_swbp() vs. unregister() + register() race once more

Commit:

  142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")

added the UPROBE_COPY_INSN flag, and corresponding smp_wmb() and smp_rmb()
memory barriers, to ensure that handle_swbp() uses fully-initialized
uprobes only.

However, the smp_rmb() is mis-placed: this barrier should be placed
after handle_swbp() has tested for the flag, thus guaranteeing that
(program-order) subsequent loads from the uprobe can see the initial
stores performed by prepare_uprobe().

Move the smp_rmb() accordingly.  Also amend the comments associated
to the two memory barriers to indicate their actual locations.

Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: stable@kernel.org
Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")
Link: http://lkml.kernel.org/r/20181122161031.15179-1-andrea.parri@amarulasolutions.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 kernel/events/uprobes.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 96d4bee83489..322e97bbb437 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -829,7 +829,7 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,
 	BUG_ON((uprobe->offset & ~PAGE_MASK) +
 			UPROBE_SWBP_INSN_SIZE > PAGE_SIZE);
 
-	smp_wmb(); /* pairs with rmb() in find_active_uprobe() */
+	smp_wmb(); /* pairs with the smp_rmb() in handle_swbp() */
 	set_bit(UPROBE_COPY_INSN, &uprobe->flags);
 
  out:
@@ -2178,10 +2178,18 @@ static void handle_swbp(struct pt_regs *regs)
 	 * After we hit the bp, _unregister + _register can install the
 	 * new and not-yet-analyzed uprobe at the same address, restart.
 	 */
-	smp_rmb(); /* pairs with wmb() in install_breakpoint() */
 	if (unlikely(!test_bit(UPROBE_COPY_INSN, &uprobe->flags)))
 		goto out;
 
+	/*
+	 * Pairs with the smp_wmb() in prepare_uprobe().
+	 *
+	 * Guarantees that if we see the UPROBE_COPY_INSN bit set, then
+	 * we must also see the stores to &uprobe->arch performed by the
+	 * prepare_uprobe() call.
+	 */
+	smp_rmb();
+
 	/* Tracing handlers use ->utask to communicate with fetch methods */
 	if (!get_utask())
 		goto out;

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

* Re: [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more
  2018-11-22 16:27   ` Oleg Nesterov
  2018-11-22 19:38     ` Andrea Parri
@ 2018-11-23  7:34     ` Ingo Molnar
  1 sibling, 0 replies; 6+ messages in thread
From: Ingo Molnar @ 2018-11-23  7:34 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Andrea Parri, linux-kernel, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa,
	Namhyung Kim, stable


* Oleg Nesterov <oleg@redhat.com> wrote:

> On 11/22, Oleg Nesterov wrote:
> > On 11/22, Andrea Parri wrote:
> > >
> > > Commit 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() +
> > > register() race") added the UPROBE_COPY_INSN flag, and corresponding
> > > smp_wmb() and smp_rmb() memory barriers, to ensure that handle_swbp()
> > > uses fully-initialized uprobes only.
> > > 
> > > However, the smp_rmb() is mis-placed: this barrier should be placed
> > > after handle_swbp() has tested for the flag, thus guaranteeing that
> > > (program-order) subsequent loads from the uprobe can see the initial
> > > stores performed by prepare_uprobe().
> > > 
> > > Move the smp_rmb() accordingly.  Also amend the comments associated
> > > to the two memory barriers to indicate their actual locations.
> > > 
> > > Signed-off-by: Andrea Parri <andrea.parri@amarulasolutions.com>
> > > Cc: Peter Zijlstra <peterz@infradead.org>
> > > Cc: Ingo Molnar <mingo@redhat.com>
> > > Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> > > Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> > > Cc: Jiri Olsa <jolsa@redhat.com>
> > > Cc: Namhyung Kim <namhyung@kernel.org>
> > > Cc: Oleg Nesterov <oleg@redhat.com>
> > > Cc: stable@kernel.org
> > > Fixes: 142b18ddc8143 ("uprobes: Fix handle_swbp() vs unregister() + register() race")
> > 
> > Thanks,
> > 
> > Acked-by: Oleg Nesterov <oleg@redhat.com>
> 
> Yes, but I am not sure this is the -stable material...

So I left the Cc: stable tag intact, because this is a really low-risk 
fix (it just moves barriers around), and clearly fixes a bug that people 
might or might not have observed.

Even if they observed it the race is probably very hard to reproduce and 
almost impossible to report - so we are better off propagating this fix 
to -stable, as there's no realistic actionable way for users to actually 
complain about the bug if it affects them.

That's the general backporting policy for race fixes, unless they are 
really, really intrusive - which this one isn't really.

Thanks,

	Ingo

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

end of thread, other threads:[~2018-11-23  7:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-22 16:10 [PATCH] uprobes: Fix handle_swbp() vs. unregister() + register() race once more Andrea Parri
2018-11-22 16:19 ` Oleg Nesterov
2018-11-22 16:27   ` Oleg Nesterov
2018-11-22 19:38     ` Andrea Parri
2018-11-23  7:34     ` Ingo Molnar
2018-11-23  7:33 ` [tip:perf/urgent] " tip-bot for Andrea Parri

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.