linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
@ 2020-11-18  3:53 qiang.zhang
  2020-11-19 21:49 ` Paul E. McKenney
  0 siblings, 1 reply; 10+ messages in thread
From: qiang.zhang @ 2020-11-18  3:53 UTC (permalink / raw)
  To: paulmck, josh, rostedt; +Cc: joel, rcu, linux-kernel

From: Zqiang <qiang.zhang@windriver.com>

Add kasan_record_aux_stack function for kvfree_call_rcu function to
record call stacks.

Signed-off-by: Zqiang <qiang.zhang@windriver.com>
---
 kernel/rcu/tree.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index da3414522285..a252b2f0208d 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
 		success = true;
 		goto unlock_return;
 	}
-
+	kasan_record_aux_stack(ptr);
 	success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
 	if (!success) {
 		run_page_cache_worker(krcp);
-- 
2.17.1


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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-18  3:53 [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack qiang.zhang
@ 2020-11-19 21:49 ` Paul E. McKenney
  2020-11-20  8:51   ` Dmitry Vyukov
  2020-11-20 11:59   ` Uladzislau Rezki
  0 siblings, 2 replies; 10+ messages in thread
From: Paul E. McKenney @ 2020-11-19 21:49 UTC (permalink / raw)
  To: qiang.zhang; +Cc: josh, rostedt, joel, rcu, linux-kernel, kasan-dev, urezki

On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> From: Zqiang <qiang.zhang@windriver.com>
> 
> Add kasan_record_aux_stack function for kvfree_call_rcu function to
> record call stacks.
> 
> Signed-off-by: Zqiang <qiang.zhang@windriver.com>

Thank you, but this does not apply on the "dev" branch of the -rcu tree.
See file:///home/git/kernel.org/rcutodo.html for more info.

Adding others on CC who might have feedback on the general approach.

							Thanx, Paul

> ---
>  kernel/rcu/tree.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> index da3414522285..a252b2f0208d 100644
> --- a/kernel/rcu/tree.c
> +++ b/kernel/rcu/tree.c
> @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
>  		success = true;
>  		goto unlock_return;
>  	}
> -
> +	kasan_record_aux_stack(ptr);
>  	success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
>  	if (!success) {
>  		run_page_cache_worker(krcp);
> -- 
> 2.17.1
> 

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-19 21:49 ` Paul E. McKenney
@ 2020-11-20  8:51   ` Dmitry Vyukov
  2020-11-20 14:34     ` Paul E. McKenney
  2020-11-20 11:59   ` Uladzislau Rezki
  1 sibling, 1 reply; 10+ messages in thread
From: Dmitry Vyukov @ 2020-11-20  8:51 UTC (permalink / raw)
  To: Paul E. McKenney
  Cc: Zhang, Qiang, Josh Triplett, Steven Rostedt, Joel Fernandes, rcu,
	LKML, kasan-dev, Uladzislau Rezki

On Thu, Nov 19, 2020 at 10:49 PM Paul E. McKenney <paulmck@kernel.org> wrote:
>
> On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > From: Zqiang <qiang.zhang@windriver.com>
> >
> > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > record call stacks.
> >
> > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
>
> Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> See file:///home/git/kernel.org/rcutodo.html for more info.
>
> Adding others on CC who might have feedback on the general approach.
>
>                                                         Thanx, Paul
>
> > ---
> >  kernel/rcu/tree.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > index da3414522285..a252b2f0208d 100644
> > --- a/kernel/rcu/tree.c
> > +++ b/kernel/rcu/tree.c
> > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> >               success = true;
> >               goto unlock_return;
> >       }
> > -
> > +     kasan_record_aux_stack(ptr);
> >       success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
> >       if (!success) {
> >               run_page_cache_worker(krcp);


kvfree_call_rcu is intended to free objects, right? If so this is:

Acked-by: Dmitry Vyukov <dvyukov@google.com>

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-19 21:49 ` Paul E. McKenney
  2020-11-20  8:51   ` Dmitry Vyukov
@ 2020-11-20 11:59   ` Uladzislau Rezki
  2020-11-20 12:06     ` Dmitry Vyukov
  1 sibling, 1 reply; 10+ messages in thread
From: Uladzislau Rezki @ 2020-11-20 11:59 UTC (permalink / raw)
  To: Zqiang
  Cc: Paul E. McKenney, josh, rostedt, joel, rcu, linux-kernel,
	kasan-dev, urezki

On Thu, Nov 19, 2020 at 01:49:34PM -0800, Paul E. McKenney wrote:
> On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > From: Zqiang <qiang.zhang@windriver.com>
> > 
> > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > record call stacks.
> > 
> > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> 
> Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> See file:///home/git/kernel.org/rcutodo.html for more info.
> 
> Adding others on CC who might have feedback on the general approach.
> 
> 							Thanx, Paul
> 
> > ---
> >  kernel/rcu/tree.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > index da3414522285..a252b2f0208d 100644
> > --- a/kernel/rcu/tree.c
> > +++ b/kernel/rcu/tree.c
> > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> >  		success = true;
> >  		goto unlock_return;
> >  	}
> > -
> > +	kasan_record_aux_stack(ptr);
Is that save to invoke it on vmalloced ptr.?

--
Vlad Rezki

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20 11:59   ` Uladzislau Rezki
@ 2020-11-20 12:06     ` Dmitry Vyukov
  2020-11-20 12:49       ` Uladzislau Rezki
  0 siblings, 1 reply; 10+ messages in thread
From: Dmitry Vyukov @ 2020-11-20 12:06 UTC (permalink / raw)
  To: Uladzislau Rezki
  Cc: Zqiang, Paul E. McKenney, Josh Triplett, Steven Rostedt,
	Joel Fernandes, rcu, LKML, kasan-dev

On Fri, Nov 20, 2020 at 12:59 PM Uladzislau Rezki <urezki@gmail.com> wrote:
>
> On Thu, Nov 19, 2020 at 01:49:34PM -0800, Paul E. McKenney wrote:
> > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > From: Zqiang <qiang.zhang@windriver.com>
> > >
> > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > record call stacks.
> > >
> > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> >
> > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > See file:///home/git/kernel.org/rcutodo.html for more info.
> >
> > Adding others on CC who might have feedback on the general approach.
> >
> >                                                       Thanx, Paul
> >
> > > ---
> > >  kernel/rcu/tree.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > index da3414522285..a252b2f0208d 100644
> > > --- a/kernel/rcu/tree.c
> > > +++ b/kernel/rcu/tree.c
> > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > >             success = true;
> > >             goto unlock_return;
> > >     }
> > > -
> > > +   kasan_record_aux_stack(ptr);
> Is that save to invoke it on vmalloced ptr.?

Yes, kasan_record_aux_stack should figure it out itself.
We call kasan_record_aux_stack on call_rcu as well, and rcu structs
can be anywhere.
See:
https://elixir.bootlin.com/linux/v5.10-rc4/source/mm/kasan/generic.c#L335

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20 12:06     ` Dmitry Vyukov
@ 2020-11-20 12:49       ` Uladzislau Rezki
  0 siblings, 0 replies; 10+ messages in thread
From: Uladzislau Rezki @ 2020-11-20 12:49 UTC (permalink / raw)
  To: Dmitry Vyukov, Zqiang
  Cc: Uladzislau Rezki, Paul E. McKenney, Josh Triplett,
	Steven Rostedt, Joel Fernandes, rcu, LKML, kasan-dev

> On Fri, Nov 20, 2020 at 12:59 PM Uladzislau Rezki <urezki@gmail.com> wrote:
> >
> > On Thu, Nov 19, 2020 at 01:49:34PM -0800, Paul E. McKenney wrote:
> > > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > > From: Zqiang <qiang.zhang@windriver.com>
> > > >
> > > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > > record call stacks.
> > > >
> > > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> > >
> > > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > > See file:///home/git/kernel.org/rcutodo.html for more info.
> > >
> > > Adding others on CC who might have feedback on the general approach.
> > >
> > >                                                       Thanx, Paul
> > >
> > > > ---
> > > >  kernel/rcu/tree.c | 2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > >
> > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > > index da3414522285..a252b2f0208d 100644
> > > > --- a/kernel/rcu/tree.c
> > > > +++ b/kernel/rcu/tree.c
> > > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > > >             success = true;
> > > >             goto unlock_return;
> > > >     }
> > > > -
> > > > +   kasan_record_aux_stack(ptr);
> > Is that save to invoke it on vmalloced ptr.?
> 
> Yes, kasan_record_aux_stack should figure it out itself.
> We call kasan_record_aux_stack on call_rcu as well, and rcu structs
> can be anywhere.
> See:
> https://elixir.bootlin.com/linux/v5.10-rc4/source/mm/kasan/generic.c#L335
>
Ah, i see the check. Just a minor comment, please also add a
clear comment about intention of doing such record.

Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com>

Thanks.

--
Vlad Rezki

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20  8:51   ` Dmitry Vyukov
@ 2020-11-20 14:34     ` Paul E. McKenney
  2020-11-20 14:44       ` Dmitry Vyukov
  2020-11-20 14:45       ` Paul E. McKenney
  0 siblings, 2 replies; 10+ messages in thread
From: Paul E. McKenney @ 2020-11-20 14:34 UTC (permalink / raw)
  To: Dmitry Vyukov
  Cc: Zhang, Qiang, Josh Triplett, Steven Rostedt, Joel Fernandes, rcu,
	LKML, kasan-dev, Uladzislau Rezki

On Fri, Nov 20, 2020 at 09:51:15AM +0100, Dmitry Vyukov wrote:
> On Thu, Nov 19, 2020 at 10:49 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> >
> > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > From: Zqiang <qiang.zhang@windriver.com>
> > >
> > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > record call stacks.
> > >
> > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> >
> > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > See file:///home/git/kernel.org/rcutodo.html for more info.
> >
> > Adding others on CC who might have feedback on the general approach.
> >
> >                                                         Thanx, Paul
> >
> > > ---
> > >  kernel/rcu/tree.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > index da3414522285..a252b2f0208d 100644
> > > --- a/kernel/rcu/tree.c
> > > +++ b/kernel/rcu/tree.c
> > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > >               success = true;
> > >               goto unlock_return;
> > >       }
> > > -
> > > +     kasan_record_aux_stack(ptr);
> > >       success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
> > >       if (!success) {
> > >               run_page_cache_worker(krcp);
> 
> kvfree_call_rcu is intended to free objects, right? If so this is:

True, but mightn't there still be RCU readers referencing this object for
some time, as in up to the point that the RCU grace period ends?  If so,
won't adding this cause KASAN to incorrectly complain about those readers?

Or am I missing something here?

						Thanx, Paul

> Acked-by: Dmitry Vyukov <dvyukov@google.com>

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20 14:34     ` Paul E. McKenney
@ 2020-11-20 14:44       ` Dmitry Vyukov
  2020-11-20 14:54         ` Paul E. McKenney
  2020-11-20 14:45       ` Paul E. McKenney
  1 sibling, 1 reply; 10+ messages in thread
From: Dmitry Vyukov @ 2020-11-20 14:44 UTC (permalink / raw)
  To: Paul E. McKenney
  Cc: Zhang, Qiang, Josh Triplett, Steven Rostedt, Joel Fernandes, rcu,
	LKML, kasan-dev, Uladzislau Rezki

On Fri, Nov 20, 2020 at 3:34 PM Paul E. McKenney <paulmck@kernel.org> wrote:
>
> On Fri, Nov 20, 2020 at 09:51:15AM +0100, Dmitry Vyukov wrote:
> > On Thu, Nov 19, 2020 at 10:49 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> > >
> > > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > > From: Zqiang <qiang.zhang@windriver.com>
> > > >
> > > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > > record call stacks.
> > > >
> > > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> > >
> > > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > > See file:///home/git/kernel.org/rcutodo.html for more info.
> > >
> > > Adding others on CC who might have feedback on the general approach.
> > >
> > >                                                         Thanx, Paul
> > >
> > > > ---
> > > >  kernel/rcu/tree.c | 2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > >
> > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > > index da3414522285..a252b2f0208d 100644
> > > > --- a/kernel/rcu/tree.c
> > > > +++ b/kernel/rcu/tree.c
> > > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > > >               success = true;
> > > >               goto unlock_return;
> > > >       }
> > > > -
> > > > +     kasan_record_aux_stack(ptr);
> > > >       success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
> > > >       if (!success) {
> > > >               run_page_cache_worker(krcp);
> >
> > kvfree_call_rcu is intended to free objects, right? If so this is:
>
> True, but mightn't there still be RCU readers referencing this object for
> some time, as in up to the point that the RCU grace period ends?  If so,
> won't adding this cause KASAN to incorrectly complain about those readers?
>
> Or am I missing something here?

kvfree_call_rcu does not check anything, not poison the object for
future accesses (it is also called in call_rcu which does not
necessarily free the object).
It just notes the current stack to provide in reports later.
The problem is that the free stack is pointless for objects freed by
rcu. In such cases we want call_rcu/kvfree_call_rcu stack in
use-after-free reports.

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20 14:34     ` Paul E. McKenney
  2020-11-20 14:44       ` Dmitry Vyukov
@ 2020-11-20 14:45       ` Paul E. McKenney
  1 sibling, 0 replies; 10+ messages in thread
