diff options
| author | Tejun Heo <tj@kernel.org> | 2011-11-23 11:49:49 -0500 |
|---|---|---|
| committer | Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com> | 2011-12-12 08:07:10 -0500 |
| commit | 9ebf37d7796f50639a449780251b1805baaf054e (patch) | |
| tree | 8e85a69f892a5010d2dee761c1f5a8d07fcf0a82 /kernel | |
| parent | 40908090e112c0c2255bf76ab9469bf44965cda8 (diff) | |
trace_events_filter: Use rcu_assign_pointer() when setting ftrace_event_call->filter
BugLink: http://bugs.launchpad.net/bugs/902312
commit d3d9acf646679c1981032b0985b386d12fccc60c upstream.
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>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
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 256764ecccd..bd3c6369f80 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -1766,7 +1766,7 @@ static int replace_system_preds(struct event_subsystem *system, | |||
| 1766 | * replace the filter for the call. | 1766 | * replace the filter for the call. |
| 1767 | */ | 1767 | */ |
| 1768 | filter = call->filter; | 1768 | filter = call->filter; |
| 1769 | call->filter = filter_item->filter; | 1769 | rcu_assign_pointer(call->filter, filter_item->filter); |
| 1770 | filter_item->filter = filter; | 1770 | filter_item->filter = filter; |
| 1771 | 1771 | ||
| 1772 | fail = false; | 1772 | fail = false; |
| @@ -1821,7 +1821,7 @@ int apply_event_filter(struct ftrace_event_call *call, char *filter_string) | |||
| 1821 | filter = call->filter; | 1821 | filter = call->filter; |
| 1822 | if (!filter) | 1822 | if (!filter) |
| 1823 | goto out_unlock; | 1823 | goto out_unlock; |
| 1824 | call->filter = NULL; | 1824 | RCU_INIT_POINTER(call->filter, NULL); |
| 1825 | /* Make sure the filter is not being used */ | 1825 | /* Make sure the filter is not being used */ |
| 1826 | synchronize_sched(); | 1826 | synchronize_sched(); |
| 1827 | __free_filter(filter); | 1827 | __free_filter(filter); |
| @@ -1862,7 +1862,7 @@ out: | |||
| 1862 | * string | 1862 | * string |
| 1863 | */ | 1863 | */ |
| 1864 | tmp = call->filter; | 1864 | tmp = call->filter; |
| 1865 | call->filter = filter; | 1865 | rcu_assign_pointer(call->filter, filter); |
| 1866 | if (tmp) { | 1866 | if (tmp) { |
| 1867 | /* Make sure the call is done with the filter */ | 1867 | /* Make sure the call is done with the filter */ |
| 1868 | synchronize_sched(); | 1868 | synchronize_sched(); |
