From: Steven Rostedt <rostedt@kernel.org>
To: linux-kernel@vger.kernel.org, linux-trace-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>
Subject: [PATCH 1/2] tracing: Use a single array to represent tracer options files
Date: Wed, 02 Sep 2026 17:26:10 -0400 [thread overview]
Message-ID: <20260902212637.906950608@kernel.org> (raw)
In-Reply-To: 20260902212609.542937225@kernel.org
From: Steven Rostedt <rostedt@goodmis.org>
An instance is represented by a trace_array descriptor that has an array
for options of each tracer. That array is a pointer to another array that
represents every option for a specific tracer. Instead of having two
arrays use just a single array for every tracer option within a
trace_array.
This not only simplifies the logic for representing the tracer option in
the callbacks, but also can be used to simplify a way to find the
trace_array descriptor from this one single array when needing to find
which trace_array the option is attached to in order to take its
reference.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/trace.c | 47 ++++++++++++++++++--------------------------
kernel/trace/trace.h | 21 ++++++++------------
2 files changed, 27 insertions(+), 41 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 722d0ba2d233..f26244253a8b 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -7689,7 +7689,7 @@ static ssize_t
trace_options_read(struct file *filp, char __user *ubuf, size_t cnt,
loff_t *ppos)
{
- struct trace_option_dentry *topt = filp->private_data;
+ struct trace_options *topt = filp->private_data;
char *buf;
if (topt->flags->val & topt->opt->bit)
@@ -7704,7 +7704,7 @@ static ssize_t
trace_options_write(struct file *filp, const char __user *ubuf, size_t cnt,
loff_t *ppos)
{
- struct trace_option_dentry *topt = filp->private_data;
+ struct trace_options *topt = filp->private_data;
unsigned long val;
int ret;
@@ -7730,7 +7730,7 @@ trace_options_write(struct file *filp, const char __user *ubuf, size_t cnt,
static int tracing_open_options(struct inode *inode, struct file *filp)
{
- struct trace_option_dentry *topt = inode->i_private;
+ struct trace_options *topt = inode->i_private;
int ret;
ret = tracing_check_open_get_tr(topt->tr);
@@ -7743,7 +7743,7 @@ static int tracing_open_options(struct inode *inode, struct file *filp)
static int tracing_release_options(struct inode *inode, struct file *file)
{
- struct trace_option_dentry *topt = file->private_data;
+ struct trace_options *topt = file->private_data;
trace_array_put(topt->tr);
return 0;
@@ -7946,8 +7946,9 @@ static struct dentry *trace_options_init_dentry(struct trace_array *tr)
static void
create_trace_option_file(struct trace_array *tr,
- struct trace_option_dentry *topt,
+ struct trace_options *topt,
struct tracer_flags *flags,
+ struct tracer *tracer,
struct tracer_opt *opt)
{
struct dentry *t_options;
@@ -7959,6 +7960,7 @@ create_trace_option_file(struct trace_array *tr,
topt->flags = flags;
topt->opt = opt;
topt->tr = tr;
+ topt->tracer = tracer;
topt->entry = trace_create_file(opt->name, TRACE_MODE_WRITE,
t_options, topt, &trace_options_fops);
@@ -7968,10 +7970,9 @@ static int
create_trace_option_files(struct trace_array *tr, struct tracer *tracer,
struct tracer_flags *flags)
{
- struct trace_option_dentry *topts;
- struct trace_options *tr_topts;
+ struct trace_options *topts;
struct tracer_opt *opts;
- int cnt;
+ int i, cnt;
if (!flags || !flags->opts)
return 0;
@@ -7981,29 +7982,22 @@ create_trace_option_files(struct trace_array *tr, struct tracer *tracer,
for (cnt = 0; opts[cnt].name; cnt++)
;
- topts = kzalloc_objs(*topts, cnt + 1);
- if (!topts)
- return 0;
-
- tr_topts = krealloc_array(tr->topts, tr->nr_topts + 1, sizeof(*tr->topts),
+ topts = krealloc_array(tr->topts, tr->nr_topts + cnt, sizeof(*tr->topts),
GFP_KERNEL);
- if (!tr_topts) {
- kfree(topts);
+ if (!topts)
return -ENOMEM;
- }
- tr->topts = tr_topts;
- tr->topts[tr->nr_topts].tracer = tracer;
- tr->topts[tr->nr_topts].topts = topts;
- tr->nr_topts++;
+ tr->topts = topts;
- for (cnt = 0; opts[cnt].name; cnt++) {
- create_trace_option_file(tr, &topts[cnt], flags,
- &opts[cnt]);
- MEM_FAIL(topts[cnt].entry == NULL,
+ for (topts += tr->nr_topts, i = 0; i < cnt; topts++, i++) {
+ create_trace_option_file(tr, topts, flags, tracer,
+ &opts[i]);
+ MEM_FAIL(topts->entry == NULL,
"Failed to create trace option: %s",
- opts[cnt].name);
+ opts[i].name);
}
+
+ tr->nr_topts += cnt;
return 0;
}
@@ -8865,9 +8859,6 @@ static int __remove_instance(struct trace_array *tr)
if (tr->flags & TRACE_ARRAY_FL_VMALLOC)
vfree((void *)tr->range_addr_start);
- for (i = 0; i < tr->nr_topts; i++) {
- kfree(tr->topts[i].topts);
- }
kfree(tr->topts);
free_cpumask_var(tr->pipe_cpumask);
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 3c111ca88e32..a07802be5673 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -224,11 +224,6 @@ struct array_buffer {
#define TRACE_FLAGS_MAX_SIZE 64
-struct trace_options {
- struct tracer *tracer;
- struct trace_option_dentry *topts;
-};
-
struct trace_pid_list *trace_pid_list_alloc(void);
void trace_pid_list_free(struct trace_pid_list *pid_list);
bool trace_pid_list_is_set(struct trace_pid_list *pid_list, unsigned int pid);
@@ -325,6 +320,14 @@ struct trace_module_delta {
long delta[];
};
+struct trace_options {
+ struct tracer_opt *opt;
+ struct tracer_flags *flags;
+ struct trace_array *tr;
+ struct tracer *tracer;
+ struct dentry *entry;
+};
+
/*
* The trace array - an array of per-CPU trace arrays. This is the
* highest level data structure that individual tracers deal with.
@@ -605,14 +608,6 @@ struct tracer_flags {
/* Makes more easy to define a tracer opt */
#define TRACER_OPT(s, b) .name = #s, .bit = b
-
-struct trace_option_dentry {
- struct tracer_opt *opt;
- struct tracer_flags *flags;
- struct trace_array *tr;
- struct dentry *entry;
-};
-
/**
* struct tracer - a specific tracer and its callbacks to interact with tracefs
* @name: the name chosen to select it on the available_tracers file
--
2.53.0
next prev parent reply other threads:[~2026-09-02 21:25 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 21:26 [PATCH 0/2] tracing: Fix how the tracer options file ups the trace_array ref count Steven Rostedt
2026-09-02 21:26 ` Steven Rostedt [this message]
2026-09-02 21:26 ` [PATCH 2/2] tracing: Take trace_array reference when opening a tracer options file 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=20260902212637.906950608@kernel.org \
--to=rostedt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.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.