diff options
Diffstat (limited to 'meta/recipes-core/glibc/glibc/0033-elf-Add-test-case-for-BZ-19329.patch')
-rw-r--r-- | meta/recipes-core/glibc/glibc/0033-elf-Add-test-case-for-BZ-19329.patch | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/meta/recipes-core/glibc/glibc/0033-elf-Add-test-case-for-BZ-19329.patch b/meta/recipes-core/glibc/glibc/0033-elf-Add-test-case-for-BZ-19329.patch new file mode 100644 index 0000000000..f22e52ea99 --- /dev/null +++ b/meta/recipes-core/glibc/glibc/0033-elf-Add-test-case-for-BZ-19329.patch | |||
@@ -0,0 +1,144 @@ | |||
1 | From 9d0e30329c23b5ad736fda3f174208c25970dbce Mon Sep 17 00:00:00 2001 | ||
2 | From: Szabolcs Nagy <szabolcs.nagy@arm.com> | ||
3 | Date: Tue, 13 Dec 2016 12:28:41 +0000 | ||
4 | Subject: [PATCH] elf: Add test case for [BZ #19329] | ||
5 | |||
6 | Test concurrent dlopen and pthread_create when the loaded modules have | ||
7 | TLS. This triggers dl-tls assertion failures more reliably than the | ||
8 | nptl/tst-stack4 test. | ||
9 | |||
10 | The dlopened module has 100 DT_NEEDED dependencies with TLS, they were | ||
11 | reused from an existing TLS test. The number of created threads during | ||
12 | dlopen depends on filesystem speed and hardware, but at most 3 threads | ||
13 | are alive at a time to limit resource usage. | ||
14 | |||
15 | Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> | ||
16 | --- | ||
17 | elf/Makefile | 9 ++++-- | ||
18 | elf/tst-tls21.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ | ||
19 | elf/tst-tls21mod.c | 1 + | ||
20 | 3 files changed, 76 insertions(+), 2 deletions(-) | ||
21 | create mode 100644 elf/tst-tls21.c | ||
22 | create mode 100644 elf/tst-tls21mod.c | ||
23 | --- | ||
24 | Upstream-Status: Backport [https://sourceware.org/git/?p=glibc.git;a=patch;h=9d0e30329c23b5ad736fda3f174208c25970dbce] | ||
25 | Comment: Hunks from elf/Makefile are refreshed as per glibc 2.31 codebase. | ||
26 | Signed-off-by: Akash Hadke <akash.hadke@kpit.com> | ||
27 | Signed-off-by: Akash Hadke <hadkeakash4@gmail.com> | ||
28 | --- | ||
29 | diff --git a/elf/Makefile b/elf/Makefile | ||
30 | index d3e909637a..3241cb6046 100644 | ||
31 | --- a/elf/Makefile | ||
32 | +++ b/elf/Makefile | ||
33 | @@ -201,7 +201,7 @@ | ||
34 | tst-unwind-ctor tst-unwind-main tst-audit13 \ | ||
35 | tst-sonamemove-link tst-sonamemove-dlopen tst-dlopen-tlsmodid \ | ||
36 | tst-dlopen-self tst-auditmany tst-initfinilazyfail tst-dlopenfail \ | ||
37 | - tst-dlopenfail-2 | ||
38 | + tst-dlopenfail-2 tst-tls21 | ||
39 | # reldep9 | ||
40 | tests-internal += loadtest unload unload2 circleload1 \ | ||
41 | neededtest neededtest2 neededtest3 neededtest4 \ | ||
42 | @@ -312,7 +312,7 @@ | ||
43 | tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \ | ||
44 | tst-initlazyfailmod tst-finilazyfailmod \ | ||
45 | tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \ | ||
46 | - tst-dlopenfailmod3 tst-ldconfig-ld-mod | ||
47 | + tst-dlopenfailmod3 tst-ldconfig-ld-mod tst-tls21mod | ||
48 | # Most modules build with _ISOMAC defined, but those filtered out | ||
49 | # depend on internal headers. | ||
50 | modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\ | ||
51 | @@ -1697,5 +1697,10 @@ | ||
52 | $(objpfx)tst-dlopen-nodelete-reloc-mod16.so | ||
53 | LDFLAGS-tst-dlopen-nodelete-reloc-mod17.so = -Wl,--no-as-needed | ||
54 | |||
55 | +# Reuses tst-tls-many-dynamic-modules | ||
56 | +$(objpfx)tst-tls21: $(libdl) $(shared-thread-library) | ||
57 | +$(objpfx)tst-tls21.out: $(objpfx)tst-tls21mod.so | ||
58 | +$(objpfx)tst-tls21mod.so: $(tst-tls-many-dynamic-modules:%=$(objpfx)%.so) | ||
59 | + | ||
60 | $(objpfx)tst-ldconfig-ld_so_conf-update.out: $(objpfx)tst-ldconfig-ld-mod.so | ||
61 | $(objpfx)tst-ldconfig-ld_so_conf-update: $(libdl) | ||
62 | diff --git a/elf/tst-tls21.c b/elf/tst-tls21.c | ||
63 | new file mode 100644 | ||
64 | index 0000000000..560bf5813a | ||
65 | --- /dev/null | ||
66 | +++ b/elf/tst-tls21.c | ||
67 | @@ -0,0 +1,68 @@ | ||
68 | +/* Test concurrent dlopen and pthread_create: BZ 19329. | ||
69 | + Copyright (C) 2021 Free Software Foundation, Inc. | ||
70 | + This file is part of the GNU C Library. | ||
71 | + | ||
72 | + The GNU C Library is free software; you can redistribute it and/or | ||
73 | + modify it under the terms of the GNU Lesser General Public | ||
74 | + License as published by the Free Software Foundation; either | ||
75 | + version 2.1 of the License, or (at your option) any later version. | ||
76 | + | ||
77 | + The GNU C Library is distributed in the hope that it will be useful, | ||
78 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
79 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
80 | + Lesser General Public License for more details. | ||
81 | + | ||
82 | + You should have received a copy of the GNU Lesser General Public | ||
83 | + License along with the GNU C Library; if not, see | ||
84 | + <http://www.gnu.org/licenses/>. */ | ||
85 | + | ||
86 | +#include <dlfcn.h> | ||
87 | +#include <pthread.h> | ||
88 | +#include <stdio.h> | ||
89 | +#include <stdatomic.h> | ||
90 | +#include <support/xdlfcn.h> | ||
91 | +#include <support/xthread.h> | ||
92 | + | ||
93 | +#define THREADS 10000 | ||
94 | + | ||
95 | +static atomic_int done; | ||
96 | + | ||
97 | +static void * | ||
98 | +start (void *a) | ||
99 | +{ | ||
100 | + /* Load a module with many dependencies that each have TLS. */ | ||
101 | + xdlopen ("tst-tls21mod.so", RTLD_LAZY); | ||
102 | + atomic_store_explicit (&done, 1, memory_order_release); | ||
103 | + return 0; | ||
104 | +} | ||
105 | + | ||
106 | +static void * | ||
107 | +nop (void *a) | ||
108 | +{ | ||
109 | + return 0; | ||
110 | +} | ||
111 | + | ||
112 | +static int | ||
113 | +do_test (void) | ||
114 | +{ | ||
115 | + pthread_t t1, t2; | ||
116 | + int i; | ||
117 | + | ||
118 | + /* Load a module with lots of dependencies and TLS. */ | ||
119 | + t1 = xpthread_create (0, start, 0); | ||
120 | + | ||
121 | + /* Concurrently create lots of threads until dlopen is observably done. */ | ||
122 | + for (i = 0; i < THREADS; i++) | ||
123 | + { | ||
124 | + if (atomic_load_explicit (&done, memory_order_acquire) != 0) | ||
125 | + break; | ||
126 | + t2 = xpthread_create (0, nop, 0); | ||
127 | + xpthread_join (t2); | ||
128 | + } | ||
129 | + | ||
130 | + xpthread_join (t1); | ||
131 | + printf ("threads created during dlopen: %d\n", i); | ||
132 | + return 0; | ||
133 | +} | ||
134 | + | ||
135 | +#include <support/test-driver.c> | ||
136 | diff --git a/elf/tst-tls21mod.c b/elf/tst-tls21mod.c | ||
137 | new file mode 100644 | ||
138 | index 0000000000..206ece4fb3 | ||
139 | --- /dev/null | ||
140 | +++ b/elf/tst-tls21mod.c | ||
141 | @@ -0,0 +1 @@ | ||
142 | +int __thread x; | ||
143 | -- | ||
144 | 2.27.0 | ||