This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] nptl: Add tst-minstack-cancel, tst-minstack-exit [BZ #22636]



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>
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]