diff options
-rw-r--r-- | kernel/trace/trace_events.c | 8 | ||||
-rw-r--r-- | kernel/trace/trace_events_filter.c | 15 | ||||
-rw-r--r-- | kernel/trace/trace_events_hist.c | 2 | ||||
-rw-r--r-- | kernel/trace/trace_events_trigger.c | 6 |
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 | ||