Messages in this thread | | | Date | Wed, 8 Jan 2014 17:30:14 -0800 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH 2/2] tracing: Fix rcu handling of event_trigger_data filter field |
| |
On Sat, Dec 21, 2013 at 10:08:01PM -0500, Steven Rostedt wrote: > From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> > > The filter field of the event_trigger_data structure is protected under > RCU sched locks. It was not annotated as such, and after doing so, > sparse pointed out several locations that required fix ups. > > Reported-by: kbuild test robot <fengguang.wu@intel.com> > Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Looks good to me!
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> --- > kernel/trace/trace.h | 2 +- > kernel/trace/trace_events_trigger.c | 8 +++++--- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h > index 0380cab..02b592f 100644 > --- a/kernel/trace/trace.h > +++ b/kernel/trace/trace.h > @@ -1057,7 +1057,7 @@ struct event_trigger_data { > int ref; > struct event_trigger_ops *ops; > struct event_command *cmd_ops; > - struct event_filter *filter; > + struct event_filter __rcu *filter; > char *filter_str; > void *private_data; > struct list_head list; > diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c > index 12ac8a5..f6dd115 100644 > --- a/kernel/trace/trace_events_trigger.c > +++ b/kernel/trace/trace_events_trigger.c > @@ -67,6 +67,7 @@ event_triggers_call(struct ftrace_event_file *file, void *rec) > { > struct event_trigger_data *data; > enum event_trigger_type tt = ETT_NONE; > + struct event_filter *filter; > > if (list_empty(&file->triggers)) > return tt; > @@ -76,7 +77,8 @@ event_triggers_call(struct ftrace_event_file *file, void *rec) > data->ops->func(data); > continue; > } > - if (data->filter && !filter_match_preds(data->filter, rec)) > + filter = rcu_dereference(data->filter); > + if (filter && !filter_match_preds(filter, rec)) > continue; > if (data->cmd_ops->post_trigger) { > tt |= data->cmd_ops->trigger_type; > @@ -703,7 +705,7 @@ static int set_trigger_filter(char *filter_str, > if (ret) > goto out; > assign: > - tmp = data->filter; > + tmp = rcu_access_pointer(data->filter); > > rcu_assign_pointer(data->filter, filter); > > @@ -719,7 +721,7 @@ static int set_trigger_filter(char *filter_str, > if (filter_str) { > data->filter_str = kstrdup(filter_str, GFP_KERNEL); > if (!data->filter_str) { > - free_event_filter(data->filter); > + free_event_filter(rcu_access_pointer(data->filter)); > data->filter = NULL; > ret = -ENOMEM; > } > -- > 1.8.4.3 > >
| |