From: Vincent Donnefort <vdonnefort@google.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: mhiramat@kernel.org, mathieu.desnoyers@efficios.com,
linux-trace-kernel@vger.kernel.org, maz@kernel.org,
oliver.upton@linux.dev, joey.gouly@arm.com,
suzuki.poulose@arm.com, yuzenghui@huawei.com,
kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
jstultz@google.com, qperret@google.com, will@kernel.org,
aneesh.kumar@kernel.org, kernel-team@android.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v11 07/30] tracing: Add non-consuming read to trace remotes
Date: Tue, 10 Feb 2026 15:32:50 +0000 [thread overview]
Message-ID: <aYtPoil91IX7u_9f@google.com> (raw)
In-Reply-To: <20260204185208.646a6d26@gandalf.local.home>
On Wed, Feb 04, 2026 at 06:52:08PM -0500, Steven Rostedt wrote:
> On Sat, 31 Jan 2026 13:28:25 +0000
> Vincent Donnefort <vdonnefort@google.com> wrote:
>
> > -static struct trace_remote_iterator *trace_remote_iter(struct trace_remote *remote, int cpu)
> > +static void __free_ring_buffer_iter(struct trace_remote_iterator *iter, int cpu)
> > +{
> > + if (!iter->rb_iter)
> > + return;
>
> Hmm, can't iter->rb_iter be NULL when iter->rb_iters[] is used?
Arg yes, I missed that when I removed the union. And actually I don't think this
can be called with iter->rb_iter or iter->rb_iter NULL anymore.
>
> > +
> > + if (cpu != RING_BUFFER_ALL_CPUS) {
> > + ring_buffer_read_finish(iter->rb_iter);
> > + return;
> > + }
> > +
> > + for_each_possible_cpu(cpu) {
> > + if (iter->rb_iters[cpu])
> > + ring_buffer_read_finish(iter->rb_iters[cpu]);
> > + }
> > +
> > + kfree(iter->rb_iters);
> > +}
> > +
> > +static int __alloc_ring_buffer_iter(struct trace_remote_iterator *iter, int cpu)
> > +{
> > + if (cpu != RING_BUFFER_ALL_CPUS) {
> > + iter->rb_iter = ring_buffer_read_start(iter->remote->trace_buffer, cpu, GFP_KERNEL);
> > +
> > + return iter->rb_iter ? 0 : -ENOMEM;
> > + }
> > +
> > + iter->rb_iters = kcalloc(nr_cpu_ids, sizeof(*iter->rb_iters), GFP_KERNEL);
> > + if (!iter->rb_iters)
> > + return -ENOMEM;
> > +
> > + for_each_possible_cpu(cpu) {
> > + iter->rb_iters[cpu] = ring_buffer_read_start(iter->remote->trace_buffer, cpu,
> > + GFP_KERNEL);
> > + if (!iter->rb_iters[cpu]) {
> > + __free_ring_buffer_iter(iter, RING_BUFFER_ALL_CPUS);
>
> For instance, we call __free_ring_buffer_iter() here, but I don't see
> iter->rb_iter being set.
>
> -- Steve
>
>
> > + return -ENOMEM;
> > + }
> > + }
> > +
> > + return 0;
> > +}
> > +
[...]
> > +static void *trace_next(struct seq_file *m, void *v, loff_t *pos)
> > +{
> > + struct trace_remote_iterator *iter = m->private;
> > +
> > + ++*pos;
> > +
> > + if (!iter || !trace_remote_iter_read_event(iter))
> > + return NULL;
> > +
> > + trace_remote_iter_move(iter);
> > + iter->pos++;
> > +
> > + return iter;
> > +}
> > +
> > +static void *trace_start(struct seq_file *m, loff_t *pos)
> > +{
> > + struct trace_remote_iterator *iter = m->private;
> > + loff_t i;
> > +
>
> FYI, this is where you take locks for iteration of files.
>
> > + if (!iter)
> > + return NULL;
> > +
> > + if (!*pos) {
> > + iter->pos = -1;
> > + return trace_next(m, NULL, &i);
> > + }
> > +
> > + i = iter->pos;
> > + while (i < *pos) {
> > + iter = trace_next(m, NULL, &i);
> > + if (!iter)
> > + return NULL;
> > + }
> > +
> > + return iter;
> > +}
> > +
> > +static int trace_show(struct seq_file *m, void *v)
> > +{
> > + struct trace_remote_iterator *iter = v;
> > +
> > + trace_seq_init(&iter->seq);
> > +
> > + if (trace_remote_iter_print_event(iter)) {
> > + seq_printf(m, "[EVENT %d PRINT TOO BIG]\n", iter->evt->id);
> > + return 0;
> > + }
> > +
> > + return trace_print_seq(m, &iter->seq);
> > +}
> > +
> > +static void trace_stop(struct seq_file *s, void *v) { }
>
> And stop is where you release the locks.
>
> > +
> > +static const struct seq_operations trace_sops = {
> > + .start = trace_start,
> > + .next = trace_next,
> > + .show = trace_show,
> > + .stop = trace_stop,
> > +};
> > +
> > +static int trace_open(struct inode *inode, struct file *filp)
> > +{
> > + struct trace_remote *remote = inode->i_private;
> > + struct trace_remote_iterator *iter = NULL;
> > + int cpu = tracing_get_cpu(inode);
> > + int ret;
> > +
> > + if (!(filp->f_mode & FMODE_READ))
> > + return 0;
> > +
> > + guard(mutex)(&remote->lock);
> > +
> > + iter = trace_remote_iter(remote, cpu, TRI_NONCONSUMING);
> > + if (IS_ERR(iter))
> > + return PTR_ERR(iter);
>
> So if iter is bad we exit out here.
>
> > +
> > + ret = seq_open(filp, &trace_sops);
> > + if (ret) {
> > + trace_remote_iter_free(iter);
> > + return ret;
> > + }
> > +
> > + if (iter)
>
> Why test if iter exists here?
We only test IS_ERR. iter will be NULL if the buffer isn't loaded and the
userspace output would be empty. But anyway if I move the locking into
start/stop this line will go away!
>
> > + trace_remote_iter_read_start(iter);
>
> But still, the above grabs locks in the open, where it can return to user
> space while still holding the locks? That's a no-no.
>
> You can use the seq file start and stop for locking.
>
> -- Steve
>
[...]
next prev parent reply other threads:[~2026-02-10 15:32 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-31 13:28 [PATCH v11 00/30] Tracefs support for pKVM Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 01/30] ring-buffer: Add page statistics to the meta-page Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 02/30] ring-buffer: Store bpage pointers into subbuf_ids Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 03/30] ring-buffer: Introduce ring-buffer remotes Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 04/30] ring-buffer: Add non-consuming read for " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 05/30] tracing: Introduce trace remotes Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 06/30] tracing: Add reset to " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 07/30] tracing: Add non-consuming read " Vincent Donnefort
2026-02-04 23:52 ` Steven Rostedt
2026-02-10 15:32 ` Vincent Donnefort [this message]
2026-01-31 13:28 ` [PATCH v11 08/30] tracing: Add init callback " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 09/30] tracing: Add events " Vincent Donnefort
2026-02-05 0:40 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 10/30] tracing: Add events/ root files " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 11/30] tracing: Add helpers to create trace remote events Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 12/30] ring-buffer: Export buffer_data_page and macros Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 13/30] tracing: Introduce simple_ring_buffer Vincent Donnefort
2026-02-05 1:06 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 14/30] tracing: Add a trace remote module for testing Vincent Donnefort
2026-02-05 1:32 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 15/30] tracing: selftests: Add trace remote tests Vincent Donnefort
2026-02-05 17:42 ` Steven Rostedt
2026-02-10 15:54 ` Vincent Donnefort
2026-02-19 14:36 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 16/30] Documentation: tracing: Add tracing remotes Vincent Donnefort
2026-02-05 17:45 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 17/30] tracing: load/unload page callbacks for simple_ring_buffer Vincent Donnefort
2026-02-05 17:47 ` Steven Rostedt
2026-01-31 13:28 ` [PATCH v11 18/30] tracing: Check for undefined symbols in simple_ring_buffer Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 19/30] KVM: arm64: Add PKVM_DISABLE_STAGE2_ON_PANIC Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 20/30] KVM: arm64: Add clock support to nVHE/pKVM hyp Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 21/30] KVM: arm64: Initialise hyp_nr_cpus for nVHE hyp Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 22/30] KVM: arm64: Support unaligned fixmap in the pKVM hyp Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 23/30] KVM: arm64: Add tracing capability for the nVHE/pKVM hyp Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 24/30] KVM: arm64: Add trace remote " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 25/30] KVM: arm64: Sync boot clock with " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 26/30] KVM: arm64: Add trace reset to " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 27/30] KVM: arm64: Add event support to the nVHE/pKVM hyp and trace remote Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 28/30] KVM: arm64: Add hyp_enter/hyp_exit events to nVHE/pKVM hyp Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 29/30] KVM: arm64: Add selftest event support " Vincent Donnefort
2026-01-31 13:28 ` [PATCH v11 30/30] tracing: selftests: Add hypervisor trace remote tests Vincent Donnefort
2026-02-04 22:45 ` [PATCH v11 00/30] Tracefs support for pKVM Steven Rostedt
2026-02-05 17:51 ` 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=aYtPoil91IX7u_9f@google.com \
--to=vdonnefort@google.com \
--cc=aneesh.kumar@kernel.org \
--cc=joey.gouly@arm.com \
--cc=jstultz@google.com \
--cc=kernel-team@android.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=maz@kernel.org \
--cc=mhiramat@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=qperret@google.com \
--cc=rostedt@goodmis.org \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.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.