Linux Kernel Selftest development
 help / color / mirror / Atom feed
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>

  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox