From: Oleg Nesterov <oleg@redhat.com>
To: Jiri Slaby <jirislaby@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
ebiederm@xmission.com, roland@redhat.com,
linux-kernel@vger.kernel.org, Matthew Wilcox <matthew@wil.cx>
Subject: Re: [PATCH 1/1] signal: make group kill signal fatal
Date: Mon, 25 May 2009 19:20:33 +0200 [thread overview]
Message-ID: <20090525172033.GA12586@redhat.com> (raw)
In-Reply-To: <4A1AC5A3.9000600@gmail.com>
On 05/25, Jiri Slaby wrote:
>
> On 05/25/2009 02:07 AM, Oleg Nesterov wrote:
> > On 05/24, Jiri Slaby wrote:
> >>
> >> __fatal_signal_pending() returns now true only for a non-group sent
> >> sigkill, i. e. for example tgkill, send_sig...
> >
> > No. Please look at complete_signal(). If we queue a fatal signal,
> > we always add SIGKILL to any thread.
>
> Ah, thanks. But it looks like it doesn't work well in some cases.
> Consider this kernel code:
>
> ...
> static int release(struct inode *ino, struct file *file)
> {
> unsigned int a;
> printk(KERN_DEBUG "fst\n");
> for (a = 0; a < 10; a++) {
> printk(KERN_DEBUG "%s: SP=%u FSP=%u pend=%.16lx
> shpend=%.16lx\n",
> __func__,
> signal_pending(current),
> fatal_signal_pending(current),
> current->pending.signal.sig[0],
>
> current->signal->shared_pending.signal.sig[0]);
>
> ...
>
> int main(int argc, char **argv)
> {
> struct pollfd fds = { .events = POLLIN };
> int fd;
>
> fd = open("/dev/m", O_RDONLY);
> if (fd < 0)
> err(1, "open");
> fds.fd = fd;
> if (poll(&fds, 1, -1) < 0)
> err(2, "poll");
> close(fd);
> return 0;
> }
>
> ----------------------------------------------
> It outputs:
> fst
> release: SP=1 FSP=0 pend=0000000000000000 shpend=0000000000000100
Because (I guess) ->release() is called by do_exit()->close_files(),
by this time the private SIGKILL is already dequeued.
If you kill this program, poll() never returns to the user-space.
> If the poll isn't there, it works well.
Hmm. this is strange. Do you mean that if this program does
sleep(10000) (or something else) instead of poll() above, it
prints pend != 0 ?
Note. There are known issues with fatal_signal_pending() in exit()
path. But in any case, we should not check ->shared_pending.
And even if ->signal != NULL we must not use ->siglock. Because
schedule() checks fatal_signal_pending() under rq->lock, we can
deadlock. Also, the fact that SIGKILL is actually pending is the
current implementation detail, probably this will be changed.
__fatal_signal_pending() could check SIGNAL_GROUP_EXIT, but we
can't do this now, ->signal can be NULL. Actually signal_group_exit()
is more correct.
And. Why do you need fatal_signal_pending() ? It is special,
should be used by things like wait_event_killable().
Oleg.
next prev parent reply other threads:[~2009-05-25 17:25 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-24 20:47 [PATCH 1/1] signal: make group kill signal fatal Jiri Slaby
2009-05-25 0:07 ` Oleg Nesterov
2009-05-25 16:21 ` Jiri Slaby
2009-05-25 17:20 ` Oleg Nesterov [this message]
2009-05-25 18:15 ` Jiri Slaby
2009-05-25 22:51 ` Oleg Nesterov
2009-06-02 12:54 ` Jiri Slaby
2009-06-02 14:50 ` Oleg Nesterov
2009-06-03 1:52 ` Roland McGrath
2009-06-04 2:27 ` 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=20090525172033.GA12586@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=jirislaby@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=roland@redhat.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.