tracing: Fix rcu handling of event_trigger_data filter field
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> Tested-by: Tom Zanussi <tom.zanussi@linux.intel.com> Acked-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
098c879e1f
commit
d8a30f2034
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue