From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [PATCH 1/2] tracing/boot: Add support for eprobe, fprobe, and tprobe events
Date: Thu, 6 Aug 2026 23:00:42 +0900 [thread overview]
Message-ID: <20260806230042.ab2b9cc1b67c3d888b3f94a4@kernel.org> (raw)
In-Reply-To: <178597842125.123558.2594525097237345437.stgit@devnote2>
On Thu, 6 Aug 2026 10:07:01 +0900
"Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote:
> From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
>
> Boot-time tracing currently supports kprobe-events and synthetic-events
> under per-event configuration options.
>
> Extend boot-time tracing to support newly added dynamic probe types:
> - event probes (eprobe) under the "eprobes" event group
> - function probes (fprobe) under the "fprobes" event group
> - tracepoint probes (tprobe) under the "tracepoints" or "tprobes"
> event group
>
> To support this cleanly, update dyn_event_create() in trace_dynevent.c
> so that passing NULL as the type parameter delegates to
> create_dyn_event(), allowing generic creation of any registered
> dynamic event type from a raw command string.
>
> Update Documentation/trace/boottime-trace.rst accordingly to describe
> the new per-event bootconfig options.
>
> Assisted-by: Antigravity:gemini-3.6-flash
> Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
> ---
> Documentation/trace/boottime-trace.rst | 18 ++++-
> kernel/trace/trace_boot.c | 113 ++++++++++++++++++++++++++++++++
> kernel/trace/trace_dynevent.c | 5 +
> 3 files changed, 133 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/trace/boottime-trace.rst b/Documentation/trace/boottime-trace.rst
> index 651f3a2c01de..2c3c1fedb92c 100644
> --- a/Documentation/trace/boottime-trace.rst
> +++ b/Documentation/trace/boottime-trace.rst
> @@ -121,9 +121,21 @@ ftrace.[instance.INSTANCE.]event.synthetic.EVENT.fields = FIELD[, FIELD2[...]]
> Defines new synthetic event with FIELDs. Each field should be
> "type varname".
>
> -Note that kprobe and synthetic event definitions can be written under
> -instance node, but those are also visible from other instances. So please
> -take care for event name conflict.
> +ftrace.[instance.INSTANCE.]event.eprobes.EVENT.probes = PROBE[, PROBE2[...]]
> + Defines new event probe based on PROBEs. This option is available only
> + for the event which group name is "eprobes".
> +
> +ftrace.[instance.INSTANCE.]event.fprobes.EVENT.probes = PROBE[, PROBE2[...]]
> + Defines new fprobe event based on PROBEs. This option is available only
> + for the event which group name is "fprobes".
> +
> +ftrace.[instance.INSTANCE.]event.tracepoints.EVENT.probes = PROBE[, PROBE2[...]]
> + Defines new tracepoint probe based on PROBEs. This option is available only
> + for the event which group name is "tracepoints" or "tprobes".
> +
> +Note that dynamic event definitions can be written under instance node, but
> +those are also visible from other instances. So please take care for event
> +name conflict.
>
> Ftrace Histogram Options
> ------------------------
> diff --git a/kernel/trace/trace_boot.c b/kernel/trace/trace_boot.c
> index 2ca2541c8a58..6ecf1a035caa 100644
> --- a/kernel/trace/trace_boot.c
> +++ b/kernel/trace/trace_boot.c
> @@ -18,6 +18,7 @@
> #include <linux/trace_events.h>
>
> #include "trace.h"
> +#include "trace_dynevent.h"
>
> #define MAX_BUF_LEN 256
>
> @@ -172,6 +173,109 @@ trace_boot_add_synth_event(struct xbc_node *node, const char *event)
> }
> #endif
>
> +#ifdef CONFIG_EPROBE_EVENTS
> +static int __init
> +trace_boot_add_eprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + struct xbc_node *anode;
> + char buf[MAX_BUF_LEN];
> + const char *val;
> + int ret = 0;
> +
> + xbc_node_for_each_array_value(node, "probes", anode, val) {
> + if (val[0] == 'e' && (val[1] == ':' || isdigit(val[1])))
Oops, I missed it, this isdigit is only required kretprobes...
Let me fix it.
Thank you,
> + strscpy(buf, val, MAX_BUF_LEN);
> + else
> + snprintf(buf, MAX_BUF_LEN, "e:%s/%s %s", group, event, val);
> +
> + ret = dyn_event_create(buf, NULL);
> + if (ret) {
> + pr_err("Failed to add eprobe: %s\n", buf);
> + break;
> + }
> + }
> +
> + return ret;
> +}
> +#else
> +static inline int __init
> +trace_boot_add_eprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + pr_err("Event probe is not supported.\n");
> + return -EOPNOTSUPP;
> +}
> +#endif
> +
> +#ifdef CONFIG_FPROBE_EVENTS
> +static int __init
> +trace_boot_add_fprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + struct xbc_node *anode;
> + char buf[MAX_BUF_LEN];
> + const char *val;
> + int ret = 0;
> +
> + xbc_node_for_each_array_value(node, "probes", anode, val) {
> + if (val[0] == 'f' && (val[1] == ':' || isdigit(val[1])))
> + strscpy(buf, val, MAX_BUF_LEN);
> + else
> + snprintf(buf, MAX_BUF_LEN, "f:%s/%s %s", group, event, val);
> +
> + ret = dyn_event_create(buf, NULL);
> + if (ret) {
> + pr_err("Failed to add fprobe: %s\n", buf);
> + break;
> + }
> + }
> +
> + return ret;
> +}
> +
> +static int __init
> +trace_boot_add_tprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + struct xbc_node *anode;
> + char buf[MAX_BUF_LEN];
> + const char *val;
> + int ret = 0;
> +
> + xbc_node_for_each_array_value(node, "probes", anode, val) {
> + if (val[0] == 't' && (val[1] == ':' || isdigit(val[1])))
> + strscpy(buf, val, MAX_BUF_LEN);
> + else
> + snprintf(buf, MAX_BUF_LEN, "t:%s/%s %s", group, event, val);
> +
> + ret = dyn_event_create(buf, NULL);
> + if (ret) {
> + pr_err("Failed to add tprobe: %s\n", buf);
> + break;
> + }
> + }
> +
> + return ret;
> +}
> +#else
> +static inline int __init
> +trace_boot_add_fprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + pr_err("Fprobe event is not supported.\n");
> + return -EOPNOTSUPP;
> +}
> +
> +static inline int __init
> +trace_boot_add_tprobe_event(struct xbc_node *node, const char *group,
> + const char *event)
> +{
> + pr_err("Tracepoint probe is not supported.\n");
> + return -EOPNOTSUPP;
> +}
> +#endif
> +
> #ifdef CONFIG_HIST_TRIGGERS
> static int __init __printf(3, 4)
> append_printf(char **bufp, char *end, const char *fmt, ...)
> @@ -477,6 +581,15 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode,
> if (!strcmp(group, "synthetic"))
> if (trace_boot_add_synth_event(enode, event) < 0)
> return;
> + if (!strcmp(group, "eprobes"))
> + if (trace_boot_add_eprobe_event(enode, group, event) < 0)
> + return;
> + if (!strcmp(group, "fprobes"))
> + if (trace_boot_add_fprobe_event(enode, group, event) < 0)
> + return;
> + if (!strcmp(group, "tracepoints") || !strcmp(group, "tprobes"))
> + if (trace_boot_add_tprobe_event(enode, group, event) < 0)
> + return;
>
> mutex_lock(&event_mutex);
> file = find_event_file(tr, group, event);
> diff --git a/kernel/trace/trace_dynevent.c b/kernel/trace/trace_dynevent.c
> index c4dfbc293bae..6f2e39b797e5 100644
> --- a/kernel/trace/trace_dynevent.c
> +++ b/kernel/trace/trace_dynevent.c
> @@ -116,6 +116,8 @@ int dyn_event_release(const char *raw_command, struct dyn_event_operations *type
> return ret;
> }
>
> +static int create_dyn_event(const char *raw_command);
> +
> /*
> * Locked version of event creation. The event creation must be protected by
> * dyn_event_ops_mutex because of protecting trace_probe_log.
> @@ -124,6 +126,9 @@ int dyn_event_create(const char *raw_command, struct dyn_event_operations *type)
> {
> int ret;
>
> + if (!type)
> + return create_dyn_event(raw_command);
> +
> mutex_lock(&dyn_event_ops_mutex);
> ret = type->create(raw_command);
> mutex_unlock(&dyn_event_ops_mutex);
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
next prev parent reply other threads:[~2026-08-06 14:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 1:06 [PATCH 0/2] tracing/boot: Support eprobe, fprobe, and tprobe events and add test framework Masami Hiramatsu (Google)
2026-08-06 1:07 ` [PATCH 1/2] tracing/boot: Add support for eprobe, fprobe, and tprobe events Masami Hiramatsu (Google)
2026-08-06 14:00 ` Masami Hiramatsu [this message]
2026-08-06 1:07 ` [PATCH 2/2] selftests/ftrace: Add boot-time tracing test framework Masami Hiramatsu (Google)
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=20260806230042.ab2b9cc1b67c3d888b3f94a4@kernel.org \
--to=mhiramat@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=rostedt@goodmis.org \
--cc=skhan@linuxfoundation.org \
/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.