From: sashiko-bot@kernel.org
To: "Vincent Donnefort" <vdonnefort@google.com>
Cc: linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v7 15/20] tracing/remotes: Add dump_on_panic tracefs file
Date: Thu, 24 Sep 2026 15:15:08 +0000 [thread overview]
Message-ID: <20260924151509.23AEE1F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260924145754.1285146-16-vdonnefort@google.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] trace: trace_remote_panic_handler deadlocks on rb_reader_lock during panic
- [Low] cleanup: mixing goto-based error handling with scope-based cleanup
--
commit 66fa48a367eccf4815a02a5d4904f1fcccdbd1d5
Author: Vincent Donnefort <vdonnefort@google.com>
tracing/remotes: Add dump_on_panic tracefs file
This commit adds a dump_on_panic tracefs file for trace remotes. When enabled,
it registers a panic notifier that attempts to read and dump the contents of
the remote buffer if the system panics.
> diff --git a/kernel/trace/trace_remote.c b/kernel/trace/trace_remote.c
> index ea0fc347dff86..0a360690b174e 100644
> --- a/kernel/trace/trace_remote.c
> +++ b/kernel/trace/trace_remote.c
[ ... ]
> @@ -435,58 +457,68 @@ static void trace_remote_dec_poll(struct trace_remote *remote)
> static struct trace_remote_iterator
> *trace_remote_iter(struct trace_remote *remote, int cpu, enum tri_type type)
> {
> - struct trace_remote_iterator *iter = NULL;
> + struct trace_remote_iterator *iter __free(kfree) = kzalloc_obj(*iter);
[Severity: Low]
This isn't a functional bug, but does this mix goto-based error handling with
scope-based cleanup?
The cleanup subsystem guidelines suggest converting all resources in a given
function to scope-based cleanup or converting none, as mixing the paradigms
can create confusing ownership semantics.
[ ... ]
> - return iter;
> }
> - ret = -ENOMEM;
>
> -err:
> - kfree(iter);
> - trace_remote_put(remote);
> + return no_free_ptr(iter);
>
> +err:
> + switch (type) {
> + case TRI_PANIC:
> + break;
> + default:
> + trace_remote_put(remote);
> + }
> return ERR_PTR(ret);
> }
[ ... ]
> @@ -990,6 +1026,118 @@ static int dmesg_show(struct seq_file *s, void *unused)
> }
> DEFINE_TRACE_REMOTE_ATTRIBUTE(dmesg);
>
> +static int trace_remote_panic_handler(struct notifier_block *self, unsigned long ev, void *v)
> +{
> + struct trace_remote *remote = container_of(self, struct trace_remote, panic_notifier);
> + struct trace_remote_iterator *iter = smp_load_acquire(&remote->panic_iter);
> + int cpu;
> +
> + if (!iter) {
> + pr_warn("Unexpected error: no panic iterator for the trace remote\n");
> + return NOTIFY_DONE;
> + }
> +
> + for_each_possible_cpu(cpu) {
> + if (iter->rb_iters[cpu]) {
> + /* No RING_BUFFER_ALL_CPUS to avoid taking cpu_read_lock() */
> + ring_buffer_read_remote_meta_page(remote->trace_buffer, cpu);
> + ring_buffer_iter_reset(iter->rb_iters[cpu]);
> + }
> + }
> +
> + while (trace_remote_iter_read_event(iter)) {
> + trace_seq_init(&iter->seq);
[Severity: High]
Could this sequence permanently deadlock the system during a kernel panic?
If a panic originates from a non-NMI context (such as a BUG() or sysrq-c),
the panicking CPU halts all other CPUs via smp_send_stop().
If one of those halted CPUs was interrupted while holding its per-CPU
reader_lock, it will never release it. The panicking CPU executing this
handler iterates over all CPUs and calls ring_buffer_read_remote_meta_page().
Looking at ring_buffer_read_remote_meta_page(), it unconditionally acquires
the reader_lock:
int ring_buffer_read_remote_meta_page(struct trace_buffer *buffer, int cpu)
{
...
cpu_buffer = buffer->buffers[cpu];
local_irq_save(flags);
dolock = rb_reader_lock(cpu_buffer);
rb_read_remote_meta_page(cpu_buffer);
...
}
Furthermore, the loop condition trace_remote_iter_read_event() relies on
ring_buffer_empty_cpu(), which also attempts to acquire reader_lock.
Since rb_reader_lock() acquires a standard spinlock rather than using a
trylock, wouldn't the panicking CPU spin infinitely waiting for the halted
CPU's lock, preventing the crash dump and subsequent reboot?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260924145754.1285146-1-vdonnefort@google.com?part=15
next prev parent reply other threads:[~2026-09-24 15:15 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-24 14:57 [PATCH v7 00/20] tracing/remotes: Add printk, dump_on_panic and boot parameters Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 01/20] tracing/remotes: Gate tracefs files opening on trace remote registration Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 02/20] tracing/remotes: Release tracefs,eventfs on registration failure Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 03/20] tracing/remotes: Use kstrtobool for boolean tracefs files Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 04/20] tracing/remotes: Initialise pos in trace_start() Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 05/20] tracing/remotes: Annotate remote shared fields with READ_ONCE/WRITE_ONCE Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 06/20] tracing/remotes: Use a single per-remote polling work Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 07/20] tracing/simple_ring_buffer: Add support for compressed length Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 08/20] tracing/remotes: Add dmesg tracefs file Vincent Donnefort
2026-09-24 15:12 ` sashiko-bot
2026-09-24 14:57 ` [PATCH v7 09/20] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 10/20] tracing/remotes: selftests: Prefix hypervisor folder Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 11/20] ring-buffer: Use irqsave for the reader lock in ring_buffer_poll_remote Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 12/20] ring-buffer: Use panic-friendly locking in ring_buffer_iter interface Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 13/20] ring-buffer: Add ring_buffer_read_remote_meta_page() Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 14/20] ring-buffer: Add kerneldoc for ring_buffer_poll_remote Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 15/20] tracing/remotes: Add dump_on_panic tracefs file Vincent Donnefort
2026-09-24 15:15 ` sashiko-bot [this message]
2026-09-24 14:57 ` [PATCH v7 16/20] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 17/20] tracing/remotes: Add poll_ms " Vincent Donnefort
2026-09-24 15:13 ` sashiko-bot
2026-09-24 14:57 ` [PATCH v7 18/20] tracing/remotes: Add trace_remote cmdline options Vincent Donnefort
2026-09-24 15:16 ` sashiko-bot
2026-09-24 14:57 ` [PATCH v7 19/20] Documentation: tracing/remotes: Add detailed tracefs layout Vincent Donnefort
2026-09-24 14:57 ` [PATCH v7 20/20] Documentation/kernel-parameters: Add trace_remote Vincent Donnefort
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=20260924151509.23AEE1F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=vdonnefort@google.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