On Thu, May 16, 2019 at 10:38:21AM -0700, Roman Gushchin wrote: > Alex Xu reported a regression in strace, caused by the introduction of > the cgroup v2 freezer. The regression can be reproduced by stracing > the following simple program: > > #include <unistd.h> > > int main() { > write(1, "a", 1); > return 0; > } > > An attempt to run strace ./a.out leads to the infinite loop: > [ 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 ] > > The problem occurs because the traced task leaves ptrace_stop() > (and the signal handling loop) with the frozen bit set. So let's > call cgroup_leave_frozen(true) unconditionally after sleeping > in ptrace_stop(). > > With this patch applied, strace works as expected: > [ pre-main omitted ] > write(1, "a", 1) = 1 > exit_group(0) = ? > +++ exited with 0 +++ > > Reported-by: Alex Xu <alex_y_xu@xxxxxxxx> > Fixes: 76f969e8948d ("cgroup: cgroup v2 freezer") > Signed-off-by: Roman Gushchin <guro@xxxxxx> > Acked-by: Oleg Nesterov <oleg@xxxxxxxxxx> > Cc: Tejun Heo <tj@xxxxxxxxxx> Applied to cgroup/for-5.2-fixes. Thanks. -- tejun