On 10/20, Dmitry Vyukov wrote: > > On Tue, Oct 20, 2015 at 10:34 AM, Dmitry Vyukov <dvyu...@google.com> wrote: > > On Mon, Oct 19, 2015 at 10:17 PM, Dmitry Vyukov <dvyu...@google.com> wrote: > >> On Mon, Oct 19, 2015 at 9:49 PM, Oleg Nesterov <o...@redhat.com> wrote: > >>> > >>> So I bet the problem is that your /sbin/init doesn't use __WALL, > >>> so wait() doesn't reap the traced zombie sub-thread, and thus it > >>> can't release the non-empty thread group. > >>> > >>> Could you please verify? Just do "strace -p1" and send SIGCHLD to > >>> init. > >>> > >>> perhaps eligible_child() should assume WALL if ptrace && ZOMBIE... > >> > >> > >> I am using Ubuntu. > >> Here strace output from init: > >> > >> waitid(P_ALL, 0, {}, WNOHANG|WEXITED|WSTOPPED|WCONTINUED, NULL) = 0 > >> > >> So what should be fixed here? Kernel of distro init? > > > > waitpid(__WALL) indeed joins these processes.
Thanks. And I just checked Fedora 22, it doesn't use __WALL too. So I think we should change the kernel even if this is not a bug... I'll send the patch. > > But __WALL can't be used with waitid and Ubuntu init uses waitid... Yes, and I never understood why. Perhaps we should change this too. > #include <pthread.h> > #include <unistd.h> > #include <sys/ptrace.h> > #include <stdio.h> > #include <errno.h> > #include <signal.h> > #include <sys/types.h> > #include <sys/wait.h> > > void *thr(void *arg) { > ptrace(PTRACE_TRACEME, 0, 0, 0); > return 0; > } > > int main() { > int pid = fork(); > if (pid == 0) { > pthread_t th; > pthread_create(&th, 0, thr, 0); > sleep(1); > return 0; > } > siginfo_t info = {}; > int status = 0; > int res = waitpid(-1, &status, __WALL); > printf("pid=%d res=%d errno=%d\n", pid, res, errno); > res = waitpid(-1, &status, __WALL); > printf("pid=%d res=%d errno=%d\n", pid, res, errno); > return 0; > } > > > However, I need to wait for a particular child and if I change the > first waitpid to: > > int res = waitpid(pid, &status, __WALL); > > then it does not terminate. > So how can I wait for such child process? You can't. This is one of historical oddities. You need to reap the traced sub-thread first. And PTRACE_DETACH doesn't work. Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/