This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] nptl: Add tst-minstack-cancel, tst-minstack-exit [BZ #22636]
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Wed, 10 Jan 2018 09:53:37 -0200
- Subject: Re: [PATCH] nptl: Add tst-minstack-cancel, tst-minstack-exit [BZ #22636]
- Authentication-results: sourceware.org; auth=none
- References: <20180110102147.C81C3439942E1@oldenburg.str.redhat.com>
On 10/01/2018 08:21, Florian Weimer wrote:
> I verified that without the guard accounting change in commit
> 630f4cc3aa019ede55976ea561f1a7af2f068639 (Fix stack guard size
> accounting) the tst-minstack-cancel test fails on an AVX-512F machine.
> (tst-minstack-exit still passes.)
>
> The two tests cannot be merged because lazy binding in libgcc occurs
> only once and contributes significantly to stack usage, so the first
> test would alter stack usage in the second test.
>
> 2018-01-10 Florian Weimer <fweimer@redhat.com>
>
> [BZ #22636]
> * nptl/Makefile (tests): Add tst-minstack-cancel, tst-minstack-exit.
> * nptl/tst-minstack-cancel.c, nptl/tst-minstack-exit.c: New files.
>From the discussion about PTHREAD_STACK_MIN [1] I think the consensus is
PTHREAD_STACK_MIN does not include enough stack necessary for the
cancellation mechanism. Shouldn't we mark 'tst-minstack-cancel.c' as
an XFAIL?
[1] https://sourceware.org/ml/libc-alpha/2017-12/msg00816.html
>
> diff --git a/nptl/Makefile b/nptl/Makefile
> index 7265c0a53c..12c69f99d8 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -307,7 +307,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
> tst-bad-schedattr \
> tst-thread_local1 tst-mutex-errorcheck tst-robust10 \
> tst-robust-fork tst-create-detached tst-memstream \
> - tst-thread-exit-clobber
> + tst-thread-exit-clobber tst-minstack-cancel tst-minstack-exit
>
> tests-internal := tst-rwlock19 tst-rwlock20 \
> tst-sem11 tst-sem12 tst-sem13 \
> diff --git a/nptl/tst-minstack-cancel.c b/nptl/tst-minstack-cancel.c
> new file mode 100644
> index 0000000000..3d8d0dba70
> --- /dev/null
> +++ b/nptl/tst-minstack-cancel.c
> @@ -0,0 +1,45 @@
> +/* Test cancellation with a minimal stack size.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <limits.h>
> +#include <unistd.h>
> +#include <support/check.h>
> +#include <support/xthread.h>
> +
> +static void *
> +threadfunc (void *closure)
> +{
> + while (1)
> + pause ();
> + return NULL;
> +}
> +
> +static int
> +do_test (void)
> +{
> + pthread_attr_t attr;
> + xpthread_attr_init (&attr);
> + xpthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
> + pthread_t thr = xpthread_create (&attr, threadfunc, NULL);
> + xpthread_cancel (thr);
> + TEST_VERIFY (xpthread_join (thr) == PTHREAD_CANCELED);
> + xpthread_attr_destroy (&attr);
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/nptl/tst-minstack-exit.c b/nptl/tst-minstack-exit.c
> new file mode 100644
> index 0000000000..eb6808e889
> --- /dev/null
> +++ b/nptl/tst-minstack-exit.c
> @@ -0,0 +1,43 @@
> +/* Test that pthread_exit works with the minimum stack size.
> + Copyright (C) 2018 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <limits.h>
> +#include <unistd.h>
> +#include <support/check.h>
> +#include <support/xthread.h>
> +
> +static void *
> +threadfunc (void *closure)
> +{
> + pthread_exit (threadfunc);
> + return NULL;
> +}
> +
> +static int
> +do_test (void)
> +{
> + pthread_attr_t attr;
> + xpthread_attr_init (&attr);
> + xpthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN);
> + pthread_t thr = xpthread_create (&attr, threadfunc, NULL);
> + TEST_VERIFY (xpthread_join (thr) == threadfunc);
> + xpthread_attr_destroy (&attr);
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
>