(cc'ing Roman and Oleg and quoting whole body) On Tue, Sep 17, 2019 at 02:46:45PM +0800, Honglei Wang wrote: > Process who's waiting for specific sigset shouldn't be woke up > neither it is moved between different cgroups nor the cgroup it > belongs to changes the frozen state. We'd better keep it as is > and let it wait for the desired signals coming. > > Following test case is one scenario which will get "Interrupted > system call" error if we wake it up in cgroup_freeze_task(). > > int main(int argc, char *argv[]) > { > sigset_t waitset; > int signo; > > sigemptyset(&waitset); > sigaddset(&waitset, SIGINT); > sigaddset(&waitset, SIGUSR1); > > pthread_sigmask(SIG_BLOCK, &waitset, NULL); > > for (;;) { > signo = sigwaitinfo(&waitset, NULL); > if (signo < 0) > err(1, "sigwaitinfo() failed"); > > if (signo == SIGUSR1) > printf("Receive SIGUSR1\n"); > else > break; > } > > return 0; > } > > Signed-off-by: Honglei Wang <honglei.wang@xxxxxxxxxx> > --- > kernel/cgroup/freezer.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/kernel/cgroup/freezer.c b/kernel/cgroup/freezer.c > index 8cf010680678..08f6abacaa75 100644 > --- a/kernel/cgroup/freezer.c > +++ b/kernel/cgroup/freezer.c > @@ -162,10 +162,14 @@ static void cgroup_freeze_task(struct task_struct *task, bool freeze) > > if (freeze) { > task->jobctl |= JOBCTL_TRAP_FREEZE; > - signal_wake_up(task, false); > + > + if (sigisemptyset(&task->real_blocked)) > + signal_wake_up(task, false); > } else { > task->jobctl &= ~JOBCTL_TRAP_FREEZE; > - wake_up_process(task); > + > + if (sigisemptyset(&task->real_blocked)) > + wake_up_process(task); > } > > unlock_task_sighand(task, &flags); > -- > 2.17.0 > -- tejun