Commit f1ed7c74 authored by Steven Rostedt (Red Hat)'s avatar Steven Rostedt (Red Hat) Committed by Steven Rostedt

ftrace: Do not run selftest if command line parameter is set

If the kernel command line ftrace filter parameters are set
(ftrace_filter or ftrace_notrace), force the function self test to
pass, with a warning why it was forced.

If the user adds a filter to the kernel command line, it is assumed
that they know what they are doing, and the self test should just not
run instead of failing (which disables function tracing) or clearing
the filter, as that will probably annoy the user.

If the user wants the selftest to run, the message will tell them why
it did not.
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent cf6735a4
...@@ -3537,8 +3537,12 @@ EXPORT_SYMBOL_GPL(ftrace_set_global_notrace); ...@@ -3537,8 +3537,12 @@ EXPORT_SYMBOL_GPL(ftrace_set_global_notrace);
static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata; static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata;
static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata; static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata;
/* Used by function selftest to not test if filter is set */
bool ftrace_filter_param __initdata;
static int __init set_ftrace_notrace(char *str) static int __init set_ftrace_notrace(char *str)
{ {
ftrace_filter_param = true;
strlcpy(ftrace_notrace_buf, str, FTRACE_FILTER_SIZE); strlcpy(ftrace_notrace_buf, str, FTRACE_FILTER_SIZE);
return 1; return 1;
} }
...@@ -3546,6 +3550,7 @@ __setup("ftrace_notrace=", set_ftrace_notrace); ...@@ -3546,6 +3550,7 @@ __setup("ftrace_notrace=", set_ftrace_notrace);
static int __init set_ftrace_filter(char *str) static int __init set_ftrace_filter(char *str)
{ {
ftrace_filter_param = true;
strlcpy(ftrace_filter_buf, str, FTRACE_FILTER_SIZE); strlcpy(ftrace_filter_buf, str, FTRACE_FILTER_SIZE);
return 1; return 1;
} }
......
...@@ -776,6 +776,7 @@ print_graph_function_flags(struct trace_iterator *iter, u32 flags) ...@@ -776,6 +776,7 @@ print_graph_function_flags(struct trace_iterator *iter, u32 flags)
extern struct list_head ftrace_pids; extern struct list_head ftrace_pids;
#ifdef CONFIG_FUNCTION_TRACER #ifdef CONFIG_FUNCTION_TRACER
extern bool ftrace_filter_param __initdata;
static inline int ftrace_trace_task(struct task_struct *task) static inline int ftrace_trace_task(struct task_struct *task)
{ {
if (list_empty(&ftrace_pids)) if (list_empty(&ftrace_pids))
......
...@@ -640,13 +640,20 @@ trace_selftest_function_regs(void) ...@@ -640,13 +640,20 @@ trace_selftest_function_regs(void)
* Enable ftrace, sleep 1/10 second, and then read the trace * Enable ftrace, sleep 1/10 second, and then read the trace
* buffer to see if all is in order. * buffer to see if all is in order.
*/ */
int __init int
trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr) trace_selftest_startup_function(struct tracer *trace, struct trace_array *tr)
{ {
int save_ftrace_enabled = ftrace_enabled; int save_ftrace_enabled = ftrace_enabled;
unsigned long count; unsigned long count;
int ret; int ret;
#ifdef CONFIG_DYNAMIC_FTRACE
if (ftrace_filter_param) {
printk(KERN_CONT " ... kernel command line filter set: force PASS ... ");
return 0;
}
#endif
/* make sure msleep has been recorded */ /* make sure msleep has been recorded */
msleep(1); msleep(1);
...@@ -727,13 +734,20 @@ static int trace_graph_entry_watchdog(struct ftrace_graph_ent *trace) ...@@ -727,13 +734,20 @@ static int trace_graph_entry_watchdog(struct ftrace_graph_ent *trace)
* Pretty much the same than for the function tracer from which the selftest * Pretty much the same than for the function tracer from which the selftest
* has been borrowed. * has been borrowed.
*/ */
int __init int
trace_selftest_startup_function_graph(struct tracer *trace, trace_selftest_startup_function_graph(struct tracer *trace,
struct trace_array *tr) struct trace_array *tr)
{ {
int ret; int ret;
unsigned long count; unsigned long count;
#ifdef CONFIG_DYNAMIC_FTRACE
if (ftrace_filter_param) {
printk(KERN_CONT " ... kernel command line filter set: force PASS ... ");
return 0;
}
#endif
/* /*
* Simulate the init() callback but we attach a watchdog callback * Simulate the init() callback but we attach a watchdog callback
* to detect and recover from possible hangs * to detect and recover from possible hangs
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment