From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Andrew Morton <akpm@linux-foundation.org>,
Alexei Starovoitov <alexei.starovoitov@gmail.com>,
Florent Revest <revest@chromium.org>,
Martin KaFai Lau <martin.lau@linux.dev>,
bpf <bpf@vger.kernel.org>, Sven Schnelle <svens@linux.ibm.com>,
Alexei Starovoitov <ast@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Alan Maguire <alan.maguire@oracle.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>, Guo Ren <guoren@kernel.org>
Subject: [for-next][PATCH 13/27] function_graph: Add pid tracing back to function graph tracer
Date: Tue, 04 Jun 2024 10:41:16 -0400 [thread overview]
Message-ID: <20240604144216.065828821@goodmis.org> (raw)
In-Reply-To: 20240604144103.293353991@goodmis.org
From: "Steven Rostedt (Google)" <rostedt@goodmis.org>
Now that the function_graph has a main callback that handles the function
graph subops tracing, it no longer honors the pid filtering of ftrace. Add
back this logic in the function_graph code to update the gops callback for
the entry function to test if it should trace the current task or not.
Link: https://lore.kernel.org/linux-trace-kernel/20240603190822.991720703@goodmis.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Florent Revest <revest@chromium.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: bpf <bpf@vger.kernel.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Alan Maguire <alan.maguire@oracle.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Guo Ren <guoren@kernel.org>
Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
include/linux/ftrace.h | 2 ++
kernel/trace/fgraph.c | 40 ++++++++++++++++++++++++++++++++++
kernel/trace/ftrace.c | 5 +++--
kernel/trace/ftrace_internal.h | 2 ++
4 files changed, 47 insertions(+), 2 deletions(-)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 8f865689e868..e31ec8516de1 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -1040,6 +1040,7 @@ typedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *,
struct fgraph_ops *); /* entry */
extern int ftrace_graph_entry_stub(struct ftrace_graph_ent *trace, struct fgraph_ops *gops);
+bool ftrace_pids_enabled(struct ftrace_ops *ops);
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
@@ -1048,6 +1049,7 @@ struct fgraph_ops {
trace_func_graph_ret_t retfunc;
struct ftrace_ops ops; /* for the hash lists */
void *private;
+ trace_func_graph_ent_t saved_func;
int idx;
};
diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c
index 3ef6db53c0bf..30bed20c655f 100644
--- a/kernel/trace/fgraph.c
+++ b/kernel/trace/fgraph.c
@@ -854,6 +854,41 @@ void ftrace_graph_exit_task(struct task_struct *t)
kfree(ret_stack);
}
+static int fgraph_pid_func(struct ftrace_graph_ent *trace,
+ struct fgraph_ops *gops)
+{
+ struct trace_array *tr = gops->ops.private;
+ int pid;
+
+ if (tr) {
+ pid = this_cpu_read(tr->array_buffer.data->ftrace_ignore_pid);
+ if (pid == FTRACE_PID_IGNORE)
+ return 0;
+ if (pid != FTRACE_PID_TRACE &&
+ pid != current->pid)
+ return 0;
+ }
+
+ return gops->saved_func(trace, gops);
+}
+
+void fgraph_update_pid_func(void)
+{
+ struct fgraph_ops *gops;
+ struct ftrace_ops *op;
+
+ if (!(graph_ops.flags & FTRACE_OPS_FL_INITIALIZED))
+ return;
+
+ list_for_each_entry(op, &graph_ops.subop_list, list) {
+ if (op->flags & FTRACE_OPS_FL_PID) {
+ gops = container_of(op, struct fgraph_ops, ops);
+ gops->entryfunc = ftrace_pids_enabled(op) ?
+ fgraph_pid_func : gops->saved_func;
+ }
+ }
+}
+
/* Allocate a return stack for each task */
static int start_graph_tracing(void)
{
@@ -931,11 +966,15 @@ int register_ftrace_graph(struct fgraph_ops *gops)
command = FTRACE_START_FUNC_RET;
}
+ /* Always save the function, and reset at unregistering */
+ gops->saved_func = gops->entryfunc;
+
ret = ftrace_startup_subops(&graph_ops, &gops->ops, command);
error:
if (ret) {
fgraph_array[i] = &fgraph_stub;
ftrace_graph_active--;
+ gops->saved_func = NULL;
}
out:
mutex_unlock(&ftrace_lock);
@@ -979,5 +1018,6 @@ void unregister_ftrace_graph(struct fgraph_ops *gops)
unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL);
}
out:
+ gops->saved_func = NULL;
mutex_unlock(&ftrace_lock);
}
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 58e0f4bc0241..da7e6abf48b4 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -100,7 +100,7 @@ struct ftrace_ops *function_trace_op __read_mostly = &ftrace_list_end;
/* What to set function_trace_op to */
static struct ftrace_ops *set_function_trace_op;
-static bool ftrace_pids_enabled(struct ftrace_ops *ops)
+bool ftrace_pids_enabled(struct ftrace_ops *ops)
{
struct trace_array *tr;
@@ -402,10 +402,11 @@ static void ftrace_update_pid_func(void)
if (op->flags & FTRACE_OPS_FL_PID) {
op->func = ftrace_pids_enabled(op) ?
ftrace_pid_func : op->saved_func;
- ftrace_update_trampoline(op);
}
} while_for_each_ftrace_op(op);
+ fgraph_update_pid_func();
+
update_ftrace_function();
}
diff --git a/kernel/trace/ftrace_internal.h b/kernel/trace/ftrace_internal.h
index cdfd12c44ab4..bfba10c2fcf1 100644
--- a/kernel/trace/ftrace_internal.h
+++ b/kernel/trace/ftrace_internal.h
@@ -43,8 +43,10 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs)
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
extern int ftrace_graph_active;
+extern void fgraph_update_pid_func(void);
#else /* !CONFIG_FUNCTION_GRAPH_TRACER */
# define ftrace_graph_active 0
+static inline void fgraph_update_pid_func(void) {}
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
#else /* !CONFIG_FUNCTION_TRACER */
--
2.43.0
next prev parent reply other threads:[~2024-06-04 14:42 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-04 14:41 [for-next][PATCH 00/27] function_graph: Allow multiple users for v6.11 Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 01/27] function_graph: Convert ret_stack to a series of longs Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 02/27] fgraph: Use BUILD_BUG_ON() to make sure we have structures divisible by long Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 03/27] function_graph: Add an array structure that will allow multiple callbacks Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 04/27] function_graph: Allow multiple users to attach to function graph Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 05/27] function_graph: Handle tail calls for stack unwinding Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 06/27] function_graph: Remove logic around ftrace_graph_entry and return Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 07/27] ftrace/function_graph: Pass fgraph_ops to function graph callbacks Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 08/27] ftrace: Allow function_graph tracer to be enabled in instances Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 09/27] ftrace: Allow ftrace startup flags to exist without dynamic ftrace Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 10/27] ftrace: Add subops logic to allow one ops to manage many Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 11/27] ftrace: Allow subops filtering to be modified Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 12/27] function_graph: Have the instances use their own ftrace_ops for filtering Steven Rostedt
2024-06-04 14:41 ` Steven Rostedt [this message]
2024-06-04 14:41 ` [for-next][PATCH 14/27] function_graph: Use a simple LRU for fgraph_array index number Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 15/27] function_graph: Add "task variables" per task for fgraph_ops Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 16/27] function_graph: Move set_graph_function tests to shadow stack global var Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 17/27] function_graph: Move graph depth stored data " Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 18/27] function_graph: Move graph notrace bit " Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 19/27] function_graph: Implement fgraph_reserve_data() and fgraph_retrieve_data() Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 20/27] function_graph: Add selftest for passing local variables Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 21/27] ftrace: Add multiple fgraph storage selftest Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 22/27] function_graph: Use for_each_set_bit() in __ftrace_return_to_handler() Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 23/27] function_graph: Use bitmask to loop on fgraph entry Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 24/27] function_graph: Use static_call and branch to optimize entry function Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 25/27] function_graph: Use static_call and branch to optimize return function Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 26/27] selftests/ftrace: Add function_graph tracer to func-filter-pid test Steven Rostedt
2024-06-04 14:41 ` [for-next][PATCH 27/27] selftests/ftrace: Add fgraph-multi.tc test Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240604144216.065828821@goodmis.org \
--to=rostedt@goodmis.org \
--cc=acme@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alan.maguire@oracle.com \
--cc=alexei.starovoitov@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=guoren@kernel.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=peterz@infradead.org \
--cc=revest@chromium.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.