On 05/12, Alex Xu (Hello71) wrote: > > Hi, > > I was trying to use strace recently and found that it exhibited some > strange behavior. I produced this minimal test case: > > #include <unistd.h> > > int main() { > write(1, "a", 1); > return 0; > } > > which, when run using "gcc test.c && strace ./a.out" produces this > strace output: > > [ pre-main omitted ] > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > write(1, "a", 1) = ? ERESTARTSYS (To be restarted if > SA_RESTART is set) > [ repeats forever ]
Yes, cgroup_enter_frozen() alone is wrong, we have already discussed this a bit... see https://lore.kernel.org/lkml/20190508152536.ga17...@redhat.com/ Probably we add leave_frozen(true) after freezable_schedule() for now, then think try to make something better... But I am not sure I 100% understand whats going on in this case, could you try the patch below? (Just in case, of course it is wrong). Oleg. --- x/kernel/signal.c +++ x/kernel/signal.c @@ -149,8 +149,7 @@ { if ((t->jobctl & (JOBCTL_PENDING_MASK | JOBCTL_TRAP_FREEZE)) || PENDING(&t->pending, &t->blocked) || - PENDING(&t->signal->shared_pending, &t->blocked) || - cgroup_task_frozen(t)) { + PENDING(&t->signal->shared_pending, &t->blocked) { set_tsk_thread_flag(t, TIF_SIGPENDING); return true; }