From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-x829.google.com (mail-qt1-x829.google.com [IPv6:2607:f8b0:4864:20::829]) by sourceware.org (Postfix) with ESMTPS id E3B2B3857804 for ; Fri, 2 Apr 2021 19:10:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E3B2B3857804 Received: by mail-qt1-x829.google.com with SMTP id s2so4297860qtx.10 for ; Fri, 02 Apr 2021 12:10:23 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=+JrOr0seLZ2yfmGHGKTT/aiSJXFTX1TxCKozu43PCXM=; b=bSsUCx5boS34N5P+/PLHRTTdvpz7EinWew7bjXrzmffgvu0/KwtwXPBuHHOu3ZgHmd 4zWN0ZgWp5FsCeDjaXqPAejKdWMlQQRITQED4UQRJh91uxnngIQkBgEsIi5EJ0c8iTSZ nU/J8OT82Tg698ZifoRCWXd3seoZlTwzVaT37TCP4ObZBhval4Wd1o3GPp3IROAGs0MF CzxJVwBN1dpXRKDXBrmtCANIvg0qlJujJ8SbhHqNIBdqy0YFy8of29qGlZkqdBNNJcwr Vbm3X33JZgGst08S3pEi84iQcQktErmww3xZTYLdSW9dWtAJuXa5TUPzyL5WItjVDtTl ZjuQ== X-Gm-Message-State: AOAM531wL1iC1LDcj/gX7KCuWQbFkTvkZsOYB1zq91UuDzUsetc+0h8L DnR6ydrmd9TQlL1DfGOklFVSeA== X-Google-Smtp-Source: ABdhPJyBKwDkhI/FO38Ad4u/j+JeVxI1bw/k8ketzWvoi7szUXI0EKRe9lwS9WQ6MXz3dn1AL6NQOQ== X-Received: by 2002:ac8:5e8d:: with SMTP id r13mr13191271qtx.138.1617390623252; Fri, 02 Apr 2021 12:10:23 -0700 (PDT) Received: from [192.168.1.132] ([177.194.41.149]) by smtp.gmail.com with ESMTPSA id d84sm7979380qke.53.2021.04.02.12.10.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 02 Apr 2021 12:10:23 -0700 (PDT) Subject: Re: [PATCH 03/15] Add test case for [BZ #19329] To: libc-alpha@sourceware.org, Szabolcs Nagy References: <34be48a80b03bed2fe8f3aff020f8b6b77858e97.1613390045.git.szabolcs.nagy@arm.com> From: Adhemerval Zanella Message-ID: <91413691-f279-39cc-baa2-ff340077ebb3@linaro.org> Date: Fri, 2 Apr 2021 16:10:20 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <34be48a80b03bed2fe8f3aff020f8b6b77858e97.1613390045.git.szabolcs.nagy@arm.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2021 19:10:26 -0000 On 15/02/2021 08:57, Szabolcs Nagy via Libc-alpha wrote: > From: Szabolcs Nagy > > Test concurrent dlopen and pthread_create when the loaded > modules have TLS. This triggers dl-tls assertion failures > more reliably than the tst-stack4 test. > > The dlopened module has 100 DT_NEEDED dependencies, the > number of concurrent threads created during dlopen depends > on filesystem speed and hardware. At most 3 threads exist > at a time to limit resource usage. > > Doing the test in a fork loop can make it more reliable. I can easily reproduce it on x86_64 (8 cpus), powerpc64 (128 cpus), and aarch64 (160 cpus); however this tests does pass on a more limited armhf box (2 cpus). In any case, this should be ok. Also, this patch should be move after the BZ #19329 fix in this set (otherwise it will generate make check failures). > > --- > v4: > - rebased, updated copyright year. > - moved to tests-internal because of The glibc build with -std=gnu11, so I think it should be ok to use stdatomic and move out tests-internal. > > v3: > - use the new test support code. > - better Makefile usage so modules are cleaned properly. > > v2: > - undef NDEBUG. > - join nop threads so at most 3 threads exist at a time. > - remove stack size setting (resource usage is no longer a concern). > - stop creating threads after dlopen observably finished. > - print the number of threads created for debugging. > > 2016-12-13 Szabolcs Nagy > > * nptl/Makefile (tests): Add tst-tls7. > (modules-names): Add tst-tls7mod, tst-tls7mod-dep. > * nptl/tst-tls7.c: New file. > * nptl/tst-tls7mod-dep.c: New file. > * nptl/tst-tls7mod.c: New file. There is no need to add ChangeLog entries anymore. > --- > nptl/Makefile | 17 +++++++++-- > nptl/tst-tls7.c | 69 ++++++++++++++++++++++++++++++++++++++++++ > nptl/tst-tls7mod-dep.c | 1 + > nptl/tst-tls7mod.c | 1 + > 4 files changed, 85 insertions(+), 3 deletions(-) > create mode 100644 nptl/tst-tls7.c > create mode 100644 nptl/tst-tls7mod-dep.c > create mode 100644 nptl/tst-tls7mod.c > > diff --git a/nptl/Makefile b/nptl/Makefile > index 8fb7fee6db..208629876d 100644 > --- a/nptl/Makefile > +++ b/nptl/Makefile > @@ -355,20 +355,25 @@ tests += tst-cancelx7 tst-cancelx17 tst-cleanupx4 > > ifeq ($(build-shared),yes) > tests += tst-compat-forwarder tst-audit-threads > -tests-internal += tst-tls3 tst-tls3-malloc tst-tls5 tst-stackguard1 > +tests-internal += tst-tls3 tst-tls3-malloc tst-tls5 tst-stackguard1 tst-tls7 > ifeq ($(have-z-execstack),yes) > tests += tst-execstack > endif > endif Ok, although I think we can make is non internal test. > > +one-hundred = $(foreach x,0 1 2 3 4 5 6 7 8 9, \ > + 0$x 1$x 2$x 3$x 4$x 5$x 6$x 7$x 8$x 9$x) > +tst-tls7mod-deps = $(one-hundred:%=tst-tls7mod-dep-%.so) > + > modules-names = tst-tls3mod \ > tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \ > tst-tls5modd tst-tls5mode tst-tls5modf tst-stack4mod \ > tst-execstack-mod \ > tst-compat-forwarder-mod tst-audit-threads-mod1 \ > - tst-audit-threads-mod2 > + tst-audit-threads-mod2 \ > + tst-tls7mod tst-tls7mod-dep > extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) \ > - tst-cleanup4aux.o tst-cleanupx4aux.o > + tst-cleanup4aux.o tst-cleanupx4aux.o $(tst-tls7mod-deps) > test-extras += tst-cleanup4aux tst-cleanupx4aux > > tst-tls3mod.so-no-z-defs = yes Ok. > @@ -517,6 +522,12 @@ $(objpfx)tst-tls6.out: tst-tls6.sh $(objpfx)tst-tls5 \ > $(evaluate-test) > endif > > +$(objpfx)tst-tls7: $(libdl) $(shared-thread-library) > +$(objpfx)tst-tls7.out: $(objpfx)tst-tls7mod.so > +$(objpfx)tst-tls7mod.so: $(tst-tls7mod-deps:%=$(objpfx)%) > +$(tst-tls7mod-deps:%=$(objpfx)%): $(objpfx)tst-tls7mod-dep.so > + cp -f $< $@ > + > $(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library) > > ifeq (yes,$(build-shared)) Ok. > diff --git a/nptl/tst-tls7.c b/nptl/tst-tls7.c > new file mode 100644 > index 0000000000..4b3f9005fe > --- /dev/null > +++ b/nptl/tst-tls7.c > @@ -0,0 +1,69 @@ > +/* Test concurrent dlopen and pthread_create: BZ 19329. > + Copyright (C) 2021 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 > + . */ > + > +#include > +#include > +#include > +#include > + > +#include > + > +#define THREADS 10000 > + > +static volatile int done; I think there is no need to define it volatile once it always accessed through atomic functions. > + > +static void * > +start (void *a) > +{ > + if (dlopen ("tst-tls7mod.so", RTLD_LAZY) == NULL) Use xdlopen. > + { > + printf ("dlopen failed: %s\n", dlerror ()); > + exit (1); > + } > + atomic_store_relaxed (&done, 1); > + return 0; > +} > + > +static void * > +nop (void *a) > +{ > + return 0; > +} > + > +static int > +do_test (void) > +{ > + pthread_t t1, t2; > + int i; > + > + /* Load a module with lots of dependencies and TLS. */ > + t1 = xpthread_create (0, start, 0); > + > + /* Concurrently create lots of threads until dlopen is observably done. */ > + for (i = 0; i < THREADS && !atomic_load_relaxed (&done); i++) > + { > + t2 = xpthread_create (0, nop, 0); > + xpthread_join (t2); > + } > + > + xpthread_join (t1); > + printf ("threads created during dlopen: %d\n", i); > + return 0; > +} > + > +#include Ok. > diff --git a/nptl/tst-tls7mod-dep.c b/nptl/tst-tls7mod-dep.c > new file mode 100644 > index 0000000000..206ece4fb3 > --- /dev/null > +++ b/nptl/tst-tls7mod-dep.c > @@ -0,0 +1 @@ > +int __thread x; > diff --git a/nptl/tst-tls7mod.c b/nptl/tst-tls7mod.c > new file mode 100644 > index 0000000000..206ece4fb3 > --- /dev/null > +++ b/nptl/tst-tls7mod.c > @@ -0,0 +1 @@ > +int __thread x; > Ok.