diff options
author | Tejun Heo <tj@kernel.org> | 2011-11-23 11:49:49 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2011-12-01 22:16:47 -0500 |
commit | d3d9acf646679c1981032b0985b386d12fccc60c (patch) | |
tree | 68df9e100ae7304a1384160b5d1b068241f4d1fe /kernel | |
parent | 4a1dba72384193753e44e15d9d05a50be6587271 (diff) |
trace_events_filter: Use rcu_assign_pointer() when setting ftrace_event_call->filter
ftrace_event_call->filter is sched RCU protected but didn't use
rcu_assign_pointer(). Use it.
TODO: Add proper __rcu annotation to call->filter and all its users.
-v2: Use RCU_INIT_POINTER() for %NULL clearing as suggested by Eric.
Link: http://lkml.kernel.org/r/20111123164949.GA29639@google.com
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: stable@kernel.org # (2.6.39+)
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace_events_filter.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 816d3d074979..d6e7926dcd26 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
@@ -1686,7 +1686,7 @@ static int replace_system_preds(struct event_subsystem *system, | |||
1686 | * replace the filter for the call. | 1686 | * replace the filter for the call. |
1687 | */ | 1687 | */ |
1688 | filter = call->filter; | 1688 | filter = call->filter; |
1689 | call->filter = filter_item->filter; | 1689 | rcu_assign_pointer(call->filter, filter_item->filter); |
1690 | filter_item->filter = filter; | 1690 | filter_item->filter = filter; |
1691 | 1691 | ||
1692 | fail = false; | 1692 | fail = false; |
@@ -1741,7 +1741,7 @@ int apply_event_filter(struct ftrace_event_call *call, char *filter_string) | |||
1741 | filter = call->filter; | 1741 | filter = call->filter; |
1742 | if (!filter) | 1742 | if (!filter) |
1743 | goto out_unlock; | 1743 | goto out_unlock; |
1744 | call->filter = NULL; | 1744 | RCU_INIT_POINTER(call->filter, NULL); |
1745 | /* Make sure the filter is not being used */ | 1745 | /* Make sure the filter is not being used */ |
1746 | synchronize_sched(); | 1746 | synchronize_sched(); |
1747 | __free_filter(filter); | 1747 | __free_filter(filter); |
@@ -1782,7 +1782,7 @@ out: | |||
1782 | * string | 1782 | * string |
1783 | */ | 1783 | */ |
1784 | tmp = call->filter; | 1784 | tmp = call->filter; |
1785 | call->filter = filter; | 1785 | rcu_assign_pointer(call->filter, filter); |
1786 | if (tmp) { | 1786 | if (tmp) { |
1787 | /* Make sure the call is done with the filter */ | 1787 | /* Make sure the call is done with the filter */ |
1788 | synchronize_sched(); | 1788 | synchronize_sched(); |