diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-02-13 20:53:42 -0500 |
---|---|---|
committer | Steven Rostedt <srostedt@redhat.com> | 2009-02-16 17:03:49 -0500 |
commit | e68746a271eb3393a2183840be9e903caddf765b (patch) | |
tree | 106ea87792837ccee1476687d9f9a067f96488a9 /kernel/trace/ftrace.c | |
parent | 64e7c440618998fd69eee6ab490b042d12248021 (diff) |
ftrace: enable filtering only when a function is filtered on
Impact: fix to prevent empty set_ftrace_filter and no ftrace output
The function filter is used to only trace a given set of functions.
The filter is enabled when a function name is echoed into the
set_ftrace_filter file. But if the name has a typo and the function
is not found, the filter is enabled, but no function is listed.
This makes a confusing situation where set_ftrace_filter is empty
but no functions ever get enabled for tracing.
For example:
# cat /debug/tracing/set_ftrace_filter
#### all functions enabled ####
# echo bad_name > set_ftrace_filter
# cat /debug/tracing/set_ftrace_filter
# echo function > current_tracer
# cat trace
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
This patch changes that to only enable filtering if a function
is set to be filtered on. Now, the filter is not enabled if
a bad name is echoed into set_ftrace_filter.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 9e60ae423af9..340f88b68d9e 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1153,8 +1153,6 @@ static void ftrace_match_records(char *buff, int len, int enable) | |||
1153 | 1153 | ||
1154 | /* should not be called from interrupt context */ | 1154 | /* should not be called from interrupt context */ |
1155 | spin_lock(&ftrace_lock); | 1155 | spin_lock(&ftrace_lock); |
1156 | if (enable) | ||
1157 | ftrace_filtered = 1; | ||
1158 | do_for_each_ftrace_rec(pg, rec) { | 1156 | do_for_each_ftrace_rec(pg, rec) { |
1159 | 1157 | ||
1160 | if (rec->flags & FTRACE_FL_FAILED) | 1158 | if (rec->flags & FTRACE_FL_FAILED) |
@@ -1166,7 +1164,12 @@ static void ftrace_match_records(char *buff, int len, int enable) | |||
1166 | else | 1164 | else |
1167 | rec->flags |= flag; | 1165 | rec->flags |= flag; |
1168 | } | 1166 | } |
1169 | 1167 | /* | |
1168 | * Only enable filtering if we have a function that | ||
1169 | * is filtered on. | ||
1170 | */ | ||
1171 | if (enable && (rec->flags & FTRACE_FL_FILTER)) | ||
1172 | ftrace_filtered = 1; | ||
1170 | } while_for_each_ftrace_rec(); | 1173 | } while_for_each_ftrace_rec(); |
1171 | spin_unlock(&ftrace_lock); | 1174 | spin_unlock(&ftrace_lock); |
1172 | } | 1175 | } |
@@ -1217,9 +1220,6 @@ static void ftrace_match_module_records(char *buff, char *mod, int enable) | |||
1217 | 1220 | ||
1218 | /* should not be called from interrupt context */ | 1221 | /* should not be called from interrupt context */ |
1219 | spin_lock(&ftrace_lock); | 1222 | spin_lock(&ftrace_lock); |
1220 | if (enable) | ||
1221 | ftrace_filtered = 1; | ||
1222 | |||
1223 | do_for_each_ftrace_rec(pg, rec) { | 1223 | do_for_each_ftrace_rec(pg, rec) { |
1224 | 1224 | ||
1225 | if (rec->flags & FTRACE_FL_FAILED) | 1225 | if (rec->flags & FTRACE_FL_FAILED) |
@@ -1232,6 +1232,8 @@ static void ftrace_match_module_records(char *buff, char *mod, int enable) | |||
1232 | else | 1232 | else |
1233 | rec->flags |= flag; | 1233 | rec->flags |= flag; |
1234 | } | 1234 | } |
1235 | if (enable && (rec->flags & FTRACE_FL_FILTER)) | ||
1236 | ftrace_filtered = 1; | ||
1235 | 1237 | ||
1236 | } while_for_each_ftrace_rec(); | 1238 | } while_for_each_ftrace_rec(); |
1237 | spin_unlock(&ftrace_lock); | 1239 | spin_unlock(&ftrace_lock); |