From: Steven Rostedt <rostedt@goodmis.org>
To: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: linux-kernel@vger.kernel.org,
Michael Jeanson <mjeanson@efficios.com>,
Masami Hiramatsu <mhiramat@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Alexei Starovoitov <ast@kernel.org>, Yonghong Song <yhs@fb.com>,
"Paul E . McKenney" <paulmck@kernel.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Namhyung Kim <namhyung@kernel.org>,
Andrii Nakryiko <andrii.nakryiko@gmail.com>,
bpf@vger.kernel.org, Joel Fernandes <joel@joelfernandes.org>,
Jordan Rife <jrife@google.com>
Subject: Re: [RFC PATCH v3 2/3] tracing: Introduce tracepoint_is_syscall()
Date: Sat, 26 Oct 2024 20:08:40 -0400 [thread overview]
Message-ID: <20241026200840.17171eb2@rorschach.local.home> (raw)
In-Reply-To: <20241026154629.593041-2-mathieu.desnoyers@efficios.com>
On Sat, 26 Oct 2024 11:46:28 -0400
Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote:
> Introduce a "syscall" flag within the extended structure to know whether
> a tracepoint needs rcu tasks trace grace period before reclaim.
> This can be queried using tracepoint_is_syscall().
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
> Cc: Michael Jeanson <mjeanson@efficios.com>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: Masami Hiramatsu <mhiramat@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Alexei Starovoitov <ast@kernel.org>
> Cc: Yonghong Song <yhs@fb.com>
> Cc: Paul E. McKenney <paulmck@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Mark Rutland <mark.rutland@arm.com>
> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com>
> Cc: bpf@vger.kernel.org
> Cc: Joel Fernandes <joel@joelfernandes.org>
> Cc: Jordan Rife <jrife@google.com>
> ---
> include/linux/tracepoint-defs.h | 2 ++
> include/linux/tracepoint.h | 24 ++++++++++++++++++++++++
> include/trace/define_trace.h | 2 +-
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/tracepoint-defs.h b/include/linux/tracepoint-defs.h
> index 967c08d9da84..53119e074c87 100644
> --- a/include/linux/tracepoint-defs.h
> +++ b/include/linux/tracepoint-defs.h
> @@ -32,6 +32,8 @@ struct tracepoint_func {
> struct tracepoint_ext {
> int (*regfunc)(void);
> void (*unregfunc)(void);
> + /* Flags. */
> + unsigned int syscall:1;
I wonder if we should call it "sleepable" instead? For this patch set
do we really care if it's a system call or not? It's really if the
tracepoint is sleepable or not that's the issue. System calls are just
one user of it, there may be more in the future, and the changes to BPF
will still be needed.
Other than that, I think this could work.
-- Steve
> };
>
> struct tracepoint {
> diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
> index 83dc24ee8b13..93e70bc64533 100644
> --- a/include/linux/tracepoint.h
> +++ b/include/linux/tracepoint.h
> @@ -104,6 +104,12 @@ void for_each_tracepoint_in_module(struct module *mod,
> * tracepoint_synchronize_unregister must be called between the last tracepoint
> * probe unregistration and the end of module exit to make sure there is no
> * caller executing a probe when it is freed.
> + *
> + * An alternative is to use the following for batch reclaim associated
> + * with a given tracepoint:
> + *
> + * - tracepoint_is_syscall() == false: call_rcu()
> + * - tracepoint_is_syscall() == true: call_rcu_tasks_trace()
> */
> #ifdef CONFIG_TRACEPOINTS
> static inline void tracepoint_synchronize_unregister(void)
> @@ -111,9 +117,17 @@ static inline void tracepoint_synchronize_unregister(void)
> synchronize_rcu_tasks_trace();
> synchronize_rcu();
> }
> +static inline bool tracepoint_is_syscall(struct tracepoint *tp)
> +{
> + return tp->ext && tp->ext->syscall;
> +}
> #else
> static inline void tracepoint_synchronize_unregister(void)
> { }
> +static inline bool tracepoint_is_syscall(struct tracepoint *tp)
> +{
> + return false;
> +}
> #endif
>
> #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
> @@ -345,6 +359,15 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
> struct tracepoint_ext __tracepoint_ext_##_name = { \
> .regfunc = _reg, \
> .unregfunc = _unreg, \
> + .syscall = false, \
> + }; \
> + __DEFINE_TRACE_EXT(_name, &__tracepoint_ext_##_name, PARAMS(_proto), PARAMS(_args));
> +
> +#define DEFINE_TRACE_SYSCALL(_name, _reg, _unreg, _proto, _args) \
> + struct tracepoint_ext __tracepoint_ext_##_name = { \
> + .regfunc = _reg, \
> + .unregfunc = _unreg, \
> + .syscall = true, \
> }; \
> __DEFINE_TRACE_EXT(_name, &__tracepoint_ext_##_name, PARAMS(_proto), PARAMS(_args));
>
> @@ -389,6 +412,7 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
> #define __DECLARE_TRACE_SYSCALL __DECLARE_TRACE
>
> #define DEFINE_TRACE_FN(name, reg, unreg, proto, args)
> +#define DEFINE_TRACE_SYSCALL(name, reg, unreg, proto, args)
> #define DEFINE_TRACE(name, proto, args)
> #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
> #define EXPORT_TRACEPOINT_SYMBOL(name)
> diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h
> index ff5fa17a6259..63fea2218afa 100644
> --- a/include/trace/define_trace.h
> +++ b/include/trace/define_trace.h
> @@ -48,7 +48,7 @@
>
> #undef TRACE_EVENT_SYSCALL
> #define TRACE_EVENT_SYSCALL(name, proto, args, struct, assign, print, reg, unreg) \
> - DEFINE_TRACE_FN(name, reg, unreg, PARAMS(proto), PARAMS(args))
> + DEFINE_TRACE_SYSCALL(name, reg, unreg, PARAMS(proto), PARAMS(args))
>
> #undef TRACE_EVENT_NOP
> #define TRACE_EVENT_NOP(name, proto, args, struct, assign, print)
next prev parent reply other threads:[~2024-10-27 0:08 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-26 15:46 [RFC PATCH v3 1/3] tracing: Introduce tracepoint extended structure Mathieu Desnoyers
2024-10-26 15:46 ` [RFC PATCH v3 2/3] tracing: Introduce tracepoint_is_syscall() Mathieu Desnoyers
2024-10-27 0:08 ` Steven Rostedt [this message]
2024-10-27 12:30 ` Mathieu Desnoyers
2024-10-28 5:06 ` Steven Rostedt
2024-10-28 13:35 ` Mathieu Desnoyers
2024-10-27 14:19 ` Masami Hiramatsu
2024-10-28 1:23 ` Andrii Nakryiko
2024-10-28 13:36 ` Mathieu Desnoyers
2024-10-26 15:46 ` [RFC PATCH v3 3/3] tracing: Fix syscall tracepoint use-after-free Mathieu Desnoyers
2024-10-28 1:22 ` Andrii Nakryiko
2024-10-28 19:19 ` Mathieu Desnoyers
2024-10-31 15:43 ` Mathieu Desnoyers
2024-10-31 16:35 ` Andrii Nakryiko
2024-10-28 1:22 ` [RFC PATCH v3 1/3] tracing: Introduce tracepoint extended structure Andrii Nakryiko
2024-10-28 19:13 ` Mathieu Desnoyers
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=20241026200840.17171eb2@rorschach.local.home \
--to=rostedt@goodmis.org \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=andrii.nakryiko@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=joel@joelfernandes.org \
--cc=jrife@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=mjeanson@efficios.com \
--cc=namhyung@kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=yhs@fb.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox