Skip to content

Commit 404a3ad

Browse files
committed
tracing: Only add filter list when needed
replace_system_preds() creates a filter list to free even when it doesn't really need to have it. Only save filters that require synchronize_sched() in the filter list to free. This will allow the code to be updated a bit easier in the future. Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
1 parent c739970 commit 404a3ad

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

kernel/trace/trace_events_filter.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,6 +1769,7 @@ static int replace_system_preds(struct trace_subsystem_dir *dir,
17691769
{
17701770
struct trace_event_file *file;
17711771
struct filter_list *filter_item;
1772+
struct event_filter *filter = NULL;
17721773
struct filter_list *tmp;
17731774
LIST_HEAD(filter_list);
17741775
bool fail = true;
@@ -1790,24 +1791,16 @@ static int replace_system_preds(struct trace_subsystem_dir *dir,
17901791
}
17911792

17921793
list_for_each_entry(file, &tr->events, list) {
1793-
struct event_filter *filter;
17941794

17951795
if (file->system != dir)
17961796
continue;
17971797

17981798
if (event_no_set_filter_flag(file))
17991799
continue;
18001800

1801-
filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
1802-
if (!filter_item)
1803-
goto fail_mem;
1804-
1805-
list_add_tail(&filter_item->list, &filter_list);
1806-
1807-
filter_item->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
1808-
if (!filter_item->filter)
1801+
filter = kzalloc(sizeof(*filter), GFP_KERNEL);
1802+
if (!filter)
18091803
goto fail_mem;
1810-
filter = filter_item->filter;
18111804

18121805
/* Can only fail on no memory */
18131806
err = replace_filter_string(filter, filter_string);
@@ -1821,13 +1814,20 @@ static int replace_system_preds(struct trace_subsystem_dir *dir,
18211814
append_filter_err(ps, filter);
18221815
} else
18231816
event_set_filtered_flag(file);
1817+
1818+
1819+
filter_item = kzalloc(sizeof(*filter_item), GFP_KERNEL);
1820+
if (!filter_item)
1821+
goto fail_mem;
1822+
1823+
list_add_tail(&filter_item->list, &filter_list);
18241824
/*
18251825
* Regardless of if this returned an error, we still
18261826
* replace the filter for the call.
18271827
*/
1828-
filter = event_filter(file);
1829-
event_set_filter(file, filter_item->filter);
1830-
filter_item->filter = filter;
1828+
filter_item->filter = event_filter(file);
1829+
event_set_filter(file, filter);
1830+
filter = NULL;
18311831

18321832
fail = false;
18331833
}
@@ -1856,6 +1856,7 @@ static int replace_system_preds(struct trace_subsystem_dir *dir,
18561856
parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
18571857
return -EINVAL;
18581858
fail_mem:
1859+
kfree(filter);
18591860
/* If any call succeeded, we still need to sync */
18601861
if (!fail)
18611862
synchronize_sched();

0 commit comments

Comments
 (0)