All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Vincent Donnefort" <vdonnefort@google.com>
Cc: linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v6 13/18] tracing/remotes: Add dump_on_panic tracefs file
Date: Mon, 17 Aug 2026 14:10:19 +0000	[thread overview]
Message-ID: <20260817141020.330011F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260817135517.3919534-14-vdonnefort@google.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] The panic handler unconditionally attempts to acquire a per-CPU reader spinlock that may be held by a CPU halted by smp_send_stop(), leading to a permanent deadlock during kernel panic.
- [High] Missing touch_nmi_watchdog() in the panic dump loop can cause a secondary panic or hard reset.
- [Medium] Mixing goto-based error handling with __free() scope-based cleanup in trace_remote_iter().
- [Low] Missing READ_ONCE() when reading remote->panic_on in dump_on_panic_show().
--

--- Patch [13]: [PATCH v6 13/18] tracing/remotes: Add dump_on_panic tracefs file ---
commit 33a5774bde5e05c9ff209cc5026a9b962c22df16
Author: Vincent Donnefort <vdonnefort@google.com>

tracing/remotes: Add dump_on_panic tracefs file

This commit adds a dump_on_panic tracefs file. When enabled, it dumps the
content of the trace remote buffer to the console if the system panics.

> diff --git a/kernel/trace/trace_remote.c b/kernel/trace/trace_remote.c
> index 9e78267d71f8b..5536e0df43795 100644
> --- a/kernel/trace/trace_remote.c
> +++ b/kernel/trace/trace_remote.c

[ ... ]

> @@ -434,58 +455,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: Medium]
This isn't a bug, but this function mixes scope-based cleanup (__free) with
a goto-based error handling pattern. According to the cleanup subsystem
guidelines, mixing goto-based cleanup labels and __free() declarations in
the same function is forbidden because it creates confusing ownership
semantics.

Should this function either use goto-based cleanup exclusively, or be
fully converted to scope-based cleanup?

[ ... ]

> @@ -989,6 +1024,117 @@ 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]);
> +		}
> +	}

[Severity: High]
Can this loop deadlock indefinitely during a panic?

If another CPU is actively reading the remote trace buffer and holds its
reader_lock, the panic() function will stop that CPU via smp_send_stop().

When the panicking CPU executes this loop,
ring_buffer_read_remote_meta_page() calls rb_reader_lock(). If in_nmi() is
false (which happens on a normal oops or SysRq-C), rb_reader_lock() will
unconditionally attempt to acquire the lock held by the stopped CPU rather
than using a trylock.

Will this cause the panic recovery process to hang forever?

> +
> +	while (trace_remote_iter_read_event(iter)) {
> +		trace_seq_init(&iter->seq);
> +
> +		trace_remote_iter_print_event(iter);
> +		trace_seq_putc(&iter->seq, 0);
> +		pr_emerg("%s", seq_buf_str(&iter->seq.seq));
> +
> +		trace_remote_iter_move(iter);
> +	}

[Severity: High]
Since serial consoles can be slow and remote trace buffers can contain
many events, could the time spent in this printing loop trigger the NMI
watchdog and cause a hard reset before the panic dump completes?

Does this loop need a call to touch_nmi_watchdog()?

> +
> +	return NOTIFY_DONE;
> +}

[ ... ]

> +static int dump_on_panic_show(struct seq_file *s, void *unused)
> +{
> +	struct trace_remote *remote = s->private;
> +
> +	seq_printf(s, "%d\n", remote->panic_on);

[Severity: Low]
Does this unprotected read of remote->panic_on need a READ_ONCE()?

Since dump_on_panic_write() modifies this flag concurrently under
remote->lock, this is formally a data race under the Linux kernel memory
model and might be flagged by KCSAN.

> +
> +	return 0;
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260817135517.3919534-1-vdonnefort@google.com?part=13

  reply	other threads:[~2026-08-17 14:10 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-17 13:54 [PATCH v6 00/18] tracing/remotes: Add printk, dump_on_panic and boot parameters Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 01/18] tracing/remotes: Gate tracefs files opening on trace remote registration Vincent Donnefort
2026-08-17 14:09   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 02/18] tracing/remotes: Release tracefs,eventfs on registration failure Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 03/18] tracing/remotes: Use kstrtobool for boolean tracefs files Vincent Donnefort
2026-08-17 14:11   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 04/18] tracing/remotes: Use a single per-remote polling work Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 05/18] tracing/simple_ring_buffer: Add support for compressed length Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 06/18] tracing/remotes: Add dmesg tracefs file Vincent Donnefort
2026-08-17 14:09   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 07/18] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-08-17 14:05   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 08/18] tracing/remotes: selftests: Prefix hypervisor folder Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 09/18] ring-buffer: Use irqsave for the reader lock in ring_buffer_poll_remote Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 10/18] ring-buffer: Use panic-friendly locking in ring_buffer_iter interface Vincent Donnefort
2026-08-17 14:04   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 11/18] ring-buffer: Add ring_buffer_read_remote_meta_page() Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 12/18] ring-buffer: Add kerneldoc for ring_buffer_poll_remote Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 13/18] tracing/remotes: Add dump_on_panic tracefs file Vincent Donnefort
2026-08-17 14:10   ` sashiko-bot [this message]
2026-08-17 13:55 ` [PATCH v6 14/18] tracing/remotes: selftests: Add a test for the " Vincent Donnefort
2026-08-17 14:07   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 15/18] tracing/remotes: Add poll_ms " Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 16/18] tracing/remotes: Add trace_remote cmdline options Vincent Donnefort
2026-08-17 14:12   ` sashiko-bot
2026-08-17 13:55 ` [PATCH v6 17/18] Documentation: tracing/remotes: Add detailed tracefs layout Vincent Donnefort
2026-08-17 13:55 ` [PATCH v6 18/18] Documentation/kernel-parameters: Add trace_remote Vincent Donnefort
2026-08-17 14:21   ` sashiko-bot

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=20260817141020.330011F00A3D@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 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.