From: Tejun Heo <tj@kernel.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: jan.kratochvil@redhat.com, vda.linux@googlemail.com,
linux-kernel@vger.kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, indan@nul.nu
Subject: Re: [PATCH 02/11] ptrace: implement PTRACE_SEIZE
Date: Tue, 10 May 2011 11:46:50 +0200 [thread overview]
Message-ID: <20110510094650.GQ1661@htj.dyndns.org> (raw)
In-Reply-To: <20110509161838.GA27473@redhat.com>
Hey, Oleg.
On Mon, May 09, 2011 at 06:18:38PM +0200, Oleg Nesterov wrote:
> On 05/08, Tejun Heo wrote:
> > -static int ptrace_attach(struct task_struct *task)
> > +static int ptrace_attach(struct task_struct *task, long request,
> > + unsigned long flags)
> > {
> > + bool seize = request == PTRACE_SEIZE;
>
> Cough. I really hate the cosmetic nits but can't resist...
>
> bool seize = (request == PTRACE_SEIZE);
>
> looks more parseable, but feel free to ignore.
Heh yeah, I usually try to avoid unnecessary parantheses mostly
because that seems the easiest way to reach at least some level of
style uniformity. The minimum is well defined idndependently of
anyone's taste and can serve as a meaningful convergence point.
That said, it's true that there are times when things just look better
with extra parantheses. If the above bothers you, I'll update it. :-)
> > @@ -247,6 +272,14 @@ static int ptrace_attach(struct task_struct *task)
> > if (task_is_stopped(task)) {
> > task->jobctl |= JOBCTL_STOP_PENDING | JOBCTL_TRAPPING;
> > signal_wake_up(task, 1);
> > + } else if (seize) {
> > + /*
> > + * Otherwise, SEIZE uses jobctl trap to put tracee into
> > + * TASK_TRACED, which doesn't have the nasty side effects
> > + * of sending SIGSTOP.
> > + */
> > + task->jobctl |= JOBCTL_TRAP_SEIZE;
> > + signal_wake_up(task, 0);
>
> OK... I am a bit worried we can set JOBCTL_TRAP_SEIZE even if the tracee
> was already killed, and if it is killed later JOBCTL_TRAP_SEIZE won't be
> cleared. Probably this is fine, ptrace_stop()->schedule() won't sleep in
> this case.
Hmmm... if killed, the tracee would go through __ptrace_unlink() which
always clears JOBCTL_TRAP_MASK which includes JOBCTL_TRAP_SEIZE. What
am I missing?
> Hmm. but see below.
>
> > @@ -1752,12 +1752,13 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
> > set_current_state(TASK_TRACED);
> >
> > /*
> > - * We're committing to trapping. Clearing JOBCTL_TRAPPING and
> > - * transition to TASK_TRACED should be atomic with respect to
> > - * siglock. This should be done after the arch hook as siglock is
> > - * released and regrabbed across it.
> > + * We're committing to trapping. Adjust ->jobctl. Updates to
> > + * these flags and transition to TASK_TRACED should be atomic with
> > + * respect to siglock. This should be done after the arch hook as
> > + * siglock may be released and regrabbed across it.
> > */
> > task_clear_jobctl_trapping(current);
> > + current->jobctl &= ~JOBCTL_TRAP_SEIZE;
>
> Yes. But, it seems, this is too late.
>
> Suppose that the JOBCTL_TRAP_SEIZE tracee was SIGKILLED before it reports
> PTRACE_EVENT_INTERRUPT. Now, if arch_ptrace_stop_needed() == T, ptrace_stop()
> returns without clearing JOBCTL_TRAP_SEIZE/TIF_SIGPENDING. This means
> get_signal_to_deliver() will loop forever.
Argh... right it has an early exit path there.
> I never understood why ptrace_stop()->sigkill_pending() logic, I think
> we should check fatal_signal_pending() unconditionally.
Probably the best way to do it is adding fatal_signal_pending() into
may_ptrace_stop() so that the failure path shares most of the code
path instead of doing quick dirty exit? It's just nasty to have early
exit above there and walking through the normal code path wouldn't
hurt SIGKILL either.
> Oh, and we have other subtle issues here.
>
> > for (;;) {
> > struct k_sigaction *ka;
> > +
> > + /*
> > + * Check for ptrace trap conditions. Jobctl traps are used
> > + * to trap ptracee while staying transparent regarding
> > + * signal and job control.
> > + */
> > + if (unlikely(current->jobctl & JOBCTL_TRAP_MASK)) {
> > + ptrace_notify_locked(SIGTRAP |
> > + (PTRACE_EVENT_INTERRUPT << 8));
> > + continue;
>
> Shouldn't we recheck SIGNAL_CLD_MASK after ptrace_notify_locked() returns?
> Probably not, but I am not sure...
Yeah, I thought about that one too. I don't think it really matters
one way or the other. I mostly just wanted to avoid an extra
spin_unlock_irq() after ptrace_notify_locked().
> In any case. This doesn't really matter, but can't we check
> JOBCTL_TRAP_MASK outside of the main loop? Unless we drop ->siglock
> this bit can't be changed, and every time we drop ->siglock we go to
> "relock".
Yeah, sure. I basically just wanted to say "continue" there. :-) I'll
take it out of the loop and make it unlock and jump to relock.
Thank you.
--
tejun
next prev parent reply other threads:[~2011-05-10 9:46 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-08 15:48 [PATCHSET ptrace] ptrace: implement PTRACE_SEIZE/INTERRUPT and group stop notification Tejun Heo
2011-05-08 15:48 ` [PATCH 01/11] job control: rename signal->group_stop and flags to jobctl and rearrange flags Tejun Heo
2011-05-08 15:48 ` [PATCH 02/11] ptrace: implement PTRACE_SEIZE Tejun Heo
2011-05-09 16:18 ` Oleg Nesterov
2011-05-10 9:46 ` Tejun Heo [this message]
2011-05-10 13:20 ` Oleg Nesterov
2011-05-10 13:47 ` Tejun Heo
2011-05-10 18:19 ` Oleg Nesterov
2011-05-15 15:56 ` PTRACE_SEIZE should not stop [Re: [PATCH 02/11] ptrace: implement PTRACE_SEIZE] Jan Kratochvil
2011-05-15 16:26 ` Tejun Heo
2011-05-15 17:15 ` Jan Kratochvil
2011-05-15 17:25 ` Tejun Heo
2011-05-15 19:48 ` Jan Kratochvil
2011-05-16 8:31 ` Tejun Heo
2011-05-16 12:26 ` Jan Kratochvil
2011-05-16 12:42 ` Tejun Heo
2011-05-16 13:03 ` Jan Kratochvil
2011-05-16 13:51 ` Tejun Heo
2011-05-16 13:21 ` Jan Kratochvil
2011-05-16 13:45 ` Tejun Heo
2011-05-16 13:48 ` Jan Kratochvil
2011-05-16 13:54 ` Tejun Heo
2011-05-08 15:48 ` [PATCH 03/11] ptrace: ptrace_check_attach(): rename @kill to @ignore_state and add comments Tejun Heo
2011-05-08 15:48 ` [PATCH 04/11] ptrace: implement PTRACE_INTERRUPT Tejun Heo
2011-05-08 21:58 ` Denys Vlasenko
2011-05-09 10:09 ` Tejun Heo
2011-05-09 10:55 ` Denys Vlasenko
2011-05-09 16:58 ` Oleg Nesterov
2011-05-10 9:50 ` Tejun Heo
2011-05-10 14:06 ` Oleg Nesterov
2011-05-10 14:20 ` Tejun Heo
2011-05-10 18:08 ` Oleg Nesterov
2011-05-11 8:29 ` Tejun Heo
2011-05-12 17:06 ` Oleg Nesterov
2011-05-12 17:21 ` Tejun Heo
2011-05-10 21:59 ` Denys Vlasenko
2011-05-11 9:19 ` Tejun Heo
2011-05-11 12:23 ` Denys Vlasenko
2011-05-11 13:22 ` Tejun Heo
2011-05-11 16:20 ` Bryan Donlan
2011-05-11 19:24 ` Tejun Heo
2011-05-15 16:10 ` PTRACE_DETACH without stop [Re: [PATCH 04/11] ptrace: implement PTRACE_INTERRUPT] Jan Kratochvil
2011-05-15 16:35 ` Tejun Heo
2011-05-15 17:39 ` Jan Kratochvil
2011-05-16 9:01 ` Tejun Heo
2011-05-16 12:08 ` Jan Kratochvil
2011-05-16 12:24 ` Tejun Heo
2011-05-08 15:48 ` [PATCH 05/11] ptrace: restructure ptrace_getsiginfo() Tejun Heo
2011-05-08 15:49 ` [PATCH 06/11] ptrace: make group stop state visible via PTRACE_GETSIGINFO Tejun Heo
2011-05-10 16:55 ` Oleg Nesterov
2011-05-10 17:11 ` Oleg Nesterov
2011-05-11 8:08 ` Tejun Heo
2011-05-12 16:47 ` Oleg Nesterov
2011-05-12 17:15 ` Tejun Heo
2011-05-08 15:49 ` [PATCH 07/11] ptrace: add JOBCTL_TRAPPED Tejun Heo
2011-05-08 15:49 ` [PATCH 08/11] ptrace: move fallback JOBCTL_TRAPPING clearing to get_signal_to_deliver() Tejun Heo
2011-05-11 15:48 ` Oleg Nesterov
2011-05-11 19:17 ` Tejun Heo
2011-05-12 15:40 ` Oleg Nesterov
2011-05-08 15:49 ` [PATCH 09/11] job control: reorganize wait_task_stopped() Tejun Heo
2011-05-11 15:48 ` Oleg Nesterov
2011-05-11 19:29 ` Tejun Heo
2011-05-12 15:42 ` Oleg Nesterov
2011-05-12 16:02 ` Tejun Heo
2011-05-12 17:25 ` Oleg Nesterov
2011-05-12 17:32 ` Tejun Heo
2011-05-12 17:33 ` Tejun Heo
2011-05-12 18:33 ` Oleg Nesterov
2011-05-13 8:46 ` Tejun Heo
2011-05-13 17:21 ` Oleg Nesterov
2011-05-14 10:56 ` Tejun Heo
2011-05-15 14:40 ` waitpid(WNOHANG) should report SIGCHLD-notified signals [Re: [PATCH 09/11] job control: reorganize wait_task_stopped()] Jan Kratochvil
2011-05-15 16:47 ` Tejun Heo
2011-05-15 17:01 ` Tejun Heo
2011-05-15 17:47 ` Jan Kratochvil
2011-05-16 9:13 ` Tejun Heo
2011-05-16 12:11 ` Jan Kratochvil
2011-05-16 12:27 ` Tejun Heo
2011-05-16 12:39 ` Jan Kratochvil
2011-05-16 12:46 ` Tejun Heo
2011-05-08 15:49 ` [PATCH 10/11] ptrace: move JOBCTL_TRAPPING wait to wait(2) and ptrace_check_attach() Tejun Heo
2011-05-11 16:49 ` Oleg Nesterov
2011-05-11 17:00 ` Oleg Nesterov
2011-05-11 19:45 ` Tejun Heo
2011-05-11 19:53 ` Tejun Heo
2011-05-12 10:23 ` Tejun Heo
2011-05-12 16:06 ` Oleg Nesterov
2011-05-12 15:59 ` Oleg Nesterov
2011-05-12 16:07 ` Tejun Heo
2011-05-12 18:20 ` Oleg Nesterov
2011-05-13 9:13 ` Tejun Heo
2011-05-13 18:34 ` Oleg Nesterov
2011-05-08 15:49 ` [PATCH 11/11] ptrace: implement group stop notification for ptracer Tejun Heo
2011-05-08 22:42 ` Denys Vlasenko
2011-05-09 10:10 ` Tejun Heo
2011-05-10 22:37 ` Denys Vlasenko
2011-05-11 9:05 ` Tejun Heo
2011-05-11 12:01 ` Denys Vlasenko
2011-05-11 13:13 ` Tejun Heo
2011-05-11 19:58 ` Oleg Nesterov
2011-05-11 20:18 ` Tejun Heo
2011-05-11 20:21 ` Tejun Heo
2011-05-12 10:24 ` Tejun Heo
2011-05-15 14:02 ` getter PTRACE_GETSIGINFO should not modify anything [Re: [PATCH 11/11] ptrace: implement group stop notification for ptracer] Jan Kratochvil
2011-05-15 14:28 ` Tejun Heo
2011-05-15 17:17 ` Jan Kratochvil
2011-05-15 17:28 ` Tejun Heo
2011-05-15 20:06 ` Jan Kratochvil
2011-05-16 8:43 ` Tejun Heo
2011-05-16 12:17 ` Jan Kratochvil
2011-05-16 12:56 ` Tejun Heo
2011-05-16 13:00 ` Ingo Molnar
2011-05-08 22:27 ` [PATCHSET ptrace] ptrace: implement PTRACE_SEIZE/INTERRUPT and group stop notification Denys Vlasenko
2011-05-09 9:48 ` Tejun Heo
2011-05-15 13:55 ` ptrace-testsuite status [Re: [PATCHSET ptrace] ptrace: implement PTRACE_SEIZE/INTERRUPT and group stop notification] Jan Kratochvil
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=20110510094650.GQ1661@htj.dyndns.org \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=indan@nul.nu \
--cc=jan.kratochvil@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=vda.linux@googlemail.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;
as well as URLs for NNTP newsgroup(s).