| From f291da9178d6e09b20d1b218c25ab0c753cbec7a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 24 Jul 2020 20:50:48 -0400 |
| Subject: ftrace: Fix ftrace_trace_task return value |
| |
| From: Josef Bacik <josef@toxicpanda.com> |
| |
| [ Upstream commit c58b6b0372de0d4cd0536d6585addd1b36b151ae ] |
| |
| I was attempting to use pid filtering with function_graph, but it wasn't |
| allowing anything to make it through. Turns out ftrace_trace_task |
| returns false if ftrace_ignore_pid is not-empty, which isn't correct |
| anymore. We're now setting it to FTRACE_PID_IGNORE if we need to ignore |
| that pid, otherwise it's set to the pid (which is weird considering the |
| name) or to FTRACE_PID_TRACE. Fix the check to check for != |
| FTRACE_PID_IGNORE. With this we can now use function_graph with pid |
| filtering. |
| |
| Link: https://lkml.kernel.org/r/20200725005048.1790-1-josef@toxicpanda.com |
| |
| Fixes: 717e3f5ebc82 ("ftrace: Make function trace pid filtering a bit more exact") |
| Signed-off-by: Josef Bacik <josef@toxicpanda.com> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/trace/ftrace.c | 3 --- |
| kernel/trace/trace.h | 7 ++++++- |
| 2 files changed, 6 insertions(+), 4 deletions(-) |
| |
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
| index bd030b1b95148..baa7c050dc7bc 100644 |
| --- a/kernel/trace/ftrace.c |
| +++ b/kernel/trace/ftrace.c |
| @@ -139,9 +139,6 @@ static inline void ftrace_ops_init(struct ftrace_ops *ops) |
| #endif |
| } |
| |
| -#define FTRACE_PID_IGNORE -1 |
| -#define FTRACE_PID_TRACE -2 |
| - |
| static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip, |
| struct ftrace_ops *op, struct pt_regs *regs) |
| { |
| diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h |
| index 09298ce5f805b..6b9acbf95cbc9 100644 |
| --- a/kernel/trace/trace.h |
| +++ b/kernel/trace/trace.h |
| @@ -1103,6 +1103,10 @@ print_graph_function_flags(struct trace_iterator *iter, u32 flags) |
| extern struct list_head ftrace_pids; |
| |
| #ifdef CONFIG_FUNCTION_TRACER |
| + |
| +#define FTRACE_PID_IGNORE -1 |
| +#define FTRACE_PID_TRACE -2 |
| + |
| struct ftrace_func_command { |
| struct list_head list; |
| char *name; |
| @@ -1114,7 +1118,8 @@ struct ftrace_func_command { |
| extern bool ftrace_filter_param __initdata; |
| static inline int ftrace_trace_task(struct trace_array *tr) |
| { |
| - return !this_cpu_read(tr->array_buffer.data->ftrace_ignore_pid); |
| + return this_cpu_read(tr->array_buffer.data->ftrace_ignore_pid) != |
| + FTRACE_PID_IGNORE; |
| } |
| extern int ftrace_is_dead(void); |
| int ftrace_create_function_files(struct trace_array *tr, |
| -- |
| 2.25.1 |
| |