On 01/25, Sasha Levin wrote: > > A random wakeup can get us out of sigsuspend() without TIF_SIGPENDING > being set.
and TIF_RESTORE_SIGMASK is just wrong in this case. I'd say this is the bugfix, not work-around ;) > Avoid that by making sure we were signaled, like sys_pause() does. > > Signed-off-by: Sasha Levin <sasha.le...@oracle.com> Acked-by: Oleg Nesterov <o...@redhat.com> Thanks Sasha. > --- > kernel/signal.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/kernel/signal.c b/kernel/signal.c > index 5da9180..3256c7e 100644 > --- a/kernel/signal.c > +++ b/kernel/signal.c > @@ -3528,8 +3528,10 @@ static int sigsuspend(sigset_t *set) > current->saved_sigmask = current->blocked; > set_current_blocked(set); > > - __set_current_state(TASK_INTERRUPTIBLE); > - schedule(); > + while (!signal_pending(current)) { > + __set_current_state(TASK_INTERRUPTIBLE); > + schedule(); > + } > set_restore_sigmask(); > return -ERESTARTNOHAND; > } > -- > 1.7.10.4 >