From: Paul E. McKenney @ 2020-11-20 14:45 UTC (permalink / raw)
  To: Dmitry Vyukov
  Cc: Zhang, Qiang, Josh Triplett, Steven Rostedt, Joel Fernandes, rcu,
	LKML, kasan-dev, Uladzislau Rezki

On Fri, Nov 20, 2020 at 06:34:40AM -0800, Paul E. McKenney wrote:
> On Fri, Nov 20, 2020 at 09:51:15AM +0100, Dmitry Vyukov wrote:
> > On Thu, Nov 19, 2020 at 10:49 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> > >
> > > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > > From: Zqiang <qiang.zhang@windriver.com>
> > > >
> > > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > > record call stacks.
> > > >
> > > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> > >
> > > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > > See file:///home/git/kernel.org/rcutodo.html for more info.
> > >
> > > Adding others on CC who might have feedback on the general approach.
> > >
> > >                                                         Thanx, Paul
> > >
> > > > ---
> > > >  kernel/rcu/tree.c | 2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > >
> > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > > index da3414522285..a252b2f0208d 100644
> > > > --- a/kernel/rcu/tree.c
> > > > +++ b/kernel/rcu/tree.c
> > > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > > >               success = true;
> > > >               goto unlock_return;
> > > >       }
> > > > -
> > > > +     kasan_record_aux_stack(ptr);
> > > >       success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
> > > >       if (!success) {
> > > >               run_page_cache_worker(krcp);
> > 
> > kvfree_call_rcu is intended to free objects, right? If so this is:
> 
> True, but mightn't there still be RCU readers referencing this object for
> some time, as in up to the point that the RCU grace period ends?  If so,
> won't adding this cause KASAN to incorrectly complain about those readers?
> 
> Or am I missing something here?

For example, is kasan_record_aux_stack() -only- recording the stack and
not at all updating the allocated/freed state?

						Thanx, Paul

> > Acked-by: Dmitry Vyukov <dvyukov@google.com>

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

* Re: [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack
  2020-11-20 14:44       ` Dmitry Vyukov
@ 2020-11-20 14:54         ` Paul E. McKenney
  0 siblings, 0 replies; 10+ messages in thread
From: Paul E. McKenney @ 2020-11-20 14:54 UTC (permalink / raw)
  To: Dmitry Vyukov
  Cc: Zhang, Qiang, Josh Triplett, Steven Rostedt, Joel Fernandes, rcu,
	LKML, kasan-dev, Uladzislau Rezki

On Fri, Nov 20, 2020 at 03:44:04PM +0100, Dmitry Vyukov wrote:
> On Fri, Nov 20, 2020 at 3:34 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> >
> > On Fri, Nov 20, 2020 at 09:51:15AM +0100, Dmitry Vyukov wrote:
> > > On Thu, Nov 19, 2020 at 10:49 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> > > >
> > > > On Wed, Nov 18, 2020 at 11:53:09AM +0800, qiang.zhang@windriver.com wrote:
> > > > > From: Zqiang <qiang.zhang@windriver.com>
> > > > >
> > > > > Add kasan_record_aux_stack function for kvfree_call_rcu function to
> > > > > record call stacks.
> > > > >
> > > > > Signed-off-by: Zqiang <qiang.zhang@windriver.com>
> > > >
> > > > Thank you, but this does not apply on the "dev" branch of the -rcu tree.
> > > > See file:///home/git/kernel.org/rcutodo.html for more info.
> > > >
> > > > Adding others on CC who might have feedback on the general approach.
> > > >
> > > >                                                         Thanx, Paul
> > > >
> > > > > ---
> > > > >  kernel/rcu/tree.c | 2 +-
> > > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > > > index da3414522285..a252b2f0208d 100644
> > > > > --- a/kernel/rcu/tree.c
> > > > > +++ b/kernel/rcu/tree.c
> > > > > @@ -3506,7 +3506,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
> > > > >               success = true;
> > > > >               goto unlock_return;
> > > > >       }
> > > > > -
> > > > > +     kasan_record_aux_stack(ptr);
> > > > >       success = kvfree_call_rcu_add_ptr_to_bulk(krcp, ptr);
> > > > >       if (!success) {
> > > > >               run_page_cache_worker(krcp);
> > >
> > > kvfree_call_rcu is intended to free objects, right? If so this is:
> >
> > True, but mightn't there still be RCU readers referencing this object for
> > some time, as in up to the point that the RCU grace period ends?  If so,
> > won't adding this cause KASAN to incorrectly complain about those readers?
> >
> > Or am I missing something here?
> 
> kvfree_call_rcu does not check anything, not poison the object for
> future accesses (it is also called in call_rcu which does not
> necessarily free the object).
> It just notes the current stack to provide in reports later.
> The problem is that the free stack is pointless for objects freed by
> rcu. In such cases we want call_rcu/kvfree_call_rcu stack in
> use-after-free reports.

OK, sounds good, thank you!

I will take this patch with your ack and Uladzislau's reviewed-by.
I had to forward-port this to -rcu brach "dev", and along the way I
updated the commit log to make Dmitry's point above, so please let me
know if I messed anything up.

							Thanx, Paul

------------------------------------------------------------------------

commit 3ce23b2df528877623ffc9c9cc2b6885eb3ae9db
Author: Zqiang <qiang.zhang@windriver.com>
Date:   Fri Nov 20 06:53:11 2020 -0800

    rcu: Record kvfree_call_rcu() call stack for KASAN
    
    This commit adds a call to kasan_record_aux_stack() in kvfree_call_rcu()
    in order to record the call stack of the code that caused the object
    to be freed.  Please note that this function does not update the
    allocated/freed state, which is important because RCU readers might
    still be referencing this object.
    
    Acked-by: Dmitry Vyukov <dvyukov@google.com>
    Reviewed-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
    Signed-off-by: Zqiang <qiang.zhang@windriver.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 1d956f9..4aa7745 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -3514,6 +3514,7 @@ void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
 		return;
 	}
 
+	kasan_record_aux_stack(ptr);
 	success = add_ptr_to_bulk_krc_lock(&krcp, &flags, ptr, !head);
 	if (!success) {
 		run_page_cache_worker(krcp);

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

end of thread, other threads:[~2020-11-20 14:54 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-18  3:53 [PATCH] rcu: kasan: record and print kvfree_call_rcu call stack qiang.zhang
2020-11-19 21:49 ` Paul E. McKenney
2020-11-20  8:51   ` Dmitry Vyukov
2020-11-20 14:34     ` Paul E. McKenney
2020-11-20 14:44       ` Dmitry Vyukov
2020-11-20 14:54         ` Paul E. McKenney
2020-11-20 14:45       ` Paul E. McKenney
2020-11-20 11:59   ` Uladzislau Rezki
2020-11-20 12:06     ` Dmitry Vyukov
2020-11-20 12:49       ` Uladzislau Rezki

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).