Re: [PATCH] autofs4: Use wait_event_killable

From: Matthew Wilcox
Date: Mon Mar 19 2018 - 23:12:16 EST


On Tue, Mar 20, 2018 at 09:58:59AM +0800, Ian Kent wrote:
> On 20/03/18 03:16, Matthew Wilcox wrote:
> > From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx>
> > This playing with signals to allow only fatal signals appears to predate
> > the introduction of wait_event_killable(), and I'm fairly sure that
> > wait_event_killable is what was meant to happen here.
>
> Predates is an understatement, this is really, really old code.
> Do I need to forward this to Al or Andrew?

Looks like Andrew usually picks these up directly. Here's the line
he'll want:

Link: http://lkml.kernel.org/r/20180319191609.23880-1-willy@xxxxxxxxxxxxx

> > Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx>
> Signed-off-by: Ian Kent <raven@xxxxxxxxxx>


> > + wait_event_killable(wq->queue, wq->name.name == NULL);
>
> The wait event code looks like this will wake up on most any unmasked signal.
> But my assumption is that TASK_KILLABLE tasks are only forwarded specific
> signals ...
>
> Is that right or am I missing something?

The signal code is gnarly. As far as I can decipher it, a fatal
signal is always turned into SIGKILL (in complete_signal()), and the
task is woken. For a task sleeping in TASK_KILLABLE, signal_wake_up()
passes TASK_WAKEKILL to signal_wake_up_state() if the signal is SIGKILL.
TASK_KILLABLE sets (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) so it will be
woken in order to die.

If the signal being sent isn't sig_fatal(), then we don't wake the task.
The signal will still be in the pending set, so it can notice when
exiting to userspace, but it won't be woken.