* [PATCH v2] tracing: Keep copying markers when one instance is stopped
@ 2026-11-03 0:44 Jaewon Jung
2026-11-03 1:05 ` sashiko-bot
0 siblings, 1 reply; 5+ messages in thread
From: Jaewon Jung @ 2026-11-03 0:44 UTC (permalink / raw)
To: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers
Cc: linux-kernel, linux-trace-kernel
When several instances enable copy_trace_marker, stopping one instance
can prevent the remaining buffers from receiving markers.
Continue copying text and raw markers even if one copy fails. Return the
last write's result, keeping -ENODEV when no destinations are selected.
Fixes: 7b382efd5e8a ("tracing: Allow the top level trace_marker to write into another instances")
Signed-off-by: Jaewon Jung <jaewon8868@gmail.com>
---
All writes are now attempted regardless of errors.
The last write's result is returned. Would this approach work?
Changes in v2:
- Drop the stable Cc.
- Do not save earlier copy errors. Return the last write's result.
- Rebase onto trace/for-next.
Tested on x86_64 QEMU:
- Before: Copying stops at the first error, which is returned.
Later live buffers receive no markers.
- After: All buffers are tried, and the last write's result is returned.
- Existing text/raw marker and instance selftests: 6 PASS.
kernel/trace/trace.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 08614af8fad1..0b66c55d378b 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -6330,8 +6330,6 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
guard(rcu)();
list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
written = write_marker_to_buffer(tr, buf, cnt, ip);
- if (written < 0)
- break;
}
} else {
written = write_marker_to_buffer(tr, buf, cnt, ip);
@@ -6409,8 +6407,6 @@ tracing_mark_raw_write(struct file *filp, const char __user *ubuf,
guard(rcu)();
list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
written = write_raw_marker_to_buffer(tr, buf, cnt);
- if (written < 0)
- break;
}
} else {
written = write_raw_marker_to_buffer(tr, buf, cnt);
base-commit: d7ff48d92a0f28bc0612da47c054efbc28c19562
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2] tracing: Keep copying markers when one instance is stopped
2026-11-03 0:44 [PATCH v2] tracing: Keep copying markers when one instance is stopped Jaewon Jung
@ 2026-11-03 1:05 ` sashiko-bot
2026-11-03 14:50 ` Steven Rostedt
0 siblings, 1 reply; 5+ messages in thread
From: sashiko-bot @ 2026-11-03 1:05 UTC (permalink / raw)
To: Jaewon Jung; +Cc: linux-trace-kernel
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] tracing: successful marker write overwritten by tail error in marker_copies
--
commit 2345280f3b3625fa6e36116fc50947e792b25719
Author: Jaewon Jung <jaewon8868@gmail.com>
tracing: Keep copying markers when one instance is stopped
This commit removes the early break on write errors in tracing_mark_write()
and tracing_mark_raw_write() when iterating over marker_copies so that
stopped instances do not prevent remaining instances from receiving markers.
> diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
> index 08614af8fad1c..0b66c55d378b1 100644
> --- a/kernel/trace/trace.c
> +++ b/kernel/trace/trace.c
> @@ -6330,8 +6330,6 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
> guard(rcu)();
> list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
> written = write_marker_to_buffer(tr, buf, cnt, ip);
> - if (written < 0)
> - break;
> }
> } else {
> written = write_marker_to_buffer(tr, buf, cnt, ip);
> @@ -6409,8 +6407,6 @@ tracing_mark_raw_write(struct file *filp, const char __user *ubuf,
> guard(rcu)();
> list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
> written = write_raw_marker_to_buffer(tr, buf, cnt);
> - if (written < 0)
> - break;
[Severity: Medium]
As reported by Steven Rostedt on v1 [1], should errors from stopped
instances in marker_copies be prevented from overwriting a successful write
return value?
When instances enable copy_trace_marker, update_marker_trace() adds each
instance to the head of marker_copies:
kernel/trace/trace.c:update_marker_trace() {
if (enabled) {
if (tr->trace_flags & TRACE_ITER(COPY_MARKER))
return false;
list_add_rcu(&tr->marker_list, &marker_copies);
tr->trace_flags |= TRACE_ITER(COPY_MARKER);
return true;
}
This leaves earlier-enabled instances and global_trace at the tail of
marker_copies.
Because tracing_mark_write() and tracing_mark_raw_write() unconditionally
assign written on every iteration of marker_copies, if an earlier instance
in the list is active and receives the marker (setting written = cnt), but
the last instance in marker_copies has tracing disabled,
write_marker_to_buffer() or write_raw_marker_to_buffer() will return -EBADF
on that tail instance. Won't that overwrite written and cause the syscall
to return -EBADF to userspace even though the marker was successfully
written to the active instance(s)?
[1] https://lore.kernel.org/r/20261102091751.2ee7c4d3@gandalf.local.home
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103005219.3236380-1-jaewon8868@gmail.com?part=1
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH v2] tracing: Keep copying markers when one instance is stopped
2026-11-03 1:05 ` sashiko-bot
@ 2026-11-03 14:50 ` Steven Rostedt
2026-11-04 6:35 ` Jaewon Jung
0 siblings, 1 reply; 5+ messages in thread
From: Steven Rostedt @ 2026-11-03 14:50 UTC (permalink / raw)
To: sashiko-bot; +Cc: sashiko-reviews, Jaewon Jung, linux-trace-kernel
On Tue, 03 Nov 2026 01:05:27 +0000
sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] tracing: successful marker write overwritten by tail error in marker_copies
> --
>
> commit 2345280f3b3625fa6e36116fc50947e792b25719
> Author: Jaewon Jung <jaewon8868@gmail.com>
>
> tracing: Keep copying markers when one instance is stopped
>
> This commit removes the early break on write errors in tracing_mark_write()
> and tracing_mark_raw_write() when iterating over marker_copies so that
> stopped instances do not prevent remaining instances from receiving markers.
>
> > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
> > index 08614af8fad1c..0b66c55d378b1 100644
> > --- a/kernel/trace/trace.c
> > +++ b/kernel/trace/trace.c
> > @@ -6330,8 +6330,6 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
> > guard(rcu)();
> > list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
> > written = write_marker_to_buffer(tr, buf, cnt, ip);
> > - if (written < 0)
> > - break;
> > }
> > } else {
> > written = write_marker_to_buffer(tr, buf, cnt, ip);
> > @@ -6409,8 +6407,6 @@ tracing_mark_raw_write(struct file *filp, const char __user *ubuf,
> > guard(rcu)();
> > list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
> > written = write_raw_marker_to_buffer(tr, buf, cnt);
> > - if (written < 0)
> > - break;
>
> [Severity: Medium]
> As reported by Steven Rostedt on v1 [1], should errors from stopped
> instances in marker_copies be prevented from overwriting a successful write
> return value?
>
> When instances enable copy_trace_marker, update_marker_trace() adds each
> instance to the head of marker_copies:
>
> kernel/trace/trace.c:update_marker_trace() {
> if (enabled) {
> if (tr->trace_flags & TRACE_ITER(COPY_MARKER))
> return false;
>
> list_add_rcu(&tr->marker_list, &marker_copies);
> tr->trace_flags |= TRACE_ITER(COPY_MARKER);
> return true;
> }
>
> This leaves earlier-enabled instances and global_trace at the tail of
> marker_copies.
>
> Because tracing_mark_write() and tracing_mark_raw_write() unconditionally
> assign written on every iteration of marker_copies, if an earlier instance
> in the list is active and receives the marker (setting written = cnt), but
> the last instance in marker_copies has tracing disabled,
> write_marker_to_buffer() or write_raw_marker_to_buffer() will return -EBADF
> on that tail instance. Won't that overwrite written and cause the syscall
> to return -EBADF to userspace even though the marker was successfully
> written to the active instance(s)?
>
We only want to record the the output of the global array, so we should have it be:
if (tr == &global_trace) {
guard(rcu)();
list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
ssize_t w = write_marker_to_buffer(tr, buf, cnt, ip);
if (tr == @global_trace)
written = w;
}
-- Steve
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH v2] tracing: Keep copying markers when one instance is stopped
2026-11-03 14:50 ` Steven Rostedt
@ 2026-11-04 6:35 ` Jaewon Jung
2026-11-04 13:57 ` Steven Rostedt
0 siblings, 1 reply; 5+ messages in thread
From: Jaewon Jung @ 2026-11-04 6:35 UTC (permalink / raw)
To: Steven Rostedt; +Cc: sashiko-bot, sashiko-reviews, linux-trace-kernel
The copy_trace_marker documentation says:
> If no instance has this option set, then a write will error with
> the errno of ENODEV.
With global copying disabled and another instance enabled, both versions
record the marker in that instance, but the proposed change returns
-ENODEV.
This seems inconsistent with the documentation. Should we return the
last write's result, as in v2?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] tracing: Keep copying markers when one instance is stopped
2026-11-04 6:35 ` Jaewon Jung
@ 2026-11-04 13:57 ` Steven Rostedt
0 siblings, 0 replies; 5+ messages in thread
From: Steven Rostedt @ 2026-11-04 13:57 UTC (permalink / raw)
To: Jaewon Jung; +Cc: sashiko-bot, sashiko-reviews, linux-trace-kernel
On Wed, 4 Nov 2026 15:35:38 +0900
Jaewon Jung <jaewon8868@gmail.com> wrote:
> The copy_trace_marker documentation says:
>
> > If no instance has this option set, then a write will error with
> > the errno of ENODEV.
>
> With global copying disabled and another instance enabled, both versions
> record the marker in that instance, but the proposed change returns
> -ENODEV.
Hmm, that's a side effect I guess I didn't expect :-p
>
> This seems inconsistent with the documentation. Should we return the
> last write's result, as in v2?
Perhaps just return the most successful write:
if (tr == &global_trace) {
guard(rcu)();
list_for_each_entry_rcu(tr, &marker_copies, marker_list) {
ssize_t w = write_marker_to_buffer(tr, buf, cnt, ip);
if (w >= 0 && w > written)
written = w;
}
So it produces the output that wrote the most, and an error if non worked.
In reality, if the write_marker_to_buffer() succeeds then it should always
have the same return value.
Thanks,
-- Steve
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-11-04 13:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-03 0:44 [PATCH v2] tracing: Keep copying markers when one instance is stopped Jaewon Jung
2026-11-03 1:05 ` sashiko-bot
2026-11-03 14:50 ` Steven Rostedt
2026-11-04 6:35 ` Jaewon Jung
2026-11-04 13:57 ` Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox