aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-11-23 11:49:49 -0500
committerHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>2011-12-12 08:07:10 -0500
commit9ebf37d7796f50639a449780251b1805baaf054e (patch)
tree8e85a69f892a5010d2dee761c1f5a8d07fcf0a82 /kernel
parent40908090e112c0c2255bf76ab9469bf44965cda8 (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.c6
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();