From: Steven Rostedt <rostedt@goodmis.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
bpf@vger.kernel.org, x86@kernel.org,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Josh Poimboeuf <jpoimboe@kernel.org>,
Ingo Molnar <mingo@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andrii Nakryiko <andrii@kernel.org>,
Indu Bhagat <indu.bhagat@oracle.com>,
"Jose E. Marchesi" <jemarch@gnu.org>,
Beau Belgrave <beaub@linux.microsoft.com>,
Jens Remus <jremus@linux.ibm.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v10 06/14] unwind_user/deferred: Add deferred unwinding interface
Date: Thu, 19 Jun 2025 04:56:59 -0400 [thread overview]
Message-ID: <20250619045659.390cc014@batman.local.home> (raw)
In-Reply-To: <20250619075008.GU1613376@noisy.programming.kicks-ass.net>
On Thu, 19 Jun 2025 09:50:08 +0200
Peter Zijlstra <peterz@infradead.org> wrote:
> On Wed, Jun 18, 2025 at 03:09:15PM -0400, Steven Rostedt wrote:
> > On Wed, 18 Jun 2025 20:46:20 +0200
> > Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > > > +struct unwind_work;
> > > > +
> > > > +typedef void (*unwind_callback_t)(struct unwind_work *work, struct unwind_stacktrace *trace, u64 timestamp);
> > > > +
> > > > +struct unwind_work {
> > > > + struct list_head list;
> > >
> > > Does this really need to be a list? Single linked list like
> > > callback_head not good enough?
> >
> > Doesn't a list head make it easier to remove without having to iterate the
> > list?
>
> Yeah, but why would you ever want to remove it? You asked for an unwind,
> you get an unwind, no?
No, it's not unique per tracing infrastructure, but tracing instance.
That is, per perf program, or per tracing instance. It needs to be
removed.
>
> > > > static __always_inline void unwind_exit_to_user_mode(void)
> > > > {
> > > > if (unlikely(current->unwind_info.cache))
> > > > current->unwind_info.cache->nr_entries = 0;
> > > > + current->unwind_info.timestamp = 0;
> > >
> > > Surely clearing that timestamp is only relevant when there is a cache
> > > around? Better to not add this unconditional write to the exit path.
> >
> > That's actually not quite true. If the allocation fails, we still want to
> > clear the timestamp. But later patches add more data to check and it does
> > exit out if there's been no requests:
>
> Well, you could put in an error value on alloc fail or somesuch. Then
> its non-zero.
OK.
>
> > But for better reviewing, I could add a comment in this patch that states
> > that this will eventually exit out early when it does more work.
>
> You're making this really hard to review, why not do it right from the
> get-go?
Because the value that is to be checked isn't here yet.
>
> > > > +/* Guards adding to and reading the list of callbacks */
> > > > +static DEFINE_MUTEX(callback_mutex);
> > > > +static LIST_HEAD(callbacks);
> > >
> > > Global state.. smells like failure.
> >
> > Yes, the unwind infrastructure is global, as it is the way tasks know what
> > tracer's callbacks to call.
>
> Well, that's apparently how you've set it up. I don't immediately see
> this has to be like this.
>
> And there's no comments no nothing.
>
> I don't see why you can't have something like:
>
> struct unwind_work {
> struct callback_head task_work;
> void *data;
> void (*func)(struct unwind_work *work, void *data);
> };
>
> void unwind_task_work_func(struct callback_head *task_work)
> {
> struct unwind_work *uw = container_of(task_work, struct unwind_work, task_work);
>
> // do actual unwind
>
> uw->func(uw, uw->data);
> }
>
> or something along those lines. No global state involved.
We have a many to many relationship here where a task_work doesn't work.
That is, you can have a tracer that expects callbacks from several
tasks at the same time, as well as some of those tasks expect to send a
callback to different tracers.
Later patches add a bitmask to every task that gets set to know which
trace to use.
Since the number of tracers that can be called back is fixed to the
number of bits in long (for the bitmask), I can get rid of the link
list and make it into an array. That would make this easier.
>
>
> > > > + guard(mutex)(&callback_mutex);
> > > > + list_for_each_entry(work, &callbacks, list) {
> > > > + work->func(work, &trace, timestamp);
> > > > + }
> > >
> > > So now you're globally serializing all return-to-user instances. How is
> > > that not a problem?
> >
> > It was the original way we did things. The next patch changes this to SRCU.
> > But it requires a bit more care. For breaking up the series, I preferred
> > not to add that logic and make it a separate patch.
> >
> > For better reviewing, I'll add a comment here that says:
> >
> > /* TODO switch this global lock to SRCU */
>
> Oh ffs :-(
>
> So splitting up patches is for ease of review, but now you're making
> splits that make review harder, how does that make sense?
Actually, a comment isn't the right place, I should have mentioned this
in the change log.
-- Steve
next prev parent reply other threads:[~2025-06-19 8:57 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-11 0:54 [PATCH v10 00/14] unwind_user: x86: Deferred unwinding infrastructure Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 01/14] unwind_user: Add user space unwinding API Steven Rostedt
2025-06-18 13:49 ` Peter Zijlstra
2025-06-11 0:54 ` [PATCH v10 02/14] unwind_user: Add frame pointer support Steven Rostedt
2025-06-18 13:52 ` Peter Zijlstra
2025-06-18 15:09 ` Steven Rostedt
2025-06-23 16:31 ` Indu Bhagat
2025-06-24 20:30 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 03/14] unwind_user: Add compat mode " Steven Rostedt
2025-06-18 13:46 ` Peter Zijlstra
2025-06-18 15:10 ` Steven Rostedt
2025-06-18 17:52 ` Linus Torvalds
2025-06-18 18:37 ` Steven Rostedt
2025-06-18 13:47 ` Peter Zijlstra
2025-06-18 15:18 ` Steven Rostedt
2025-06-19 7:51 ` Peter Zijlstra
2025-06-19 8:39 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 04/14] unwind_user/deferred: Add unwind_deferred_trace() Steven Rostedt
2025-06-18 13:54 ` Peter Zijlstra
2025-06-18 13:59 ` Peter Zijlstra
2025-06-18 15:20 ` Steven Rostedt
2025-06-18 16:26 ` Steven Rostedt
2025-06-18 14:01 ` Peter Zijlstra
2025-06-18 15:23 ` Steven Rostedt
2025-06-18 14:02 ` Peter Zijlstra
2025-06-18 15:29 ` Steven Rostedt
2025-06-19 7:54 ` Peter Zijlstra
2025-06-19 8:44 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 05/14] unwind_user/deferred: Add unwind cache Steven Rostedt
2025-06-18 14:13 ` Peter Zijlstra
2025-06-18 15:33 ` Steven Rostedt
2025-06-19 7:56 ` Peter Zijlstra
2025-06-19 8:47 ` Steven Rostedt
2025-06-19 9:04 ` Peter Zijlstra
2025-06-19 9:12 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 06/14] unwind_user/deferred: Add deferred unwinding interface Steven Rostedt
2025-06-18 14:20 ` Peter Zijlstra
2025-06-18 15:37 ` Steven Rostedt
2025-06-18 15:38 ` Steven Rostedt
2025-06-19 8:01 ` Peter Zijlstra
2025-06-19 8:49 ` Steven Rostedt
2025-06-18 18:46 ` Peter Zijlstra
2025-06-18 19:09 ` Steven Rostedt
2025-06-18 19:36 ` Steven Rostedt
2025-06-19 7:50 ` Peter Zijlstra
2025-06-19 8:56 ` Steven Rostedt [this message]
2025-06-19 9:11 ` Peter Zijlstra
2025-06-24 14:03 ` Steven Rostedt
2025-06-24 22:36 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 07/14] unwind_user/deferred: Make unwind deferral requests NMI-safe Steven Rostedt
2025-06-19 8:34 ` Peter Zijlstra
2025-06-19 8:37 ` Steven Rostedt
2025-06-19 8:44 ` Peter Zijlstra
2025-06-19 8:48 ` Peter Zijlstra
2025-06-19 9:10 ` Steven Rostedt
2025-06-19 9:24 ` Peter Zijlstra
2025-06-19 8:57 ` Peter Zijlstra
2025-06-19 9:07 ` Steven Rostedt
2025-06-19 9:32 ` Peter Zijlstra
2025-06-19 9:34 ` Peter Zijlstra
2025-06-19 9:42 ` Steven Rostedt
2025-06-19 9:45 ` Peter Zijlstra
2025-06-19 10:19 ` Steven Rostedt
2025-06-19 10:39 ` Peter Zijlstra
2025-06-19 13:04 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 08/14] unwind deferred: Use bitmask to determine which callbacks to call Steven Rostedt
2025-06-20 8:15 ` Peter Zijlstra
2025-06-24 14:55 ` Steven Rostedt
2025-06-24 15:00 ` Peter Zijlstra
2025-06-24 16:36 ` Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 09/14] unwind deferred: Use SRCU unwind_deferred_task_work() Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 10/14] unwind: Clear unwind_mask on exit back to user space Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 11/14] unwind: Finish up unwind when a task exits Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 12/14] unwind_user/x86: Enable frame pointer unwinding on x86 Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 13/14] perf/x86: Rename and move get_segment_base() and make it global Steven Rostedt
2025-06-11 0:54 ` [PATCH v10 14/14] unwind_user/x86: Enable compat mode frame pointer unwinding on x86 Steven Rostedt
2025-06-12 21:44 ` [PATCH v10 00/14] unwind_user: x86: Deferred unwinding infrastructure Andrii Nakryiko
2025-06-12 22:02 ` Josh Poimboeuf
2025-06-12 23:30 ` Andrii Nakryiko
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=20250619045659.390cc014@batman.local.home \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=beaub@linux.microsoft.com \
--cc=bpf@vger.kernel.org \
--cc=indu.bhagat@oracle.com \
--cc=jemarch@gnu.org \
--cc=jolsa@kernel.org \
--cc=jpoimboe@kernel.org \
--cc=jremus@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=x86@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).