From: Oleg Nesterov <oleg@redhat.com>
To: Anton Vorontsov <anton.vorontsov@linaro.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
rientjes@google.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sysrq: Use SEND_SIG_FORCED instead of force_sig()
Date: Wed, 15 Feb 2012 14:53:06 +0100 [thread overview]
Message-ID: <20120215135306.GA11174@redhat.com> (raw)
In-Reply-To: <20120214225017.GA12360@oksana.dev.rtsoft.ru>
On 02/15, Anton Vorontsov wrote:
>
> Change send_sig_all() to use do_send_sig_info(SEND_SIG_FORCED)
> instead of force_sig(SIGKILL). With the recent changes we do not
> need force_ to kill the CLONE_NEWPID tasks.
ACK.
Just one note. This change makes no difference for sysrq_handle_kill().
But it obviously changes the behaviour sysrq_handle_term(). I think
this is fine, if you want to really kill the task which blocks/ignores
SIGTERM you can use sysrq_handle_kill().
Even ignoring the reasons why force_sig() is simply wrong here,
force_sig(SIGTERM) looks strange. The task won't be killed if it has
a handler, but SIG_IGN can't help. However if it has the handler
but blocks SIGTERM temporary (this is very common) it will be killed.
> And this is more correct. force_sig() can race with the exiting
> thread, while do_send_sig_info(group => true) kill the whole
> process.
Yes, except the word "race" doesn't look accurate. force_sig()
can't kill the process if the main thread has already exited.
IOW, it is trivial to create the process which can't be killed
by sysrq.
> > > @@ -324,9 +324,12 @@ static void send_sig_all(int sig)
> > >
> > > read_lock(&tasklist_lock);
> > > for_each_process(p) {
> > > - if (p->mm && !is_global_init(p))
> > > - /* Not swapper, init nor kernel thread */
> > > - force_sig(sig, p);
> > > + if (p->flags & PF_KTHREAD)
> > > + continue;
> > > + if (is_global_init(p))
> > > + continue;
> > > +
> > > + force_sig(sig, p);
> > > }
> > > read_unlock(&tasklist_lock);
> >
> > Obviously I agree with this change.
> >
> > But where does this read_lock(tasklist) come from?
>
> It came from this patch: http://lkml.org/lkml/2012/2/7/24
>
> > We discussed this with Anton. Yes, tasklist ensures that
> > force_sig() can't crash the kernel. But it is still wrong
> > and should not be used.
> >
> > I think send_sig_all() should use SEND_SIG_FORCED (this
> > depends on the patches I sent to Andrew), in this case
> > tasklist is not needed.
>
> Well, I think the lock is still a good thing: we don't want
> any new processes to be created while we kill others.
Yes, but
> I might be wrong, but copy_process() issues recalc_sigpending()
> under tasklist lock especially the for this scenario.
note that it checks recalc_sigpending() under ->siglock. This
means copy_process() can't race with do_send_sig_info() which
takes the same lock. Either the forking task should see
TIF_SIGPENDING, or send_sig_all() should see the result of
list_add_tail_rcu(&p->tasks, &init_task.tasks).
However, we can race with exec. This needs the trivial fix, but:
> Sysrq is a rare thing, so there is actually should be no problem
> with holding the lock.
OK. This looks simpler.
> So, how about this patch?
>
> Greg, can we take it via -mm tree, as it depends on a few
> sched patches?
>
> drivers/tty/sysrq.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
> index 8db9125..5ab8039 100644
> --- a/drivers/tty/sysrq.c
> +++ b/drivers/tty/sysrq.c
> @@ -329,7 +329,7 @@ static void send_sig_all(int sig)
> if (is_global_init(p))
> continue;
>
> - force_sig(sig, p);
> + do_send_sig_info(sig, SEND_SIG_FORCED, p, true);
Acked-by: Oleg Nesterov <oleg@redhat.com>
next prev parent reply other threads:[~2012-02-15 13:59 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <13288070803232@kroah.org>
[not found] ` <20120210201008.GA21009@redhat.com>
2012-02-14 22:50 ` [PATCH] sysrq: Use SEND_SIG_FORCED instead of force_sig() Anton Vorontsov
2012-02-14 23:03 ` Greg Kroah-Hartman
2012-02-15 13:53 ` Oleg Nesterov [this message]
2012-03-24 11:00 Anton Vorontsov
2012-03-26 22:43 ` Andrew Morton
2012-03-27 13:03 ` Anton Vorontsov
2012-03-28 20:52 ` Oleg Nesterov
2012-03-28 21:08 ` Andrew Morton
2012-03-28 21:26 ` Oleg Nesterov
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=20120215135306.GA11174@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=anton.vorontsov@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rientjes@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.