From: Peter Zijlstra <peterz@infradead.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: mingo@kernel.org, andrii@kernel.org,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
rostedt@goodmis.org, mhiramat@kernel.org, jolsa@kernel.org,
clm@meta.com, paulmck@kernel.org
Subject: Re: [PATCH v2 11/11] perf/uprobe: Add uretprobe timer
Date: Thu, 11 Jul 2024 17:00:54 +0200 [thread overview]
Message-ID: <20240711150054.GA3285@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <20240711131918.GC16902@redhat.com>
On Thu, Jul 11, 2024 at 03:19:19PM +0200, Oleg Nesterov wrote:
> Not sure I read this patch correctly, but at first glance it looks
> suspicious..
>
> On 07/11, Peter Zijlstra wrote:
> >
> > +static void return_instance_timer(struct timer_list *timer)
> > +{
> > + struct uprobe_task *utask = container_of(timer, struct uprobe_task, ri_timer);
> > + task_work_add(utask->task, &utask->ri_task_work, TWA_SIGNAL);
> > +}
>
> What if utask->task sleeps in TASK_STOPPED/TASK_TRACED state before
> return from the ret-probed function?
>
> In this case it won't react to TWA_SIGNAL until debugger or SIGCONT
> wakes it up.
Or FROZEN etc.. Yeah.
> ---------------------------------------------------------------------------
> And it seems that even task_work_add() itself is not safe...
>
> Suppose we have 2 ret-probed functions
>
> void f2() { ... }
> void f1() { ...; f2(); }
>
> A task T calls f1(), hits the bp, and calls prepare_uretprobe() which does
>
> mod_timer(&utask->ri_timer, jiffies + HZ);
>
> Then later it calls f2() and the pending timer expires after it enters the
> kernel, but before the next prepare_uretprobe() -> mod_timer().
>
> In this case ri_task_work is already queued and the timer is pending again.
You're saying we can hit a double enqueue, right? Yeah, that's a
problem. But that can be fairly easily rectified.
> Now. Even if T goes to the exit_to_user_mode_loop() path immediately, in
> theory nothing can guarantee that it will call get_signal/task_work_run
> in less than 1 second, it can be preempted.
>
> But T can sleep in xol_take_insn_slot() before return from handle_swbp(),
> and this is not so theoretical.
So the assumption is that kernel code makes forward progress. If we get
preempted, we'll get scheduled again. If the machine is so overloaded
this takes more than a second, stretching the SRCU period is the least
of your problems.
Same with sleeps, it'll get a wakeup.
The only thing that is out of our control is userspace. And yes, I had
not considered STOPPED/TRACED/FROZEN.
So the reason I did that task_work is because the return_instance list
is strictly current, so a random timer cannot safely poke at it. And
barring those pesky states, it does as desired.
Let me ponder that a little, I *can* make it work, but all 'solutions'
I've come up with so far are really rather vile.
next prev parent reply other threads:[~2024-07-11 15:01 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-11 11:02 [PATCH v2 00/11] perf/uprobe: Optimize uprobes Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 01/11] perf/uprobe: Re-indent labels Peter Zijlstra
2024-07-11 11:58 ` Jiri Olsa
2024-07-11 12:07 ` Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 02/11] perf/uprobe: Remove spurious whitespace Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 03/11] rbtree: Provide rb_find_rcu() / rb_find_add_rcu() Peter Zijlstra
2024-07-12 20:23 ` Andrii Nakryiko
2024-07-15 11:21 ` Peter Zijlstra
2024-07-15 17:13 ` Andrii Nakryiko
2024-07-11 11:02 ` [PATCH v2 04/11] perf/uprobe: RCU-ify find_uprobe() Peter Zijlstra
2024-07-11 13:59 ` Masami Hiramatsu
2024-07-11 11:02 ` [PATCH v2 05/11] perf/uprobe: Simplify UPROBE_HANDLER_REMOVE logic Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 06/11] perf/uprobe: SRCU-ify uprobe->consumer list Peter Zijlstra
2024-07-12 21:06 ` Andrii Nakryiko
2024-07-15 11:25 ` Peter Zijlstra
2024-07-15 17:30 ` Andrii Nakryiko
2024-07-11 11:02 ` [PATCH v2 07/11] perf/uprobe: Split uprobe_unregister() Peter Zijlstra
2024-07-12 21:10 ` Andrii Nakryiko
2024-07-11 11:02 ` [PATCH v2 08/11] perf/uprobe: Convert (some) uprobe->refcount to SRCU Peter Zijlstra
2024-07-11 14:03 ` Jiri Olsa
2024-07-12 21:21 ` Andrii Nakryiko
2024-07-11 11:02 ` [PATCH v2 09/11] srcu: Add __srcu_clone_read_lock() Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 10/11] perf/uprobe: Convert single-step and uretprobe to SRCU Peter Zijlstra
2024-07-11 16:06 ` Oleg Nesterov
2024-07-11 18:42 ` Peter Zijlstra
2024-07-12 10:26 ` Oleg Nesterov
2024-07-12 21:28 ` Andrii Nakryiko
2024-07-15 11:59 ` Peter Zijlstra
2024-07-11 11:02 ` [PATCH v2 11/11] perf/uprobe: Add uretprobe timer Peter Zijlstra
2024-07-11 13:19 ` Oleg Nesterov
2024-07-11 15:00 ` Peter Zijlstra [this message]
2024-07-11 15:55 ` Peter Zijlstra
2024-07-11 16:06 ` Peter Zijlstra
2024-07-12 21:43 ` Andrii Nakryiko
2024-07-15 11:41 ` Peter Zijlstra
2024-07-15 17:34 ` Andrii Nakryiko
2024-07-12 4:57 ` [PATCH v2 00/11] perf/uprobe: Optimize uprobes Andrii Nakryiko
2024-07-12 9:13 ` Peter Zijlstra
2024-07-12 13:10 ` Peter Zijlstra
2024-07-12 15:29 ` Andrii Nakryiko
2024-07-15 14:45 ` Peter Zijlstra
2024-07-15 17:10 ` Andrii Nakryiko
2024-07-15 18:10 ` Andrii Nakryiko
2024-07-19 18:42 ` Andrii Nakryiko
2024-07-27 0:18 ` 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=20240711150054.GA3285@noisy.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=andrii@kernel.org \
--cc=clm@meta.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=paulmck@kernel.org \
--cc=rostedt@goodmis.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