aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace_events.c8
-rw-r--r--kernel/trace/trace_events_filter.c15
-rw-r--r--kernel/trace/trace_events_hist.c2
-rw-r--r--kernel/trace/trace_events_trigger.c6
4 files changed, 17 insertions, 14 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index 7b508ce8ac44..808cf29febe2 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -636,7 +636,7 @@ static void __ftrace_clear_event_pids(struct trace_array *tr)
636 rcu_assign_pointer(tr->filtered_pids, NULL); 636 rcu_assign_pointer(tr->filtered_pids, NULL);
637 637
638 /* Wait till all users are no longer using pid filtering */ 638 /* Wait till all users are no longer using pid filtering */
639 synchronize_sched(); 639 tracepoint_synchronize_unregister();
640 640
641 trace_free_pid_list(pid_list); 641 trace_free_pid_list(pid_list);
642} 642}
@@ -1622,7 +1622,7 @@ ftrace_event_pid_write(struct file *filp, const char __user *ubuf,
1622 } 1622 }
1623 1623
1624 if (filtered_pids) { 1624 if (filtered_pids) {
1625 synchronize_sched(); 1625 tracepoint_synchronize_unregister();
1626 trace_free_pid_list(filtered_pids); 1626 trace_free_pid_list(filtered_pids);
1627 } else if (pid_list) { 1627 } else if (pid_list) {
1628 /* 1628 /*
@@ -3036,8 +3036,8 @@ int event_trace_del_tracer(struct trace_array *tr)
3036 /* Disable any running events */ 3036 /* Disable any running events */
3037 __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0); 3037 __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
3038 3038
3039 /* Access to events are within rcu_read_lock_sched() */ 3039 /* Make sure no more events are being executed */
3040 synchronize_sched(); 3040 tracepoint_synchronize_unregister();
3041 3041
3042 down_write(&trace_event_sem); 3042 down_write(&trace_event_sem);
3043 __trace_remove_event_dirs(tr); 3043 __trace_remove_event_dirs(tr);
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 893a206bcba4..184c7685d5ea 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -899,7 +899,8 @@ int filter_match_preds(struct event_filter *filter, void *rec)
899 if (!filter) 899 if (!filter)
900 return 1; 900 return 1;
901 901
902 prog = rcu_dereference_sched(filter->prog); 902 /* Protected by either SRCU(tracepoint_srcu) or preempt_disable */
903 prog = rcu_dereference_raw(filter->prog);
903 if (!prog) 904 if (!prog)
904 return 1; 905 return 1;
905 906
@@ -1626,10 +1627,10 @@ static int process_system_preds(struct trace_subsystem_dir *dir,
1626 1627
1627 /* 1628 /*
1628 * The calls can still be using the old filters. 1629 * The calls can still be using the old filters.
1629 * Do a synchronize_sched() to ensure all calls are 1630 * Do a synchronize_sched() and to ensure all calls are
1630 * done with them before we free them. 1631 * done with them before we free them.
1631 */ 1632 */
1632 synchronize_sched(); 1633 tracepoint_synchronize_unregister();
1633 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) { 1634 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1634 __free_filter(filter_item->filter); 1635 __free_filter(filter_item->filter);
1635 list_del(&filter_item->list); 1636 list_del(&filter_item->list);
@@ -1648,7 +1649,7 @@ static int process_system_preds(struct trace_subsystem_dir *dir,
1648 kfree(filter); 1649 kfree(filter);
1649 /* If any call succeeded, we still need to sync */ 1650 /* If any call succeeded, we still need to sync */
1650 if (!fail) 1651 if (!fail)
1651 synchronize_sched(); 1652 tracepoint_synchronize_unregister();
1652 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) { 1653 list_for_each_entry_safe(filter_item, tmp, &filter_list, list) {
1653 __free_filter(filter_item->filter); 1654 __free_filter(filter_item->filter);
1654 list_del(&filter_item->list); 1655 list_del(&filter_item->list);
@@ -1790,7 +1791,7 @@ int apply_event_filter(struct trace_event_file *file, char *filter_string)
1790 event_clear_filter(file); 1791 event_clear_filter(file);
1791 1792
1792 /* Make sure the filter is not being used */ 1793 /* Make sure the filter is not being used */
1793 synchronize_sched(); 1794 tracepoint_synchronize_unregister();
1794 __free_filter(filter); 1795 __free_filter(filter);
1795 1796
1796 return 0; 1797 return 0;
@@ -1817,7 +1818,7 @@ int apply_event_filter(struct trace_event_file *file, char *filter_string)
1817 1818
1818 if (tmp) { 1819 if (tmp) {
1819 /* Make sure the call is done with the filter */ 1820 /* Make sure the call is done with the filter */
1820 synchronize_sched(); 1821 tracepoint_synchronize_unregister();
1821 __free_filter(tmp); 1822 __free_filter(tmp);
1822 } 1823 }
1823 } 1824 }
@@ -1847,7 +1848,7 @@ int apply_subsystem_event_filter(struct trace_subsystem_dir *dir,
1847 filter = system->filter; 1848 filter = system->filter;
1848 system->filter = NULL; 1849 system->filter = NULL;
1849 /* Ensure all filters are no longer used */ 1850 /* Ensure all filters are no longer used */
1850 synchronize_sched(); 1851 tracepoint_synchronize_unregister();
1851 filter_free_subsystem_filters(dir, tr); 1852 filter_free_subsystem_filters(dir, tr);
1852 __free_filter(filter); 1853 __free_filter(filter);
1853 goto out_unlock; 1854 goto out_unlock;
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index aae18af94c94..c522b51d9909 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -5141,7 +5141,7 @@ static void hist_clear(struct event_trigger_data *data)
5141 if (data->name) 5141 if (data->name)
5142 pause_named_trigger(data); 5142 pause_named_trigger(data);
5143 5143
5144 synchronize_sched(); 5144 tracepoint_synchronize_unregister();
5145 5145
5146 tracing_map_clear(hist_data->map); 5146 tracing_map_clear(hist_data->map);
5147 5147
diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c
index 58d21fd52932..750044ef15e8 100644
--- a/kernel/trace/trace_events_trigger.c
+++ b/kernel/trace/trace_events_trigger.c
@@ -34,7 +34,9 @@ void trigger_data_free(struct event_trigger_data *data)
34 if (data->cmd_ops->set_filter) 34 if (data->cmd_ops->set_filter)
35 data->cmd_ops->set_filter(NULL, data, NULL); 35 data->cmd_ops->set_filter(NULL, data, NULL);
36 36
37 synchronize_sched(); /* make sure current triggers exit before free */ 37 /* make sure current triggers exit before free */
38 tracepoint_synchronize_unregister();
39
38 kfree(data); 40 kfree(data);
39} 41}
40 42
@@ -752,7 +754,7 @@ int set_trigger_filter(char *filter_str,
752 754
753 if (tmp) { 755 if (tmp) {
754 /* Make sure the call is done with the filter */ 756 /* Make sure the call is done with the filter */
755 synchronize_sched(); 757 tracepoint_synchronize_unregister();
756 free_event_filter(tmp); 758 free_event_filter(tmp);
757 } 759 }
758 760