[LTP] [PATCH] syscalls/tgkill03: wait for defunct tid to get detached

Li Wang liwan@redhat.com
Mon Jun 17 09:18:03 CEST 2019


On Mon, Jun 17, 2019 at 3:03 PM Jan Stancek <jstancek@redhat.com> wrote:

>
>
> ----- Original Message -----
> > On Sun, Jun 16, 2019 at 5:52 PM Jan Stancek <jstancek@redhat.com> wrote:
> >
> > > Case where defunct tid is used has been observed to sporadically fail:
> > >   tgkill03.c:96: FAIL: Defunct tid should have failed with ESRCH:
> SUCCESS
> > >
> > > glibc __pthread_timedjoin_ex() waits for CLONE_CHILD_CLEARTID to clear
> tid,
> > > and then resumes. Kernel clears it (glibc pd->tid) at:
> > >   do_exit
> > >     exit_mm
> > >       mm_release
> > >         put_user(0, tsk->clear_child_tid);
> > >
> > > but kernel tid is still valid, presumably until:
> > >   release_task
> > >     __exit_signal
> > >       __unhash_process
> > >         detach_pid
> > >
> > > To avoid race wait until /proc/<pid>/task/<tid> disappears.
> > >
> > > Signed-off-by: Jan Stancek <jstancek@redhat.com>
> > > ---
> > >  testcases/kernel/syscalls/tgkill/tgkill03.c | 6 +++++-
> > >  1 file changed, 5 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/testcases/kernel/syscalls/tgkill/tgkill03.c
> > > b/testcases/kernel/syscalls/tgkill/tgkill03.c
> > > index f5bbdc5a8d4e..5ac1d2651f7a 100644
> > > --- a/testcases/kernel/syscalls/tgkill/tgkill03.c
> > > +++ b/testcases/kernel/syscalls/tgkill/tgkill03.c
> > > @@ -7,6 +7,7 @@
> > >
> > >  #include <pthread.h>
> > >  #include <pwd.h>
> > > +#include <stdio.h>
> > >  #include <sys/types.h>
> > >
> > >  #include "tst_safe_pthread.h"
> > > @@ -42,6 +43,7 @@ static void setup(void)
> > >  {
> > >         sigset_t sigusr1;
> > >         pthread_t defunct_thread;
> > > +       char defunct_tid_path[PATH_MAX];
> > >
> > >         sigemptyset(&sigusr1);
> > >         sigaddset(&sigusr1, SIGUSR1);
> > > @@ -55,8 +57,10 @@ static void setup(void)
> > >         TST_CHECKPOINT_WAIT(0);
> > >
> > >         SAFE_PTHREAD_CREATE(&defunct_thread, NULL, defunct_thread_func,
> > > NULL);
> > > -
> > >         SAFE_PTHREAD_JOIN(defunct_thread, NULL);
> > > +       sprintf(defunct_tid_path, "/proc/%d/task/%d", getpid(),
> > > defunct_tid);
> > > +       while (access(defunct_tid_path, R_OK) == 0)
> > > +               usleep(10000);
> > >
> >
> > To be on the safe side, I think maybe TST_RETRY_FUNC is a better choice
> > here.
>
> Given high steal time on s390, I rather not put 1s cap on sleep here.
> This is newlib test, so there's already a timeout, I'd prefer to lower
> tst_test.timeout, say 30 seconds?
>

Sure, I think it's long enough for the tgkill03 test.

# uname -rm
4.18.0-94.el8.s390x s390x

# time ./tgkill03
tst_test.c:1112: INFO: Timeout per run is 0h 05m 00s
tgkill03.c:97: PASS: Invalid tgid failed as expected: EINVAL
tgkill03.c:97: PASS: Invalid tid failed as expected: EINVAL
tgkill03.c:97: PASS: Invalid signal failed as expected: EINVAL
tgkill03.c:97: PASS: Defunct tid failed as expected: ESRCH
tgkill03.c:97: PASS: Defunct tgid failed as expected: ESRCH
tgkill03.c:104: PASS: Valid tgkill call succeeded

Summary:
passed   6
failed   0
skipped  0
warnings 0

real 0m0.081s
user 0m0.001s
sys 0m0.002s

-- 
Regards,
Li Wang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20190617/5d980816/attachment.html>


More information about the ltp mailing list