linux-kernel-mentees.lists.linuxfoundation.org archive mirror
 help / color / mirror / Atom feed
* [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
@ 2020-02-01  7:27 Amol Grover
  2020-02-03 16:33 ` Joel Fernandes
  2020-02-05 22:06 ` Joel Fernandes
  0 siblings, 2 replies; 10+ messages in thread
From: Amol Grover @ 2020-02-01  7:27 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar
  Cc: Paul E . McKenney, linux-kernel, Madhuparna Bhowmik,
	Joel Fernandes, linux-kernel-mentees

Fix following instances of sparse error
kernel/trace/ftrace.c:5664:29: error: incompatible types in comparison
kernel/trace/ftrace.c:5785:21: error: incompatible types in comparison
kernel/trace/ftrace.c:5864:36: error: incompatible types in comparison
kernel/trace/ftrace.c:5866:25: error: incompatible types in comparison

Use rcu_dereference_protected to access the __rcu annotated pointer.

Signed-off-by: Amol Grover <frextrite@gmail.com>
---
 kernel/trace/ftrace.c | 2 +-
 kernel/trace/trace.h  | 9 ++++++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 9bf1f2cd515e..959ded08dc13 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -5596,7 +5596,7 @@ static const struct file_operations ftrace_notrace_fops = {
 
 static DEFINE_MUTEX(graph_lock);
 
-struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH;
+struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH;
 struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH;
 
 enum graph_filter_type {
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 63bf60f79398..97dad3326020 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
 				 unsigned long flags, int pc);
 
 #ifdef CONFIG_DYNAMIC_FTRACE
-extern struct ftrace_hash *ftrace_graph_hash;
+extern struct ftrace_hash __rcu *ftrace_graph_hash;
 extern struct ftrace_hash *ftrace_graph_notrace_hash;
 
 static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
 {
 	unsigned long addr = trace->func;
 	int ret = 0;
+	struct ftrace_hash *hash;
 
 	preempt_disable_notrace();
 
-	if (ftrace_hash_empty(ftrace_graph_hash)) {
+	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());
+
+	if (ftrace_hash_empty(hash)) {
 		ret = 1;
 		goto out;
 	}
 
-	if (ftrace_lookup_ip(ftrace_graph_hash, addr)) {
+	if (ftrace_lookup_ip(hash, addr)) {
 
 		/*
 		 * This needs to be cleared on the return functions
-- 
2.24.1

_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-01  7:27 [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu Amol Grover
@ 2020-02-03 16:33 ` Joel Fernandes
  2020-02-04 10:02   ` Steven Rostedt
  2020-02-05  1:01   ` Steven Rostedt
  2020-02-05 22:06 ` Joel Fernandes
  1 sibling, 2 replies; 10+ messages in thread
From: Joel Fernandes @ 2020-02-03 16:33 UTC (permalink / raw)
  To: Amol Grover
  Cc: Paul E . McKenney, linux-kernel, Steven Rostedt,
	Madhuparna Bhowmik, Ingo Molnar, linux-kernel-mentees

On Sat, Feb 01, 2020 at 12:57:04PM +0530, Amol Grover wrote:
> Fix following instances of sparse error
> kernel/trace/ftrace.c:5664:29: error: incompatible types in comparison
> kernel/trace/ftrace.c:5785:21: error: incompatible types in comparison
> kernel/trace/ftrace.c:5864:36: error: incompatible types in comparison
> kernel/trace/ftrace.c:5866:25: error: incompatible types in comparison
> 
> Use rcu_dereference_protected to access the __rcu annotated pointer.
> 
> Signed-off-by: Amol Grover <frextrite@gmail.com>
> ---
>  kernel/trace/ftrace.c | 2 +-
>  kernel/trace/trace.h  | 9 ++++++---
>  2 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 9bf1f2cd515e..959ded08dc13 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -5596,7 +5596,7 @@ static const struct file_operations ftrace_notrace_fops = {
>  
>  static DEFINE_MUTEX(graph_lock);
>  
> -struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH;
> +struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH;
>  struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH;
>  
>  enum graph_filter_type {
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index 63bf60f79398..97dad3326020 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
>  				 unsigned long flags, int pc);
>  
>  #ifdef CONFIG_DYNAMIC_FTRACE
> -extern struct ftrace_hash *ftrace_graph_hash;
> +extern struct ftrace_hash __rcu *ftrace_graph_hash;
>  extern struct ftrace_hash *ftrace_graph_notrace_hash;
>  
>  static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
>  {
>  	unsigned long addr = trace->func;
>  	int ret = 0;
> +	struct ftrace_hash *hash;
>  
>  	preempt_disable_notrace();
>  
> -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());

I think you can use rcu_dereference_sched() here? That way no need to pass
!preemptible.

A preempt-disabled section is an RCU "sched flavor" section. Flavors are
consolidated in the backend, but in the front end the dereference API still
do have flavors.

thanks,

 - Joel


> +
> +	if (ftrace_hash_empty(hash)) {
>  		ret = 1;
>  		goto out;
>  	}
>  
> -	if (ftrace_lookup_ip(ftrace_graph_hash, addr)) {
> +	if (ftrace_lookup_ip(hash, addr)) {
>  
>  		/*
>  		 * This needs to be cleared on the return functions
> -- 
> 2.24.1
> 
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-03 16:33 ` Joel Fernandes
@ 2020-02-04 10:02   ` Steven Rostedt
  2020-02-05  1:01   ` Steven Rostedt
  1 sibling, 0 replies; 10+ messages in thread
From: Steven Rostedt @ 2020-02-04 10:02 UTC (permalink / raw)
  To: Joel Fernandes
  Cc: Paul E . McKenney, linux-kernel, Madhuparna Bhowmik, Ingo Molnar,
	linux-kernel-mentees

On Mon, 3 Feb 2020 11:33:01 -0500
Joel Fernandes <joel@joelfernandes.org> wrote:

> >  	preempt_disable_notrace();
> >  
> > -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> > +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());  
> 
> I think you can use rcu_dereference_sched() here? That way no need to pass
> !preemptible.
> 
> A preempt-disabled section is an RCU "sched flavor" section. Flavors are
> consolidated in the backend, but in the front end the dereference API still
> do have flavors.

Agreed, Amol, can you send an update?

-- Steve
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-03 16:33 ` Joel Fernandes
  2020-02-04 10:02   ` Steven Rostedt
@ 2020-02-05  1:01   ` Steven Rostedt
  2020-02-05  5:26     ` Amol Grover
  2020-02-05 13:11     ` Paul E. McKenney
  1 sibling, 2 replies; 10+ messages in thread
From: Steven Rostedt @ 2020-02-05  1:01 UTC (permalink / raw)
  To: Joel Fernandes
  Cc: Paul E . McKenney, linux-kernel, Madhuparna Bhowmik, Ingo Molnar,
	linux-kernel-mentees

On Mon, 3 Feb 2020 11:33:01 -0500
Joel Fernandes <joel@joelfernandes.org> wrote:


> > --- a/kernel/trace/trace.h
> > +++ b/kernel/trace/trace.h
> > @@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
> >  				 unsigned long flags, int pc);
> >  
> >  #ifdef CONFIG_DYNAMIC_FTRACE
> > -extern struct ftrace_hash *ftrace_graph_hash;
> > +extern struct ftrace_hash __rcu *ftrace_graph_hash;
> >  extern struct ftrace_hash *ftrace_graph_notrace_hash;
> >  
> >  static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
> >  {
> >  	unsigned long addr = trace->func;
> >  	int ret = 0;
> > +	struct ftrace_hash *hash;
> >  
> >  	preempt_disable_notrace();
> >  
> > -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> > +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());  
> 
> I think you can use rcu_dereference_sched() here? That way no need to pass
> !preemptible.
> 
> A preempt-disabled section is an RCU "sched flavor" section. Flavors are
> consolidated in the backend, but in the front end the dereference API still
> do have flavors.

Unfortunately, doing it with rcu_dereference_sched() causes a lockdep
splat :-P. This is because ftrace can execute when rcu is not
"watching" and that will trigger a lockdep error. That means, this
origin patch *is* correct. I'm re-applying this one.

-- Steve
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-05  1:01   ` Steven Rostedt
@ 2020-02-05  5:26     ` Amol Grover
  2020-02-05 13:11     ` Paul E. McKenney
  1 sibling, 0 replies; 10+ messages in thread
From: Amol Grover @ 2020-02-05  5:26 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Paul E . McKenney, linux-kernel, Madhuparna Bhowmik, Ingo Molnar,
	Joel Fernandes, linux-kernel-mentees

On Tue, Feb 04, 2020 at 08:01:16PM -0500, Steven Rostedt wrote:
> On Mon, 3 Feb 2020 11:33:01 -0500
> Joel Fernandes <joel@joelfernandes.org> wrote:
> 
> 
> > > --- a/kernel/trace/trace.h
> > > +++ b/kernel/trace/trace.h
> > > @@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
> > >  				 unsigned long flags, int pc);
> > >  
> > >  #ifdef CONFIG_DYNAMIC_FTRACE
> > > -extern struct ftrace_hash *ftrace_graph_hash;
> > > +extern struct ftrace_hash __rcu *ftrace_graph_hash;
> > >  extern struct ftrace_hash *ftrace_graph_notrace_hash;
> > >  
> > >  static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
> > >  {
> > >  	unsigned long addr = trace->func;
> > >  	int ret = 0;
> > > +	struct ftrace_hash *hash;
> > >  
> > >  	preempt_disable_notrace();
> > >  
> > > -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> > > +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());  
> > 
> > I think you can use rcu_dereference_sched() here? That way no need to pass
> > !preemptible.
> > 
> > A preempt-disabled section is an RCU "sched flavor" section. Flavors are
> > consolidated in the backend, but in the front end the dereference API still
> > do have flavors.
> 
> Unfortunately, doing it with rcu_dereference_sched() causes a lockdep
> splat :-P. This is because ftrace can execute when rcu is not
> "watching" and that will trigger a lockdep error. That means, this
> origin patch *is* correct. I'm re-applying this one.
> 

Something new to learn, thank you for the information Steve!

Thanks
Amol

> -- Steve
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-05  1:01   ` Steven Rostedt
  2020-02-05  5:26     ` Amol Grover
@ 2020-02-05 13:11     ` Paul E. McKenney
  2020-02-05 13:14       ` Steven Rostedt
  1 sibling, 1 reply; 10+ messages in thread
From: Paul E. McKenney @ 2020-02-05 13:11 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: linux-kernel, Madhuparna Bhowmik, Ingo Molnar, Joel Fernandes,
	linux-kernel-mentees

On Tue, Feb 04, 2020 at 08:01:16PM -0500, Steven Rostedt wrote:
> On Mon, 3 Feb 2020 11:33:01 -0500
> Joel Fernandes <joel@joelfernandes.org> wrote:
> 
> 
> > > --- a/kernel/trace/trace.h
> > > +++ b/kernel/trace/trace.h
> > > @@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
> > >  				 unsigned long flags, int pc);
> > >  
> > >  #ifdef CONFIG_DYNAMIC_FTRACE
> > > -extern struct ftrace_hash *ftrace_graph_hash;
> > > +extern struct ftrace_hash __rcu *ftrace_graph_hash;
> > >  extern struct ftrace_hash *ftrace_graph_notrace_hash;
> > >  
> > >  static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
> > >  {
> > >  	unsigned long addr = trace->func;
> > >  	int ret = 0;
> > > +	struct ftrace_hash *hash;
> > >  
> > >  	preempt_disable_notrace();
> > >  
> > > -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> > > +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());  
> > 
> > I think you can use rcu_dereference_sched() here? That way no need to pass
> > !preemptible.
> > 
> > A preempt-disabled section is an RCU "sched flavor" section. Flavors are
> > consolidated in the backend, but in the front end the dereference API still
> > do have flavors.
> 
> Unfortunately, doing it with rcu_dereference_sched() causes a lockdep
> splat :-P. This is because ftrace can execute when rcu is not
> "watching" and that will trigger a lockdep error. That means, this
> origin patch *is* correct. I'm re-applying this one.

I strongly recommend a comment stating why disabling preemption prevents
ftrace_graph_hash from going away.  I see the synchronize_rcu() after
the rcu_assign_pointer() in ftrace_graph_release(), but I don't see
anything that waits on CPUs that RCU is not watching.

Of course, event tracing -makes- RCU watch when needed, but if that
was set up, then lockdep would not have complained.

So what am I missing?

							Thanx, Paul
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-05 13:11     ` Paul E. McKenney
@ 2020-02-05 13:14       ` Steven Rostedt
  2020-02-05 13:19         ` Steven Rostedt
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2020-02-05 13:14 UTC (permalink / raw)
  To: Paul E. McKenney
  Cc: linux-kernel, Madhuparna Bhowmik, Ingo Molnar, Joel Fernandes,
	linux-kernel-mentees

On Wed, 5 Feb 2020 05:11:10 -0800
"Paul E. McKenney" <paulmck@kernel.org> wrote:

> I strongly recommend a comment stating why disabling preemption prevents
> ftrace_graph_hash from going away.  I see the synchronize_rcu() after
> the rcu_assign_pointer() in ftrace_graph_release(), but I don't see
> anything that waits on CPUs that RCU is not watching.
> 
> Of course, event tracing -makes- RCU watch when needed, but if that
> was set up, then lockdep would not have complained.
> 
> So what am I missing?

Keep looking in your INBOX and look at the patch I asked you to ack or
complain about ;-) 

-- Steve
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-05 13:14       ` Steven Rostedt
@ 2020-02-05 13:19         ` Steven Rostedt
  2020-02-05 13:29           ` Paul E. McKenney
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Rostedt @ 2020-02-05 13:19 UTC (permalink / raw)
  To: Paul E. McKenney
  Cc: linux-kernel, Madhuparna Bhowmik, Ingo Molnar, Joel Fernandes,
	linux-kernel-mentees

On Wed, 5 Feb 2020 08:14:09 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:

> On Wed, 5 Feb 2020 05:11:10 -0800
> "Paul E. McKenney" <paulmck@kernel.org> wrote:
> 
> > I strongly recommend a comment stating why disabling preemption prevents
> > ftrace_graph_hash from going away.  I see the synchronize_rcu() after
> > the rcu_assign_pointer() in ftrace_graph_release(), but I don't see
> > anything that waits on CPUs that RCU is not watching.
> > 
> > Of course, event tracing -makes- RCU watch when needed, but if that
> > was set up, then lockdep would not have complained.
> > 
> > So what am I missing?  
> 
> Keep looking in your INBOX and look at the patch I asked you to ack or
> complain about ;-) 


Actually, looking at the code myself, it appears to be missing the
ftrace_sync. Thus, this is a bug, and requires the ftrace sync, as
synchronize_rcu() is not strong enough here.

Patch in process!

-- Steve

_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-05 13:19         ` Steven Rostedt
@ 2020-02-05 13:29           ` Paul E. McKenney
  0 siblings, 0 replies; 10+ messages in thread
From: Paul E. McKenney @ 2020-02-05 13:29 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: linux-kernel, Madhuparna Bhowmik, Ingo Molnar, Joel Fernandes,
	linux-kernel-mentees

On Wed, Feb 05, 2020 at 08:19:21AM -0500, Steven Rostedt wrote:
> On Wed, 5 Feb 2020 08:14:09 -0500
> Steven Rostedt <rostedt@goodmis.org> wrote:
> 
> > On Wed, 5 Feb 2020 05:11:10 -0800
> > "Paul E. McKenney" <paulmck@kernel.org> wrote:
> > 
> > > I strongly recommend a comment stating why disabling preemption prevents
> > > ftrace_graph_hash from going away.  I see the synchronize_rcu() after
> > > the rcu_assign_pointer() in ftrace_graph_release(), but I don't see
> > > anything that waits on CPUs that RCU is not watching.
> > > 
> > > Of course, event tracing -makes- RCU watch when needed, but if that
> > > was set up, then lockdep would not have complained.
> > > 
> > > So what am I missing?  
> > 
> > Keep looking in your INBOX and look at the patch I asked you to ack or
> > complain about ;-) 

Not yet seeing it, but...

> Actually, looking at the code myself, it appears to be missing the
> ftrace_sync. Thus, this is a bug, and requires the ftrace sync, as
> synchronize_rcu() is not strong enough here.
> 
> Patch in process!

Thank you for chasing it down!

							Thanx, Paul
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

* Re: [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu
  2020-02-01  7:27 [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu Amol Grover
  2020-02-03 16:33 ` Joel Fernandes
@ 2020-02-05 22:06 ` Joel Fernandes
  1 sibling, 0 replies; 10+ messages in thread
From: Joel Fernandes @ 2020-02-05 22:06 UTC (permalink / raw)
  To: Amol Grover
  Cc: Paul E . McKenney, linux-kernel, Steven Rostedt,
	Madhuparna Bhowmik, Ingo Molnar, linux-kernel-mentees

On Sat, Feb 01, 2020 at 12:57:04PM +0530, Amol Grover wrote:
> Fix following instances of sparse error
> kernel/trace/ftrace.c:5664:29: error: incompatible types in comparison
> kernel/trace/ftrace.c:5785:21: error: incompatible types in comparison
> kernel/trace/ftrace.c:5864:36: error: incompatible types in comparison
> kernel/trace/ftrace.c:5866:25: error: incompatible types in comparison
> 
> Use rcu_dereference_protected to access the __rcu annotated pointer.
> 
> Signed-off-by: Amol Grover <frextrite@gmail.com>
> ---
>  kernel/trace/ftrace.c | 2 +-
>  kernel/trace/trace.h  | 9 ++++++---
>  2 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 9bf1f2cd515e..959ded08dc13 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -5596,7 +5596,7 @@ static const struct file_operations ftrace_notrace_fops = {
>  
>  static DEFINE_MUTEX(graph_lock);
>  
> -struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH;
> +struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH;
>  struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH;
>  
>  enum graph_filter_type {
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index 63bf60f79398..97dad3326020 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -950,22 +950,25 @@ extern void __trace_graph_return(struct trace_array *tr,
>  				 unsigned long flags, int pc);
>  
>  #ifdef CONFIG_DYNAMIC_FTRACE
> -extern struct ftrace_hash *ftrace_graph_hash;
> +extern struct ftrace_hash __rcu *ftrace_graph_hash;
>  extern struct ftrace_hash *ftrace_graph_notrace_hash;
>  
>  static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace)
>  {
>  	unsigned long addr = trace->func;
>  	int ret = 0;
> +	struct ftrace_hash *hash;
>  
>  	preempt_disable_notrace();
>  
> -	if (ftrace_hash_empty(ftrace_graph_hash)) {
> +	hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible());

Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>

BTW I think set_ftrace_early_graph() should use rcu_assign_pointer() so that
the early writes to the hash are release-barrier'ed before the global pointer
is updated. I will send a patch for that.

thanks,

 - Joel


> +
> +	if (ftrace_hash_empty(hash)) {
>  		ret = 1;
>  		goto out;
>  	}
>  
> -	if (ftrace_lookup_ip(ftrace_graph_hash, addr)) {
> +	if (ftrace_lookup_ip(hash, addr)) {
>  
>  		/*
>  		 * This needs to be cleared on the return functions
> -- 
> 2.24.1
> 
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees

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

end of thread, other threads:[~2020-02-05 22:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-01  7:27 [Linux-kernel-mentees] [PATCH] tracing: Annotate ftrace_graph_hash pointer with __rcu Amol Grover
2020-02-03 16:33 ` Joel Fernandes
2020-02-04 10:02   ` Steven Rostedt
2020-02-05  1:01   ` Steven Rostedt
2020-02-05  5:26     ` Amol Grover
2020-02-05 13:11     ` Paul E. McKenney
2020-02-05 13:14       ` Steven Rostedt
2020-02-05 13:19         ` Steven Rostedt
2020-02-05 13:29           ` Paul E. McKenney
2020-02-05 22:06 ` Joel Fernandes

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