aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/trace_events_filter.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 54a125c8467a..c2ef5a5f21da 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -842,17 +842,14 @@ static inline void __remove_filter(struct ftrace_event_file *file)
842 remove_filter_string(file->filter); 842 remove_filter_string(file->filter);
843} 843}
844 844
845static void filter_free_subsystem_preds(struct event_subsystem *system, 845static void filter_free_subsystem_preds(struct ftrace_subsystem_dir *dir,
846 struct trace_array *tr) 846 struct trace_array *tr)
847{ 847{
848 struct ftrace_event_file *file; 848 struct ftrace_event_file *file;
849 struct ftrace_event_call *call;
850 849
851 list_for_each_entry(file, &tr->events, list) { 850 list_for_each_entry(file, &tr->events, list) {
852 call = file->event_call; 851 if (file->system != dir)
853 if (strcmp(call->class->system, system->name) != 0)
854 continue; 852 continue;
855
856 __remove_filter(file); 853 __remove_filter(file);
857 } 854 }
858} 855}
@@ -870,15 +867,13 @@ static inline void __free_subsystem_filter(struct ftrace_event_file *file)
870 } 867 }
871} 868}
872 869
873static void filter_free_subsystem_filters(struct event_subsystem *system, 870static void filter_free_subsystem_filters(struct ftrace_subsystem_dir *dir,
874 struct trace_array *tr) 871 struct trace_array *tr)
875{ 872{
876 struct ftrace_event_file *file; 873 struct ftrace_event_file *file;
877 struct ftrace_event_call *call;
878 874
879 list_for_each_entry(file, &tr->events, list) { 875 list_for_each_entry(file, &tr->events, list) {
880 call = file->event_call; 876 if (file->system != dir)
881 if (strcmp(call->class->system, system->name) != 0)
882 continue; 877 continue;
883 __free_subsystem_filter(file); 878 __free_subsystem_filter(file);
884 } 879 }
@@ -1724,13 +1719,12 @@ struct filter_list {
1724 struct event_filter *filter; 1719 struct event_filter *filter;
1725}; 1720};
1726 1721
1727static int replace_system_preds(struct event_subsystem *system, 1722static int replace_system_preds(struct ftrace_subsystem_dir *dir,
1728 struct trace_array *tr, 1723 struct trace_array *tr,
1729 struct filter_parse_state *ps, 1724 struct filter_parse_state *ps,
1730 char *filter_string) 1725 char *filter_string)
1731{ 1726{
1732 struct ftrace_event_file *file; 1727 struct ftrace_event_file *file;
1733 struct ftrace_event_call *call;
1734 struct filter_list *filter_item; 1728 struct filter_list *filter_item;
1735 struct filter_list *tmp; 1729 struct filter_list *tmp;
1736 LIST_HEAD(filter_list); 1730 LIST_HEAD(filter_list);
@@ -1738,15 +1732,15 @@ static int replace_system_preds(struct event_subsystem *system,
1738 int err; 1732 int err;
1739 1733
1740 list_for_each_entry(file, &tr->events, list) { 1734 list_for_each_entry(file, &tr->events, list) {
1741 call = file->event_call; 1735 if (file->system != dir)
1742 if (strcmp(call->class->system, system->name) != 0)
1743 continue; 1736 continue;
1744 1737
1745 /* 1738 /*
1746 * Try to see if the filter can be applied 1739 * Try to see if the filter can be applied
1747 * (filter arg is ignored on dry_run) 1740 * (filter arg is ignored on dry_run)
1748 */ 1741 */
1749 err = replace_preds(call, NULL, ps, filter_string, true); 1742 err = replace_preds(file->event_call, NULL, ps,
1743 filter_string, true);
1750 if (err) 1744 if (err)
1751 event_set_no_set_filter_flag(file); 1745 event_set_no_set_filter_flag(file);
1752 else 1746 else
@@ -1756,9 +1750,7 @@ static int replace_system_preds(struct event_subsystem *system,
1756 list_for_each_entry(file, &tr->events, list) { 1750 list_for_each_entry(file, &tr->events, list) {
1757 struct event_filter *filter; 1751 struct event_filter *filter;
1758 1752
1759 call = file->event_call; 1753 if (file->system != dir)
1760
1761 if (strcmp(call->class->system, system->name) != 0)
1762 continue; 1754 continue;
1763 1755
1764 if (event_no_set_filter_flag(file)) 1756 if (event_no_set_filter_flag(file))
@@ -1780,7 +1772,8 @@ static int replace_system_preds(struct event_subsystem *system,
1780 if (err) 1772 if (err)
1781 goto fail_mem; 1773 goto fail_mem;
1782 1774
1783 err = replace_preds(call, filter, ps, filter_string, false); 1775 err = replace_preds(file->event_call, filter, ps,
1776 filter_string, false);
1784 if (err) { 1777 if (err) {
1785 filter_disable(file); 1778 filter_disable(file);
1786 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0); 1779 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
@@ -1928,7 +1921,7 @@ int create_event_filter(struct ftrace_event_call *call,
1928 * Identical to create_filter() except that it creates a subsystem filter 1921 * Identical to create_filter() except that it creates a subsystem filter
1929 * and always remembers @filter_str. 1922 * and always remembers @filter_str.
1930 */ 1923 */
1931static int create_system_filter(struct event_subsystem *system, 1924static int create_system_filter(struct ftrace_subsystem_dir *dir,
1932 struct trace_array *tr, 1925 struct trace_array *tr,
1933 char *filter_str, struct event_filter **filterp) 1926 char *filter_str, struct event_filter **filterp)
1934{ 1927{
@@ -1938,7 +1931,7 @@ static int create_system_filter(struct event_subsystem *system,
1938 1931
1939 err = create_filter_start(filter_str, true, &ps, &filter); 1932 err = create_filter_start(filter_str, true, &ps, &filter);
1940 if (!err) { 1933 if (!err) {
1941 err = replace_system_preds(system, tr, ps, filter_str); 1934 err = replace_system_preds(dir, tr, ps, filter_str);
1942 if (!err) { 1935 if (!err) {
1943 /* System filters just show a default message */ 1936 /* System filters just show a default message */
1944 kfree(filter->filter_string); 1937 kfree(filter->filter_string);
@@ -2022,18 +2015,18 @@ int apply_subsystem_event_filter(struct ftrace_subsystem_dir *dir,
2022 } 2015 }
2023 2016
2024 if (!strcmp(strstrip(filter_string), "0")) { 2017 if (!strcmp(strstrip(filter_string), "0")) {
2025 filter_free_subsystem_preds(system, tr); 2018 filter_free_subsystem_preds(dir, tr);
2026 remove_filter_string(system->filter); 2019 remove_filter_string(system->filter);
2027 filter = system->filter; 2020 filter = system->filter;
2028 system->filter = NULL; 2021 system->filter = NULL;
2029 /* Ensure all filters are no longer used */ 2022 /* Ensure all filters are no longer used */
2030 synchronize_sched(); 2023 synchronize_sched();
2031 filter_free_subsystem_filters(system, tr); 2024 filter_free_subsystem_filters(dir, tr);
2032 __free_filter(filter); 2025 __free_filter(filter);
2033 goto out_unlock; 2026 goto out_unlock;
2034 } 2027 }
2035 2028
2036 err = create_system_filter(system, tr, filter_string, &filter); 2029 err = create_system_filter(dir, tr, filter_string, &filter);
2037 if (filter) { 2030 if (filter) {
2038 /* 2031 /*
2039 * No event actually uses the system filter 2032 * No event actually uses the system filter