<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jun 16, 2019 at 3:04 PM Jan Stancek <<a href="mailto:jstancek@redhat.com">jstancek@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
----- Original Message -----<br>
> On Sun, Jun 16, 2019 at 7:08 AM Jan Stancek <<a href="mailto:jstancek@redhat.com" target="_blank">jstancek@redhat.com</a>> wrote:<br>
> <br>
> ><br>
> > ----- Original Message -----<br>
> > > +static void setup(void)<br>
> > > +{<br>
> > > +     sigset_t sigusr1;<br>
> > > +     pthread_t defunct_thread;<br>
> > > +<br>
> > > +     sigemptyset(&sigusr1);<br>
> > > +     sigaddset(&sigusr1, SIGUSR1);<br>
> > > +     pthread_sigmask(SIG_BLOCK, &sigusr1, NULL);<br>
> > > +<br>
> > > +     parent_tgid = getpid();<br>
> > > +     parent_tid = sys_gettid();<br>
> > > +<br>
> > > +     SAFE_PTHREAD_CREATE(&child_thread, NULL, child_thread_func, NULL);<br>
> > > +<br>
> > > +     TST_CHECKPOINT_WAIT(0);<br>
> ><br>
> > I'm seeing reports of this test failing on s390x:<br>
> ><br>
> > st_test.c:1096: INFO: Timeout per run is 0h 05m 00s<br>
> > tgkill03.c:92: PASS: Invalid tgid failed as expected: EINVAL<br>
> > tgkill03.c:92: PASS: Invalid tid failed as expected: EINVAL<br>
> > tgkill03.c:92: PASS: Invalid signal failed as expected: EINVAL<br>
> > tgkill03.c:96: FAIL: Defunct tid should have failed with ESRCH: SUCCESS<br>
> > tgkill03.c:92: PASS: Defunct tgid failed as expected: ESRCH<br>
> > tgkill03.c:99: PASS: Valid tgkill call succeeded<br>
> ><br>
> > and I suspect this piece:<br>
> ><br>
> > > +<br>
> > > +     SAFE_PTHREAD_CREATE(&defunct_thread, NULL, defunct_thread_func,<br>
> > NULL);<br>
> > > +<br>
> > > +     SAFE_PTHREAD_JOIN(defunct_thread, NULL);<br>
> > > +}<br>
> ><br>
> > glibc pthread_join() waits for CLONE_CHILD_CLEARTID to clear tid,<br>
> > and then resumes. Which kernel does at:<br>
> >   do_exit<br>
> >     exit_mm<br>
> >       mm_release<br>
> >         put_user(0, tsk->clear_child_tid);<br>
> ><br>
> > so there's still work to be done after that, and I suspect tid is still<br>
> > valid<br>
> > while that happens.<br>
> ><br>
> > My first idea: wait until /proc/pid/task/<tid> disappears.<br>
> ><br>
> <br>
> The anaysis is probably right, but this idea doesn't work for me. Seems<br>
> /proc/pid/task/<tid> is not the key point to confirm that tid has been<br>
> clear.<br>
> <br>
> I just have a try as below:<br>
> <br>
> ===========<br>
> # for i in `seq 1000`; do echo "i = $i" && ./tgkill03 || break; done<br>
> ...<br>
> i = 96<br>
> tst_test.c:1112: INFO: Timeout per run is 0h 05m 00s<br>
> tgkill03.c:106: FAIL: Defunct tid should have failed with ESRCH: SUCCESS<br>
> <br>
> ===========<br>
> --- a/testcases/kernel/syscalls/tgkill/tgkill03.c<br>
> +++ b/testcases/kernel/syscalls/tgkill/tgkill03.c<br>
> @@ -5,6 +5,7 @@<br>
>   * Test simple tgkill() error cases.<br>
>   */<br>
> <br>
> +#include <stdio.h><br>
>  #include <pthread.h><br>
>  #include <pwd.h><br>
>  #include <sys/types.h><br>
> @@ -19,6 +20,7 @@ static pid_t parent_tgid;<br>
>  static pid_t parent_tid;<br>
>  static pid_t child_tid;<br>
>  static pid_t defunct_tid;<br>
> +char buf[1024];<br>
> <br>
>  static const int invalid_pid = -1;<br>
> <br>
> @@ -35,6 +37,8 @@ static void *defunct_thread_func(void *arg)<br>
>  {<br>
>         defunct_tid = sys_gettid();<br>
> <br>
> +       sprintf(buf, "/proc/pid/task/%d", defunct_tid);<br>
<br>
How about?<br>
          sprintf(buf, "/proc/%d/task/%d", getpid(), defunct_tid);<br>
<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">Ah, I was stupid to lost the getpid :-).</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">This look prettry good. The test fall into while loop when defunct_tid is still exit, and get the expected result once /proc/pid/task/<tid> disappears.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small"># for i in `seq 1000`; do echo "i = $i" && ./tgkill03 || break; done<br></div><div class="gmail_default" style="font-size:small">...</div><div class="gmail_default" style="font-size:small">i = 997<br>tst_test.c:1112: INFO: Timeout per run is 0h 05m 00s<br></div><span class="gmail_default" style="font-size:small"></span>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:95: INFO: Debug: /proc/5164/task/5166 still exist!<br>tgkill03.c:102: PASS: Defunct tgid failed as expected: ESRCH<br><br>Summary:<br>passed   1<br>failed   0<br>skipped  0<br>warnings 0</div><div class="gmail_quote"><div class="gmail_default" style="font-size:small"></div><div class="gmail_default" style="font-size:small">...</div><div class="gmail_default" style="font-size:small">i = 1000</div>tst_test.c:1112: INFO: Timeout per run is 0h 05m 00s<br>tgkill03.c:102: PASS: Defunct tgid failed as expected: ESRCH<br><br>Summary:<br>passed   1<br>failed   0<br>skipped  0<br>warnings 0</div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>