glibc: update upstream patches
This commit is contained in:
parent
bf1e08a93b
commit
6150038d3a
|
@ -237,3 +237,4 @@ index 42da321149..17ea905aa6 100644
|
|||
return result;
|
||||
#endif
|
||||
/* Trying to emulate the pwritev2 syscall flags is troublesome:
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
From 5473739a7b44f27965b70d1acf480f5f72603e78 Mon Sep 17 00:00:00 2001
|
||||
From: Rafal Luzynski <digitalfreak@lingonborough.com>
|
||||
Date: Tue, 2 Oct 2018 23:34:18 +0200
|
||||
Subject: [PATCH 21] kl_GL: Fix spelling of Sunday, should be "sapaat" (bug
|
||||
20209).
|
||||
|
||||
Although CLDR says otherwise, it is confirmed by Oqaasileriffik, the
|
||||
official Greenlandic language regulator, that this change is correct.
|
||||
|
||||
[BZ #20209]
|
||||
* localedata/locales/kl_GL: (abday): Fix spelling of Sun (Sunday),
|
||||
should be "sap" rather than "sab".
|
||||
(day): Fix spelling of Sunday, should be "sapaat" rather than
|
||||
"sabaat".
|
||||
|
||||
(cherry picked from commit dae3ed958c3d0090838e49ff4f78c201262b1cf0)
|
||||
---
|
||||
ChangeLog | 8 ++++++++
|
||||
NEWS | 1 +
|
||||
localedata/locales/kl_GL | 4 ++--
|
||||
3 files changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 11a9b8d98e..32b9cbfbe2 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,11 @@
|
||||
+2018-10-09 Rafal Luzynski <digitalfreak@lingonborough.com>
|
||||
+
|
||||
+ [BZ #20209]
|
||||
+ * localedata/locales/kl_GL: (abday): Fix spelling of Sun (Sunday),
|
||||
+ should be "sap" rather than "sab".
|
||||
+ (day): Fix spelling of Sunday, should be "sapaat" rather than
|
||||
+ "sabaat".
|
||||
+
|
||||
2018-09-28 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
[BZ #23579]
|
||||
diff --git a/NEWS b/NEWS
|
||||
index fd14941128..594cecfc75 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -9,6 +9,7 @@ Version 2.28.1
|
||||
|
||||
The following bugs are resolved with this release:
|
||||
|
||||
+ [20209] localedata: Spelling mistake for Sunday in Greenlandic kl_GL
|
||||
[23497] readdir64@GLIBC_2.1 cannot parse the kernel directory stream
|
||||
[23521] nss_files aliases database file stream leak
|
||||
[23538] pthread_cond_broadcast: Fix waiters-after-spinning case
|
||||
diff --git a/localedata/locales/kl_GL b/localedata/locales/kl_GL
|
||||
index 5ab14a31aa..5723ce7dcf 100644
|
||||
--- a/localedata/locales/kl_GL
|
||||
+++ b/localedata/locales/kl_GL
|
||||
@@ -70,11 +70,11 @@ copy "da_DK"
|
||||
END LC_NUMERIC
|
||||
|
||||
LC_TIME
|
||||
-abday "sab";"ata";/
|
||||
+abday "sap";"ata";/
|
||||
"mar";"pin";/
|
||||
"sis";"tal";/
|
||||
"arf"
|
||||
-day "sabaat";/
|
||||
+day "sapaat";/
|
||||
"ataasinngorneq";/
|
||||
"marlunngorneq";/
|
||||
"pingasunngorneq";/
|
||||
|
|
@ -0,0 +1,161 @@
|
|||
From 5a74abda201907cafbdabd1debf98890313ff71e Mon Sep 17 00:00:00 2001
|
||||
From: "H.J. Lu" <hjl.tools@gmail.com>
|
||||
Date: Fri, 28 Sep 2018 13:31:19 -0700
|
||||
Subject: [PATCH 22] i386: Use _dl_runtime_[resolve|profile]_shstk for SHSTK
|
||||
[BZ #23716]
|
||||
|
||||
When elf_machine_runtime_setup is called to set up resolver, it should
|
||||
use _dl_runtime_resolve_shstk or _dl_runtime_profile_shstk if SHSTK is
|
||||
enabled by kernel.
|
||||
|
||||
Tested on i686 with and without --enable-cet as well as on CET emulator
|
||||
with --enable-cet.
|
||||
|
||||
[BZ #23716]
|
||||
* sysdeps/i386/dl-cet.c: Removed.
|
||||
* sysdeps/i386/dl-machine.h (_dl_runtime_resolve_shstk): New
|
||||
prototype.
|
||||
(_dl_runtime_profile_shstk): Likewise.
|
||||
(elf_machine_runtime_setup): Use _dl_runtime_profile_shstk or
|
||||
_dl_runtime_resolve_shstk if SHSTK is enabled by kernel.
|
||||
|
||||
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
|
||||
|
||||
(cherry picked from commit 7b1f9406761331cf35fe521fbdb592beecf68a2c)
|
||||
---
|
||||
ChangeLog | 10 ++++++
|
||||
sysdeps/i386/dl-cet.c | 67 ---------------------------------------
|
||||
sysdeps/i386/dl-machine.h | 13 ++++++--
|
||||
3 files changed, 21 insertions(+), 69 deletions(-)
|
||||
delete mode 100644 sysdeps/i386/dl-cet.c
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 32b9cbfbe2..7f4c6a48bc 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,13 @@
|
||||
+2018-10-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||
+
|
||||
+ [BZ #23716]
|
||||
+ * sysdeps/i386/dl-cet.c: Removed.
|
||||
+ * sysdeps/i386/dl-machine.h (_dl_runtime_resolve_shstk): New
|
||||
+ prototype.
|
||||
+ (_dl_runtime_profile_shstk): Likewise.
|
||||
+ (elf_machine_runtime_setup): Use _dl_runtime_profile_shstk or
|
||||
+ _dl_runtime_resolve_shstk if SHSTK is enabled by kernel.
|
||||
+
|
||||
2018-10-09 Rafal Luzynski <digitalfreak@lingonborough.com>
|
||||
|
||||
[BZ #20209]
|
||||
diff --git a/sysdeps/i386/dl-cet.c b/sysdeps/i386/dl-cet.c
|
||||
deleted file mode 100644
|
||||
index 5d9a4e8d51..0000000000
|
||||
--- a/sysdeps/i386/dl-cet.c
|
||||
+++ /dev/null
|
||||
@@ -1,67 +0,0 @@
|
||||
-/* Linux/i386 CET initializers function.
|
||||
- Copyright (C) 2018 Free Software Foundation, Inc.
|
||||
-
|
||||
- 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/>. */
|
||||
-
|
||||
-
|
||||
-#define LINKAGE static inline
|
||||
-#define _dl_cet_check cet_check
|
||||
-#include <sysdeps/x86/dl-cet.c>
|
||||
-#undef _dl_cet_check
|
||||
-
|
||||
-#ifdef SHARED
|
||||
-void
|
||||
-_dl_cet_check (struct link_map *main_map, const char *program)
|
||||
-{
|
||||
- cet_check (main_map, program);
|
||||
-
|
||||
- if ((GL(dl_x86_feature_1)[0] & GNU_PROPERTY_X86_FEATURE_1_SHSTK))
|
||||
- {
|
||||
- /* Replace _dl_runtime_resolve and _dl_runtime_profile with
|
||||
- _dl_runtime_resolve_shstk and _dl_runtime_profile_shstk,
|
||||
- respectively if SHSTK is enabled. */
|
||||
- extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
|
||||
- extern void _dl_runtime_resolve_shstk (Elf32_Word) attribute_hidden;
|
||||
- extern void _dl_runtime_profile (Elf32_Word) attribute_hidden;
|
||||
- extern void _dl_runtime_profile_shstk (Elf32_Word) attribute_hidden;
|
||||
- unsigned int i;
|
||||
- struct link_map *l;
|
||||
- Elf32_Addr *got;
|
||||
-
|
||||
- if (main_map->l_info[DT_JMPREL])
|
||||
- {
|
||||
- got = (Elf32_Addr *) D_PTR (main_map, l_info[DT_PLTGOT]);
|
||||
- if (got[2] == (Elf32_Addr) &_dl_runtime_resolve)
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_resolve_shstk;
|
||||
- else if (got[2] == (Elf32_Addr) &_dl_runtime_profile)
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_profile_shstk;
|
||||
- }
|
||||
-
|
||||
- i = main_map->l_searchlist.r_nlist;
|
||||
- while (i-- > 0)
|
||||
- {
|
||||
- l = main_map->l_initfini[i];
|
||||
- if (l->l_info[DT_JMPREL])
|
||||
- {
|
||||
- got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
- if (got[2] == (Elf32_Addr) &_dl_runtime_resolve)
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_resolve_shstk;
|
||||
- else if (got[2] == (Elf32_Addr) &_dl_runtime_profile)
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_profile_shstk;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-}
|
||||
-#endif
|
||||
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
|
||||
index 1afdcbd9ea..f6cfb90e21 100644
|
||||
--- a/sysdeps/i386/dl-machine.h
|
||||
+++ b/sysdeps/i386/dl-machine.h
|
||||
@@ -67,6 +67,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
Elf32_Addr *got;
|
||||
extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
|
||||
extern void _dl_runtime_profile (Elf32_Word) attribute_hidden;
|
||||
+ extern void _dl_runtime_resolve_shstk (Elf32_Word) attribute_hidden;
|
||||
+ extern void _dl_runtime_profile_shstk (Elf32_Word) attribute_hidden;
|
||||
+ /* Check if SHSTK is enabled by kernel. */
|
||||
+ bool shstk_enabled
|
||||
+ = (GL(dl_x86_feature_1)[0] & GNU_PROPERTY_X86_FEATURE_1_SHSTK) != 0;
|
||||
|
||||
if (l->l_info[DT_JMPREL] && lazy)
|
||||
{
|
||||
@@ -93,7 +98,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
end in this function. */
|
||||
if (__glibc_unlikely (profile))
|
||||
{
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||
+ got[2] = (shstk_enabled
|
||||
+ ? (Elf32_Addr) &_dl_runtime_profile_shstk
|
||||
+ : (Elf32_Addr) &_dl_runtime_profile);
|
||||
|
||||
if (GLRO(dl_profile) != NULL
|
||||
&& _dl_name_match_p (GLRO(dl_profile), l))
|
||||
@@ -104,7 +111,9 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
else
|
||||
/* This function will get called to fix up the GOT entry indicated by
|
||||
the offset on the stack, and then jump to the resolved address. */
|
||||
- got[2] = (Elf32_Addr) &_dl_runtime_resolve;
|
||||
+ got[2] = (shstk_enabled
|
||||
+ ? (Elf32_Addr) &_dl_runtime_resolve_shstk
|
||||
+ : (Elf32_Addr) &_dl_runtime_resolve);
|
||||
}
|
||||
|
||||
return lazy;
|
||||
|
|
@ -0,0 +1,800 @@
|
|||
From 314e181dc90cb290942d8b2b57823306ae956696 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Liebler <stli@linux.ibm.com>
|
||||
Date: Wed, 17 Oct 2018 12:23:04 +0200
|
||||
Subject: [PATCH 23] Fix race in pthread_mutex_lock while promoting to
|
||||
PTHREAD_MUTEX_ELISION_NP [BZ #23275]
|
||||
|
||||
The race leads either to pthread_mutex_destroy returning EBUSY
|
||||
or triggering an assertion (See description in bugzilla).
|
||||
|
||||
This patch is fixing the race by ensuring that the elision path is
|
||||
used in all cases if elision is enabled by the GLIBC_TUNABLES framework.
|
||||
|
||||
The __kind variable in struct __pthread_mutex_s is accessed concurrently.
|
||||
Therefore we are now using the atomic macros.
|
||||
|
||||
The new testcase tst-mutex10 is triggering the race on s390x and intel.
|
||||
Presumably also on power, but I don't have access to a power machine
|
||||
with lock-elision. At least the code for power is the same as on the other
|
||||
two architectures.
|
||||
|
||||
ChangeLog:
|
||||
|
||||
[BZ #23275]
|
||||
* nptl/tst-mutex10.c: New File.
|
||||
* nptl/Makefile (tests): Add tst-mutex10.
|
||||
(tst-mutex10-ENV): New variable.
|
||||
* sysdeps/unix/sysv/linux/s390/force-elision.h: (FORCE_ELISION):
|
||||
Ensure that elision path is used if elision is available.
|
||||
* sysdeps/unix/sysv/linux/powerpc/force-elision.h (FORCE_ELISION):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86/force-elision.h: (FORCE_ELISION):
|
||||
Likewise.
|
||||
* nptl/pthreadP.h (PTHREAD_MUTEX_TYPE, PTHREAD_MUTEX_TYPE_ELISION)
|
||||
(PTHREAD_MUTEX_PSHARED): Use atomic_load_relaxed.
|
||||
* nptl/pthread_mutex_consistent.c (pthread_mutex_consistent): Likewise.
|
||||
* nptl/pthread_mutex_getprioceiling.c (pthread_mutex_getprioceiling):
|
||||
Likewise.
|
||||
* nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full)
|
||||
(__pthread_mutex_cond_lock_adjust): Likewise.
|
||||
* nptl/pthread_mutex_setprioceiling.c (pthread_mutex_setprioceiling):
|
||||
Likewise.
|
||||
* nptl/pthread_mutex_timedlock.c (__pthread_mutex_timedlock): Likewise.
|
||||
* nptl/pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise.
|
||||
* nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Likewise.
|
||||
* sysdeps/nptl/bits/thread-shared-types.h (struct __pthread_mutex_s):
|
||||
Add comments.
|
||||
* nptl/pthread_mutex_destroy.c (__pthread_mutex_destroy):
|
||||
Use atomic_load_relaxed and atomic_store_relaxed.
|
||||
* nptl/pthread_mutex_init.c (__pthread_mutex_init):
|
||||
Use atomic_store_relaxed.
|
||||
|
||||
(cherry picked from commit 403b4feb22dcbc85ace72a361d2a951380372471)
|
||||
---
|
||||
ChangeLog | 31 +++++
|
||||
nptl/Makefile | 8 +-
|
||||
nptl/pthreadP.h | 12 +-
|
||||
nptl/pthread_mutex_consistent.c | 7 +-
|
||||
nptl/pthread_mutex_destroy.c | 11 +-
|
||||
nptl/pthread_mutex_getprioceiling.c | 4 +-
|
||||
nptl/pthread_mutex_init.c | 14 ++-
|
||||
nptl/pthread_mutex_lock.c | 28 +++--
|
||||
nptl/pthread_mutex_setprioceiling.c | 7 +-
|
||||
nptl/pthread_mutex_timedlock.c | 17 ++-
|
||||
nptl/pthread_mutex_trylock.c | 17 ++-
|
||||
nptl/pthread_mutex_unlock.c | 17 ++-
|
||||
nptl/tst-mutex10.c | 109 ++++++++++++++++++
|
||||
sysdeps/nptl/bits/thread-shared-types.h | 22 +++-
|
||||
.../unix/sysv/linux/powerpc/force-elision.h | 44 ++++++-
|
||||
sysdeps/unix/sysv/linux/s390/force-elision.h | 44 ++++++-
|
||||
sysdeps/unix/sysv/linux/x86/force-elision.h | 44 ++++++-
|
||||
17 files changed, 386 insertions(+), 50 deletions(-)
|
||||
create mode 100644 nptl/tst-mutex10.c
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 7f4c6a48bc..5b743f2fdb 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,34 @@
|
||||
+2018-10-17 Stefan Liebler <stli@linux.ibm.com>
|
||||
+
|
||||
+ [BZ #23275]
|
||||
+ * nptl/tst-mutex10.c: New File.
|
||||
+ * nptl/Makefile (tests): Add tst-mutex10.
|
||||
+ (tst-mutex10-ENV): New variable.
|
||||
+ * sysdeps/unix/sysv/linux/s390/force-elision.h: (FORCE_ELISION):
|
||||
+ Ensure that elision path is used if elision is available.
|
||||
+ * sysdeps/unix/sysv/linux/powerpc/force-elision.h (FORCE_ELISION):
|
||||
+ Likewise.
|
||||
+ * sysdeps/unix/sysv/linux/x86/force-elision.h: (FORCE_ELISION):
|
||||
+ Likewise.
|
||||
+ * nptl/pthreadP.h (PTHREAD_MUTEX_TYPE, PTHREAD_MUTEX_TYPE_ELISION)
|
||||
+ (PTHREAD_MUTEX_PSHARED): Use atomic_load_relaxed.
|
||||
+ * nptl/pthread_mutex_consistent.c (pthread_mutex_consistent): Likewise.
|
||||
+ * nptl/pthread_mutex_getprioceiling.c (pthread_mutex_getprioceiling):
|
||||
+ Likewise.
|
||||
+ * nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full)
|
||||
+ (__pthread_mutex_cond_lock_adjust): Likewise.
|
||||
+ * nptl/pthread_mutex_setprioceiling.c (pthread_mutex_setprioceiling):
|
||||
+ Likewise.
|
||||
+ * nptl/pthread_mutex_timedlock.c (__pthread_mutex_timedlock): Likewise.
|
||||
+ * nptl/pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise.
|
||||
+ * nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Likewise.
|
||||
+ * sysdeps/nptl/bits/thread-shared-types.h (struct __pthread_mutex_s):
|
||||
+ Add comments.
|
||||
+ * nptl/pthread_mutex_destroy.c (__pthread_mutex_destroy):
|
||||
+ Use atomic_load_relaxed and atomic_store_relaxed.
|
||||
+ * nptl/pthread_mutex_init.c (__pthread_mutex_init):
|
||||
+ Use atomic_store_relaxed.
|
||||
+
|
||||
2018-10-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
[BZ #23716]
|
||||
diff --git a/nptl/Makefile b/nptl/Makefile
|
||||
index be8066524c..49b6faa330 100644
|
||||
--- a/nptl/Makefile
|
||||
+++ b/nptl/Makefile
|
||||
@@ -241,9 +241,9 @@ LDLIBS-tst-minstack-throw = -lstdc++
|
||||
|
||||
tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
|
||||
tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 tst-mutex5 tst-mutex6 \
|
||||
- tst-mutex7 tst-mutex9 tst-mutex5a tst-mutex7a tst-mutex7robust \
|
||||
- tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 tst-mutexpi5 \
|
||||
- tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a \
|
||||
+ tst-mutex7 tst-mutex9 tst-mutex10 tst-mutex5a tst-mutex7a \
|
||||
+ tst-mutex7robust tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 \
|
||||
+ tst-mutexpi5 tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 tst-mutexpi7a \
|
||||
tst-mutexpi9 \
|
||||
tst-spin1 tst-spin2 tst-spin3 tst-spin4 \
|
||||
tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
|
||||
@@ -709,6 +709,8 @@ endif
|
||||
|
||||
$(objpfx)tst-compat-forwarder: $(objpfx)tst-compat-forwarder-mod.so
|
||||
|
||||
+tst-mutex10-ENV = GLIBC_TUNABLES=glibc.elision.enable=1
|
||||
+
|
||||
# The tests here better do not run in parallel
|
||||
ifneq ($(filter %tests,$(MAKECMDGOALS)),)
|
||||
.NOTPARALLEL:
|
||||
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
|
||||
index 13bdb11133..19efe1e35f 100644
|
||||
--- a/nptl/pthreadP.h
|
||||
+++ b/nptl/pthreadP.h
|
||||
@@ -110,19 +110,23 @@ enum
|
||||
};
|
||||
#define PTHREAD_MUTEX_PSHARED_BIT 128
|
||||
|
||||
+/* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
#define PTHREAD_MUTEX_TYPE(m) \
|
||||
- ((m)->__data.__kind & 127)
|
||||
+ (atomic_load_relaxed (&((m)->__data.__kind)) & 127)
|
||||
/* Don't include NO_ELISION, as that type is always the same
|
||||
as the underlying lock type. */
|
||||
#define PTHREAD_MUTEX_TYPE_ELISION(m) \
|
||||
- ((m)->__data.__kind & (127|PTHREAD_MUTEX_ELISION_NP))
|
||||
+ (atomic_load_relaxed (&((m)->__data.__kind)) \
|
||||
+ & (127 | PTHREAD_MUTEX_ELISION_NP))
|
||||
|
||||
#if LLL_PRIVATE == 0 && LLL_SHARED == 128
|
||||
# define PTHREAD_MUTEX_PSHARED(m) \
|
||||
- ((m)->__data.__kind & 128)
|
||||
+ (atomic_load_relaxed (&((m)->__data.__kind)) & 128)
|
||||
#else
|
||||
# define PTHREAD_MUTEX_PSHARED(m) \
|
||||
- (((m)->__data.__kind & 128) ? LLL_SHARED : LLL_PRIVATE)
|
||||
+ ((atomic_load_relaxed (&((m)->__data.__kind)) & 128) \
|
||||
+ ? LLL_SHARED : LLL_PRIVATE)
|
||||
#endif
|
||||
|
||||
/* The kernel when waking robust mutexes on exit never uses
|
||||
diff --git a/nptl/pthread_mutex_consistent.c b/nptl/pthread_mutex_consistent.c
|
||||
index 85b8e1a6cb..4fbd875430 100644
|
||||
--- a/nptl/pthread_mutex_consistent.c
|
||||
+++ b/nptl/pthread_mutex_consistent.c
|
||||
@@ -23,8 +23,11 @@
|
||||
int
|
||||
pthread_mutex_consistent (pthread_mutex_t *mutex)
|
||||
{
|
||||
- /* Test whether this is a robust mutex with a dead owner. */
|
||||
- if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0
|
||||
+ /* Test whether this is a robust mutex with a dead owner.
|
||||
+ See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0
|
||||
|| mutex->__data.__owner != PTHREAD_MUTEX_INCONSISTENT)
|
||||
return EINVAL;
|
||||
|
||||
diff --git a/nptl/pthread_mutex_destroy.c b/nptl/pthread_mutex_destroy.c
|
||||
index 5a22611541..713ea68496 100644
|
||||
--- a/nptl/pthread_mutex_destroy.c
|
||||
+++ b/nptl/pthread_mutex_destroy.c
|
||||
@@ -27,12 +27,17 @@ __pthread_mutex_destroy (pthread_mutex_t *mutex)
|
||||
{
|
||||
LIBC_PROBE (mutex_destroy, 1, mutex);
|
||||
|
||||
- if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0
|
||||
&& mutex->__data.__nusers != 0)
|
||||
return EBUSY;
|
||||
|
||||
- /* Set to an invalid value. */
|
||||
- mutex->__data.__kind = -1;
|
||||
+ /* Set to an invalid value. Relaxed MO is enough as it is undefined behavior
|
||||
+ if the mutex is used after it has been destroyed. But you can reinitialize
|
||||
+ it with pthread_mutex_init. */
|
||||
+ atomic_store_relaxed (&(mutex->__data.__kind), -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/nptl/pthread_mutex_getprioceiling.c b/nptl/pthread_mutex_getprioceiling.c
|
||||
index efa37b0d99..ee85949578 100644
|
||||
--- a/nptl/pthread_mutex_getprioceiling.c
|
||||
+++ b/nptl/pthread_mutex_getprioceiling.c
|
||||
@@ -24,7 +24,9 @@
|
||||
int
|
||||
pthread_mutex_getprioceiling (const pthread_mutex_t *mutex, int *prioceiling)
|
||||
{
|
||||
- if (__builtin_expect ((mutex->__data.__kind
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if (__builtin_expect ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
& PTHREAD_MUTEX_PRIO_PROTECT_NP) == 0, 0))
|
||||
return EINVAL;
|
||||
|
||||
diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
|
||||
index d8fe473728..5cf290c272 100644
|
||||
--- a/nptl/pthread_mutex_init.c
|
||||
+++ b/nptl/pthread_mutex_init.c
|
||||
@@ -101,7 +101,7 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
|
||||
memset (mutex, '\0', __SIZEOF_PTHREAD_MUTEX_T);
|
||||
|
||||
/* Copy the values from the attribute. */
|
||||
- mutex->__data.__kind = imutexattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS;
|
||||
+ int mutex_kind = imutexattr->mutexkind & ~PTHREAD_MUTEXATTR_FLAG_BITS;
|
||||
|
||||
if ((imutexattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_ROBUST) != 0)
|
||||
{
|
||||
@@ -111,17 +111,17 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
|
||||
return ENOTSUP;
|
||||
#endif
|
||||
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ mutex_kind |= PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
}
|
||||
|
||||
switch (imutexattr->mutexkind & PTHREAD_MUTEXATTR_PROTOCOL_MASK)
|
||||
{
|
||||
case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_INHERIT_NP;
|
||||
+ mutex_kind |= PTHREAD_MUTEX_PRIO_INHERIT_NP;
|
||||
break;
|
||||
|
||||
case PTHREAD_PRIO_PROTECT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_PRIO_PROTECT_NP;
|
||||
+ mutex_kind |= PTHREAD_MUTEX_PRIO_PROTECT_NP;
|
||||
|
||||
int ceiling = (imutexattr->mutexkind
|
||||
& PTHREAD_MUTEXATTR_PRIO_CEILING_MASK)
|
||||
@@ -145,7 +145,11 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
|
||||
FUTEX_PRIVATE_FLAG FUTEX_WAKE. */
|
||||
if ((imutexattr->mutexkind & (PTHREAD_MUTEXATTR_FLAG_PSHARED
|
||||
| PTHREAD_MUTEXATTR_FLAG_ROBUST)) != 0)
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_PSHARED_BIT;
|
||||
+ mutex_kind |= PTHREAD_MUTEX_PSHARED_BIT;
|
||||
+
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ atomic_store_relaxed (&(mutex->__data.__kind), mutex_kind);
|
||||
|
||||
/* Default values: mutex not used yet. */
|
||||
// mutex->__count = 0; already done by memset
|
||||
diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c
|
||||
index 1519c142bd..29cc143e6c 100644
|
||||
--- a/nptl/pthread_mutex_lock.c
|
||||
+++ b/nptl/pthread_mutex_lock.c
|
||||
@@ -62,6 +62,8 @@ static int __pthread_mutex_lock_full (pthread_mutex_t *mutex)
|
||||
int
|
||||
__pthread_mutex_lock (pthread_mutex_t *mutex)
|
||||
{
|
||||
+ /* See concurrency notes regarding mutex type which is loaded from __kind
|
||||
+ in struct __pthread_mutex_s in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
|
||||
|
||||
LIBC_PROBE (mutex_entry, 1, mutex);
|
||||
@@ -350,8 +352,14 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
|
||||
case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
- int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ int kind, robust;
|
||||
+ {
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int mutex_kind = atomic_load_relaxed (&(mutex->__data.__kind));
|
||||
+ kind = mutex_kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ robust = mutex_kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ }
|
||||
|
||||
if (robust)
|
||||
{
|
||||
@@ -502,7 +510,10 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
|
||||
case PTHREAD_MUTEX_PP_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PP_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int kind = atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
|
||||
oldval = mutex->__data.__lock;
|
||||
|
||||
@@ -607,15 +618,18 @@ hidden_def (__pthread_mutex_lock)
|
||||
void
|
||||
__pthread_mutex_cond_lock_adjust (pthread_mutex_t *mutex)
|
||||
{
|
||||
- assert ((mutex->__data.__kind & PTHREAD_MUTEX_PRIO_INHERIT_NP) != 0);
|
||||
- assert ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0);
|
||||
- assert ((mutex->__data.__kind & PTHREAD_MUTEX_PSHARED_BIT) == 0);
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int mutex_kind = atomic_load_relaxed (&(mutex->__data.__kind));
|
||||
+ assert ((mutex_kind & PTHREAD_MUTEX_PRIO_INHERIT_NP) != 0);
|
||||
+ assert ((mutex_kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0);
|
||||
+ assert ((mutex_kind & PTHREAD_MUTEX_PSHARED_BIT) == 0);
|
||||
|
||||
/* Record the ownership. */
|
||||
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
||||
mutex->__data.__owner = id;
|
||||
|
||||
- if (mutex->__data.__kind == PTHREAD_MUTEX_PI_RECURSIVE_NP)
|
||||
+ if (mutex_kind == PTHREAD_MUTEX_PI_RECURSIVE_NP)
|
||||
++mutex->__data.__count;
|
||||
}
|
||||
#endif
|
||||
diff --git a/nptl/pthread_mutex_setprioceiling.c b/nptl/pthread_mutex_setprioceiling.c
|
||||
index 8594874f85..8306cabcf4 100644
|
||||
--- a/nptl/pthread_mutex_setprioceiling.c
|
||||
+++ b/nptl/pthread_mutex_setprioceiling.c
|
||||
@@ -27,9 +27,10 @@ int
|
||||
pthread_mutex_setprioceiling (pthread_mutex_t *mutex, int prioceiling,
|
||||
int *old_ceiling)
|
||||
{
|
||||
- /* The low bits of __kind aren't ever changed after pthread_mutex_init,
|
||||
- so we don't need a lock yet. */
|
||||
- if ((mutex->__data.__kind & PTHREAD_MUTEX_PRIO_PROTECT_NP) == 0)
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_PRIO_PROTECT_NP) == 0)
|
||||
return EINVAL;
|
||||
|
||||
/* See __init_sched_fifo_prio. */
|
||||
diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c
|
||||
index 28237b0e58..888c12fe28 100644
|
||||
--- a/nptl/pthread_mutex_timedlock.c
|
||||
+++ b/nptl/pthread_mutex_timedlock.c
|
||||
@@ -53,6 +53,8 @@ __pthread_mutex_timedlock (pthread_mutex_t *mutex,
|
||||
/* We must not check ABSTIME here. If the thread does not block
|
||||
abstime must not be checked for a valid value. */
|
||||
|
||||
+ /* See concurrency notes regarding mutex type which is loaded from __kind
|
||||
+ in struct __pthread_mutex_s in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex),
|
||||
PTHREAD_MUTEX_TIMED_NP))
|
||||
{
|
||||
@@ -338,8 +340,14 @@ __pthread_mutex_timedlock (pthread_mutex_t *mutex,
|
||||
case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
- int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ int kind, robust;
|
||||
+ {
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int mutex_kind = atomic_load_relaxed (&(mutex->__data.__kind));
|
||||
+ kind = mutex_kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ robust = mutex_kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ }
|
||||
|
||||
if (robust)
|
||||
{
|
||||
@@ -509,7 +517,10 @@ __pthread_mutex_timedlock (pthread_mutex_t *mutex,
|
||||
case PTHREAD_MUTEX_PP_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PP_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int kind = atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
|
||||
oldval = mutex->__data.__lock;
|
||||
|
||||
diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c
|
||||
index 7de61f4f68..fa90c1d1e6 100644
|
||||
--- a/nptl/pthread_mutex_trylock.c
|
||||
+++ b/nptl/pthread_mutex_trylock.c
|
||||
@@ -36,6 +36,8 @@ __pthread_mutex_trylock (pthread_mutex_t *mutex)
|
||||
int oldval;
|
||||
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
||||
|
||||
+ /* See concurrency notes regarding mutex type which is loaded from __kind
|
||||
+ in struct __pthread_mutex_s in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex),
|
||||
PTHREAD_MUTEX_TIMED_NP))
|
||||
{
|
||||
@@ -199,8 +201,14 @@ __pthread_mutex_trylock (pthread_mutex_t *mutex)
|
||||
case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
- int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ int kind, robust;
|
||||
+ {
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int mutex_kind = atomic_load_relaxed (&(mutex->__data.__kind));
|
||||
+ kind = mutex_kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ robust = mutex_kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ }
|
||||
|
||||
if (robust)
|
||||
/* Note: robust PI futexes are signaled by setting bit 0. */
|
||||
@@ -325,7 +333,10 @@ __pthread_mutex_trylock (pthread_mutex_t *mutex)
|
||||
case PTHREAD_MUTEX_PP_NORMAL_NP:
|
||||
case PTHREAD_MUTEX_PP_ADAPTIVE_NP:
|
||||
{
|
||||
- int kind = mutex->__data.__kind & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int kind = atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_KIND_MASK_NP;
|
||||
|
||||
oldval = mutex->__data.__lock;
|
||||
|
||||
diff --git a/nptl/pthread_mutex_unlock.c b/nptl/pthread_mutex_unlock.c
|
||||
index 9ea62943b7..68d04d5395 100644
|
||||
--- a/nptl/pthread_mutex_unlock.c
|
||||
+++ b/nptl/pthread_mutex_unlock.c
|
||||
@@ -35,6 +35,8 @@ int
|
||||
attribute_hidden
|
||||
__pthread_mutex_unlock_usercnt (pthread_mutex_t *mutex, int decr)
|
||||
{
|
||||
+ /* See concurrency notes regarding mutex type which is loaded from __kind
|
||||
+ in struct __pthread_mutex_s in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
|
||||
if (__builtin_expect (type &
|
||||
~(PTHREAD_MUTEX_KIND_MASK_NP|PTHREAD_MUTEX_ELISION_FLAGS_NP), 0))
|
||||
@@ -222,13 +224,19 @@ __pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr)
|
||||
/* If the previous owner died and the caller did not succeed in
|
||||
making the state consistent, mark the mutex as unrecoverable
|
||||
and make all waiters. */
|
||||
- if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0
|
||||
&& __builtin_expect (mutex->__data.__owner
|
||||
== PTHREAD_MUTEX_INCONSISTENT, 0))
|
||||
pi_notrecoverable:
|
||||
newowner = PTHREAD_MUTEX_NOTRECOVERABLE;
|
||||
|
||||
- if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0)
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ if ((atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_ROBUST_NORMAL_NP) != 0)
|
||||
{
|
||||
continue_pi_robust:
|
||||
/* Remove mutex from the list.
|
||||
@@ -251,7 +259,10 @@ __pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr)
|
||||
/* Unlock. Load all necessary mutex data before releasing the mutex
|
||||
to not violate the mutex destruction requirements (see
|
||||
lll_unlock). */
|
||||
- int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
+ /* See concurrency notes regarding __kind in struct __pthread_mutex_s
|
||||
+ in sysdeps/nptl/bits/thread-shared-types.h. */
|
||||
+ int robust = atomic_load_relaxed (&(mutex->__data.__kind))
|
||||
+ & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
|
||||
private = (robust
|
||||
? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
|
||||
: PTHREAD_MUTEX_PSHARED (mutex));
|
||||
diff --git a/nptl/tst-mutex10.c b/nptl/tst-mutex10.c
|
||||
new file mode 100644
|
||||
index 0000000000..e1113ca60a
|
||||
--- /dev/null
|
||||
+++ b/nptl/tst-mutex10.c
|
||||
@@ -0,0 +1,109 @@
|
||||
+/* Testing race while enabling lock elision.
|
||||
+ 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 <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <stdint.h>
|
||||
+#include <pthread.h>
|
||||
+#include <unistd.h>
|
||||
+#include <getopt.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/xthread.h>
|
||||
+
|
||||
+static pthread_barrier_t barrier;
|
||||
+static pthread_mutex_t mutex;
|
||||
+static long long int iteration_count = 1000000;
|
||||
+static unsigned int thread_count = 3;
|
||||
+
|
||||
+static void *
|
||||
+thr_func (void *arg)
|
||||
+{
|
||||
+ long long int i;
|
||||
+ for (i = 0; i < iteration_count; i++)
|
||||
+ {
|
||||
+ if ((uintptr_t) arg == 0)
|
||||
+ {
|
||||
+ xpthread_mutex_destroy (&mutex);
|
||||
+ xpthread_mutex_init (&mutex, NULL);
|
||||
+ }
|
||||
+
|
||||
+ xpthread_barrier_wait (&barrier);
|
||||
+
|
||||
+ /* Test if enabling lock elision works if it is enabled concurrently.
|
||||
+ There was a race in FORCE_ELISION macro which leads to either
|
||||
+ pthread_mutex_destroy returning EBUSY as the owner was recorded
|
||||
+ by pthread_mutex_lock - in "normal mutex" code path - but was not
|
||||
+ resetted in pthread_mutex_unlock - in "elision" code path.
|
||||
+ Or it leads to the assertion in nptl/pthread_mutex_lock.c:
|
||||
+ assert (mutex->__data.__owner == 0);
|
||||
+ Please ensure that the test is run with lock elision:
|
||||
+ export GLIBC_TUNABLES=glibc.elision.enable=1 */
|
||||
+ xpthread_mutex_lock (&mutex);
|
||||
+ xpthread_mutex_unlock (&mutex);
|
||||
+
|
||||
+ xpthread_barrier_wait (&barrier);
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+ printf ("Starting %d threads to run %lld iterations.\n",
|
||||
+ thread_count, iteration_count);
|
||||
+
|
||||
+ pthread_t *threads = xmalloc (thread_count * sizeof (pthread_t));
|
||||
+ xpthread_barrier_init (&barrier, NULL, thread_count);
|
||||
+ xpthread_mutex_init (&mutex, NULL);
|
||||
+
|
||||
+ for (i = 0; i < thread_count; i++)
|
||||
+ threads[i] = xpthread_create (NULL, thr_func, (void *) (uintptr_t) i);
|
||||
+
|
||||
+ for (i = 0; i < thread_count; i++)
|
||||
+ xpthread_join (threads[i]);
|
||||
+
|
||||
+ xpthread_barrier_destroy (&barrier);
|
||||
+ free (threads);
|
||||
+
|
||||
+ return EXIT_SUCCESS;
|
||||
+}
|
||||
+
|
||||
+#define OPT_ITERATIONS 10000
|
||||
+#define OPT_THREADS 10001
|
||||
+#define CMDLINE_OPTIONS \
|
||||
+ { "iterations", required_argument, NULL, OPT_ITERATIONS }, \
|
||||
+ { "threads", required_argument, NULL, OPT_THREADS },
|
||||
+static void
|
||||
+cmdline_process (int c)
|
||||
+{
|
||||
+ long long int arg = strtoll (optarg, NULL, 0);
|
||||
+ switch (c)
|
||||
+ {
|
||||
+ case OPT_ITERATIONS:
|
||||
+ if (arg > 0)
|
||||
+ iteration_count = arg;
|
||||
+ break;
|
||||
+ case OPT_THREADS:
|
||||
+ if (arg > 0 && arg < 100)
|
||||
+ thread_count = arg;
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+#define CMDLINE_PROCESS cmdline_process
|
||||
+#define TIMEOUT 50
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/sysdeps/nptl/bits/thread-shared-types.h b/sysdeps/nptl/bits/thread-shared-types.h
|
||||
index 1e2092a05d..05c94e7a71 100644
|
||||
--- a/sysdeps/nptl/bits/thread-shared-types.h
|
||||
+++ b/sysdeps/nptl/bits/thread-shared-types.h
|
||||
@@ -124,7 +124,27 @@ struct __pthread_mutex_s
|
||||
unsigned int __nusers;
|
||||
#endif
|
||||
/* KIND must stay at this position in the structure to maintain
|
||||
- binary compatibility with static initializers. */
|
||||
+ binary compatibility with static initializers.
|
||||
+
|
||||
+ Concurrency notes:
|
||||
+ The __kind of a mutex is initialized either by the static
|
||||
+ PTHREAD_MUTEX_INITIALIZER or by a call to pthread_mutex_init.
|
||||
+
|
||||
+ After a mutex has been initialized, the __kind of a mutex is usually not
|
||||
+ changed. BUT it can be set to -1 in pthread_mutex_destroy or elision can
|
||||
+ be enabled. This is done concurrently in the pthread_mutex_*lock functions
|
||||
+ by using the macro FORCE_ELISION. This macro is only defined for
|
||||
+ architectures which supports lock elision.
|
||||
+
|
||||
+ For elision, there are the flags PTHREAD_MUTEX_ELISION_NP and
|
||||
+ PTHREAD_MUTEX_NO_ELISION_NP which can be set in addition to the already set
|
||||
+ type of a mutex.
|
||||
+ Before a mutex is initialized, only PTHREAD_MUTEX_NO_ELISION_NP can be set
|
||||
+ with pthread_mutexattr_settype.
|
||||
+ After a mutex has been initialized, the functions pthread_mutex_*lock can
|
||||
+ enable elision - if the mutex-type and the machine supports it - by setting
|
||||
+ the flag PTHREAD_MUTEX_ELISION_NP. This is done concurrently. Afterwards
|
||||
+ the lock / unlock functions are using specific elision code-paths. */
|
||||
int __kind;
|
||||
__PTHREAD_COMPAT_PADDING_MID
|
||||
#if __PTHREAD_MUTEX_NUSERS_AFTER_KIND
|
||||
diff --git a/sysdeps/unix/sysv/linux/powerpc/force-elision.h b/sysdeps/unix/sysv/linux/powerpc/force-elision.h
|
||||
index fe5d6ceade..d8f5a4b1c7 100644
|
||||
--- a/sysdeps/unix/sysv/linux/powerpc/force-elision.h
|
||||
+++ b/sysdeps/unix/sysv/linux/powerpc/force-elision.h
|
||||
@@ -18,9 +18,45 @@
|
||||
|
||||
/* Automatically enable elision for existing user lock kinds. */
|
||||
#define FORCE_ELISION(m, s) \
|
||||
- if (__pthread_force_elision \
|
||||
- && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ if (__pthread_force_elision) \
|
||||
{ \
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
- s; \
|
||||
+ /* See concurrency notes regarding __kind in \
|
||||
+ struct __pthread_mutex_s in \
|
||||
+ sysdeps/nptl/bits/thread-shared-types.h. \
|
||||
+ \
|
||||
+ There are the following cases for the kind of a mutex \
|
||||
+ (The mask PTHREAD_MUTEX_ELISION_FLAGS_NP covers the flags \
|
||||
+ PTHREAD_MUTEX_ELISION_NP and PTHREAD_MUTEX_NO_ELISION_NP where \
|
||||
+ only one of both flags can be set): \
|
||||
+ - both flags are not set: \
|
||||
+ This is the first lock operation for this mutex. Enable \
|
||||
+ elision as it is not enabled so far. \
|
||||
+ Note: It can happen that multiple threads are calling e.g. \
|
||||
+ pthread_mutex_lock at the same time as the first lock \
|
||||
+ operation for this mutex. Then elision is enabled for this \
|
||||
+ mutex by multiple threads. Storing with relaxed MO is enough \
|
||||
+ as all threads will store the same new value for the kind of \
|
||||
+ the mutex. But we have to ensure that we always use the \
|
||||
+ elision path regardless if this thread has enabled elision or \
|
||||
+ another one. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_ELISION_NP flag is set: \
|
||||
+ Elision was already enabled for this mutex by a previous lock \
|
||||
+ operation. See case above. Just use the elision path. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_NO_ELISION_NP flag is set: \
|
||||
+ Elision was explicitly disabled by pthread_mutexattr_settype. \
|
||||
+ Do not use the elision path. \
|
||||
+ Note: The flag PTHREAD_MUTEX_NO_ELISION_NP will never be \
|
||||
+ changed after mutex initialization. */ \
|
||||
+ int mutex_kind = atomic_load_relaxed (&((m)->__data.__kind)); \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ { \
|
||||
+ mutex_kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
+ atomic_store_relaxed (&((m)->__data.__kind), mutex_kind); \
|
||||
+ } \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_NP) != 0) \
|
||||
+ { \
|
||||
+ s; \
|
||||
+ } \
|
||||
}
|
||||
diff --git a/sysdeps/unix/sysv/linux/s390/force-elision.h b/sysdeps/unix/sysv/linux/s390/force-elision.h
|
||||
index d8a1b9972f..71f32367dd 100644
|
||||
--- a/sysdeps/unix/sysv/linux/s390/force-elision.h
|
||||
+++ b/sysdeps/unix/sysv/linux/s390/force-elision.h
|
||||
@@ -18,9 +18,45 @@
|
||||
|
||||
/* Automatically enable elision for existing user lock kinds. */
|
||||
#define FORCE_ELISION(m, s) \
|
||||
- if (__pthread_force_elision \
|
||||
- && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ if (__pthread_force_elision) \
|
||||
{ \
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
- s; \
|
||||
+ /* See concurrency notes regarding __kind in \
|
||||
+ struct __pthread_mutex_s in \
|
||||
+ sysdeps/nptl/bits/thread-shared-types.h. \
|
||||
+ \
|
||||
+ There are the following cases for the kind of a mutex \
|
||||
+ (The mask PTHREAD_MUTEX_ELISION_FLAGS_NP covers the flags \
|
||||
+ PTHREAD_MUTEX_ELISION_NP and PTHREAD_MUTEX_NO_ELISION_NP where \
|
||||
+ only one of both flags can be set): \
|
||||
+ - both flags are not set: \
|
||||
+ This is the first lock operation for this mutex. Enable \
|
||||
+ elision as it is not enabled so far. \
|
||||
+ Note: It can happen that multiple threads are calling e.g. \
|
||||
+ pthread_mutex_lock at the same time as the first lock \
|
||||
+ operation for this mutex. Then elision is enabled for this \
|
||||
+ mutex by multiple threads. Storing with relaxed MO is enough \
|
||||
+ as all threads will store the same new value for the kind of \
|
||||
+ the mutex. But we have to ensure that we always use the \
|
||||
+ elision path regardless if this thread has enabled elision or \
|
||||
+ another one. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_ELISION_NP flag is set: \
|
||||
+ Elision was already enabled for this mutex by a previous lock \
|
||||
+ operation. See case above. Just use the elision path. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_NO_ELISION_NP flag is set: \
|
||||
+ Elision was explicitly disabled by pthread_mutexattr_settype. \
|
||||
+ Do not use the elision path. \
|
||||
+ Note: The flag PTHREAD_MUTEX_NO_ELISION_NP will never be \
|
||||
+ changed after mutex initialization. */ \
|
||||
+ int mutex_kind = atomic_load_relaxed (&((m)->__data.__kind)); \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ { \
|
||||
+ mutex_kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
+ atomic_store_relaxed (&((m)->__data.__kind), mutex_kind); \
|
||||
+ } \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_NP) != 0) \
|
||||
+ { \
|
||||
+ s; \
|
||||
+ } \
|
||||
}
|
||||
diff --git a/sysdeps/unix/sysv/linux/x86/force-elision.h b/sysdeps/unix/sysv/linux/x86/force-elision.h
|
||||
index dd659c908f..61282d6678 100644
|
||||
--- a/sysdeps/unix/sysv/linux/x86/force-elision.h
|
||||
+++ b/sysdeps/unix/sysv/linux/x86/force-elision.h
|
||||
@@ -18,9 +18,45 @@
|
||||
|
||||
/* Automatically enable elision for existing user lock kinds. */
|
||||
#define FORCE_ELISION(m, s) \
|
||||
- if (__pthread_force_elision \
|
||||
- && (m->__data.__kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ if (__pthread_force_elision) \
|
||||
{ \
|
||||
- mutex->__data.__kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
- s; \
|
||||
+ /* See concurrency notes regarding __kind in \
|
||||
+ struct __pthread_mutex_s in \
|
||||
+ sysdeps/nptl/bits/thread-shared-types.h. \
|
||||
+ \
|
||||
+ There are the following cases for the kind of a mutex \
|
||||
+ (The mask PTHREAD_MUTEX_ELISION_FLAGS_NP covers the flags \
|
||||
+ PTHREAD_MUTEX_ELISION_NP and PTHREAD_MUTEX_NO_ELISION_NP where \
|
||||
+ only one of both flags can be set): \
|
||||
+ - both flags are not set: \
|
||||
+ This is the first lock operation for this mutex. Enable \
|
||||
+ elision as it is not enabled so far. \
|
||||
+ Note: It can happen that multiple threads are calling e.g. \
|
||||
+ pthread_mutex_lock at the same time as the first lock \
|
||||
+ operation for this mutex. Then elision is enabled for this \
|
||||
+ mutex by multiple threads. Storing with relaxed MO is enough \
|
||||
+ as all threads will store the same new value for the kind of \
|
||||
+ the mutex. But we have to ensure that we always use the \
|
||||
+ elision path regardless if this thread has enabled elision or \
|
||||
+ another one. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_ELISION_NP flag is set: \
|
||||
+ Elision was already enabled for this mutex by a previous lock \
|
||||
+ operation. See case above. Just use the elision path. \
|
||||
+ \
|
||||
+ - PTHREAD_MUTEX_NO_ELISION_NP flag is set: \
|
||||
+ Elision was explicitly disabled by pthread_mutexattr_settype. \
|
||||
+ Do not use the elision path. \
|
||||
+ Note: The flag PTHREAD_MUTEX_NO_ELISION_NP will never be \
|
||||
+ changed after mutex initialization. */ \
|
||||
+ int mutex_kind = atomic_load_relaxed (&((m)->__data.__kind)); \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_FLAGS_NP) == 0) \
|
||||
+ { \
|
||||
+ mutex_kind |= PTHREAD_MUTEX_ELISION_NP; \
|
||||
+ atomic_store_relaxed (&((m)->__data.__kind), mutex_kind); \
|
||||
+ } \
|
||||
+ if ((mutex_kind & PTHREAD_MUTEX_ELISION_NP) != 0) \
|
||||
+ { \
|
||||
+ s; \
|
||||
+ } \
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
From 69d1e73d99c6ad3f65fc16b6325d6ae289950d03 Mon Sep 17 00:00:00 2001
|
||||
From: "Ilya Yu. Malakhov" <malakhov@mcst.ru>
|
||||
Date: Mon, 22 Oct 2018 13:03:57 +0200
|
||||
Subject: [PATCH 24] signal: Use correct type for si_band in siginfo_t [BZ
|
||||
#23562]
|
||||
|
||||
(cherry picked from commit f997b4be18f7e57d757d39e42f7715db26528aa0)
|
||||
---
|
||||
ChangeLog | 6 ++++++
|
||||
NEWS | 1 +
|
||||
sysdeps/unix/sysv/linux/bits/types/siginfo_t.h | 2 +-
|
||||
3 files changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 5b743f2fdb..7726438658 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,9 @@
|
||||
+2018-10-19 Ilya Yu. Malakhov <malakhov@mcst.ru>
|
||||
+
|
||||
+ [BZ #23562]
|
||||
+ * sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
|
||||
+ (struct siginfo_t): Use correct type for si_band.
|
||||
+
|
||||
2018-10-17 Stefan Liebler <stli@linux.ibm.com>
|
||||
|
||||
[BZ #23275]
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 594cecfc75..e95a0ea159 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -13,6 +13,7 @@ The following bugs are resolved with this release:
|
||||
[23497] readdir64@GLIBC_2.1 cannot parse the kernel directory stream
|
||||
[23521] nss_files aliases database file stream leak
|
||||
[23538] pthread_cond_broadcast: Fix waiters-after-spinning case
|
||||
+ [23562] signal: Use correct type for si_band in siginfo_t
|
||||
[23578] regex: Fix memory overread in re_compile_pattern
|
||||
[23579] libc: Errors misreported in preadv2
|
||||
[23606] Missing ENDBR32 in sysdeps/i386/start.S
|
||||
diff --git a/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
|
||||
index 33766d1813..43c4e009a4 100644
|
||||
--- a/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
|
||||
+++ b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
|
||||
@@ -107,7 +107,7 @@ typedef struct
|
||||
/* SIGPOLL. */
|
||||
struct
|
||||
{
|
||||
- long int si_band; /* Band event for SIGPOLL. */
|
||||
+ __SI_BAND_TYPE si_band; /* Band event for SIGPOLL. */
|
||||
int si_fd;
|
||||
} _sigpoll;
|
||||
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
From aff9b377121f9cfabe5d45f3226acf99c73928a7 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri, 26 Oct 2018 09:19:40 +0200
|
||||
Subject: [PATCH 25] conform: XFAIL siginfo_t si_band test on sparc64
|
||||
|
||||
We can use long int on sparcv9, but on sparc64, we must match the int
|
||||
type used by the kernel (and not long int, as in POSIX).
|
||||
|
||||
(cherry picked from commit 7c5e34d7f1b8f8f5acd94c2b885ae13b85414dcd)
|
||||
---
|
||||
ChangeLog | 13 +++++++++++++
|
||||
NEWS | 1 +
|
||||
conform/data/signal.h-data | 3 ++-
|
||||
conform/data/sys/wait.h-data | 3 ++-
|
||||
sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h | 7 ++++++-
|
||||
sysdeps/unix/sysv/linux/sparc/sparc64/Makefile | 5 +++++
|
||||
6 files changed, 29 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 7726438658..6debca5f83 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,16 @@
|
||||
+2018-10-25 Florian Weimer <fweimer@redhat.com>
|
||||
+
|
||||
+ [BZ #23562]
|
||||
+ [BZ #23821]
|
||||
+ XFAIL siginfo_t si_band conform test on sparc64.
|
||||
+ * sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
|
||||
+ (__SI_BAND_TYPE): Only override long int default type on sparc64.
|
||||
+ * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
|
||||
+ (conformtest-xfail-conds): Add sparc64-linux.
|
||||
+ * conform/data/signal.h-data (siginfo_t): XFAIL si_band test on
|
||||
+ sparc64.
|
||||
+ * conform/data/sys/wait.h-data (siginfo_t): Likewise.
|
||||
+
|
||||
2018-10-19 Ilya Yu. Malakhov <malakhov@mcst.ru>
|
||||
|
||||
[BZ #23562]
|
||||
diff --git a/NEWS b/NEWS
|
||||
index e95a0ea159..fda6788519 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -19,6 +19,7 @@ The following bugs are resolved with this release:
|
||||
[23606] Missing ENDBR32 in sysdeps/i386/start.S
|
||||
[23679] gethostid: Missing NULL check for gethostbyname_r result
|
||||
[23717] Fix stack overflow in stdlib/tst-setcontext9
|
||||
+ [23821] si_band in siginfo_t has wrong type long int on sparc64
|
||||
|
||||
|
||||
Version 2.28
|
||||
diff --git a/conform/data/signal.h-data b/conform/data/signal.h-data
|
||||
index 11e54adb04..674e5793db 100644
|
||||
--- a/conform/data/signal.h-data
|
||||
+++ b/conform/data/signal.h-data
|
||||
@@ -172,7 +172,8 @@ element siginfo_t pid_t si_pid
|
||||
element siginfo_t uid_t si_uid
|
||||
element siginfo_t {void*} si_addr
|
||||
element siginfo_t int si_status
|
||||
-element siginfo_t long si_band
|
||||
+// Bug 23821: si_band has type int on sparc64.
|
||||
+xfail[sparc64-linux]-element siginfo_t long si_band
|
||||
# endif
|
||||
# ifndef XPG42
|
||||
element siginfo_t {union sigval} si_value
|
||||
diff --git a/conform/data/sys/wait.h-data b/conform/data/sys/wait.h-data
|
||||
index ed3869b34f..c0761424da 100644
|
||||
--- a/conform/data/sys/wait.h-data
|
||||
+++ b/conform/data/sys/wait.h-data
|
||||
@@ -46,7 +46,8 @@ element siginfo_t pid_t si_pid
|
||||
element siginfo_t uid_t si_uid
|
||||
element siginfo_t {void*} si_addr
|
||||
element siginfo_t int si_status
|
||||
-element siginfo_t long si_band
|
||||
+// Bug 23821: si_band has type int on sparc64.
|
||||
+xfail[sparc64-linux]-element siginfo_t long si_band
|
||||
# ifndef XPG42
|
||||
element siginfo_t {union sigval} si_value
|
||||
# endif
|
||||
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
|
||||
index 9f79715ebe..4dd35237f6 100644
|
||||
--- a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
|
||||
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
|
||||
@@ -2,7 +2,12 @@
|
||||
#ifndef _BITS_SIGINFO_ARCH_H
|
||||
#define _BITS_SIGINFO_ARCH_H 1
|
||||
|
||||
-#define __SI_BAND_TYPE int
|
||||
+/* The kernel uses int instead of long int (as in POSIX). In 32-bit
|
||||
+ mode, we can still use long int, but in 64-bit mode, we need to
|
||||
+ deviate from POSIX. */
|
||||
+#if __WORDSIZE == 64
|
||||
+# define __SI_BAND_TYPE int
|
||||
+#endif
|
||||
|
||||
#define __SI_SIGFAULT_ADDL \
|
||||
int _si_trapno;
|
||||
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
|
||||
index 715af3df7b..218c246f16 100644
|
||||
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
|
||||
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile
|
||||
@@ -7,3 +7,8 @@ LD += -melf64_sparc
|
||||
ifeq ($(subdir),stdlib)
|
||||
sysdep_routines += __start_context
|
||||
endif
|
||||
+
|
||||
+ifeq ($(subdir),conform)
|
||||
+# For bug 23821 (incorrect type of si_band).
|
||||
+conformtest-xfail-conds += sparc64-linux
|
||||
+endif
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
From 5256ffc51e4188a70fa0173cb6b6c94adde03fcb Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
Date: Fri, 26 Oct 2018 14:39:42 +0100
|
||||
Subject: [PATCH 26] i64: fix missing exp2f, log2f and powf symbols in
|
||||
libm.a [BZ #23822]
|
||||
|
||||
When new symbol versions were introduced without SVID compatible
|
||||
error handling the exp2f, log2f and powf symbols were accidentally
|
||||
removed from the ia64 lim.a. The regression was introduced by
|
||||
the commits
|
||||
|
||||
f5f0f5265162fe6f4f238abcd3086985f7c38d6d
|
||||
New expf and exp2f version without SVID compat wrapper
|
||||
|
||||
72d3d281080be9f674982067d72874fd6cdb4b64
|
||||
New symbol version for logf, log2f and powf without SVID compat
|
||||
|
||||
With WEAK_LIBM_ENTRY(foo), there is a hidden __foo and weak foo
|
||||
symbol definition in both SHARED and !SHARED build.
|
||||
|
||||
[BZ #23822]
|
||||
* sysdeps/ia64/fpu/e_exp2f.S (exp2f): Use WEAK_LIBM_ENTRY.
|
||||
* sysdeps/ia64/fpu/e_log2f.S (log2f): Likewise.
|
||||
* sysdeps/ia64/fpu/e_exp2f.S (powf): Likewise.
|
||||
|
||||
(cherry picked from commit ba5b14c7613980dfefcad6b6e88f913e5f596c59)
|
||||
---
|
||||
ChangeLog | 7 +++++++
|
||||
NEWS | 1 +
|
||||
sysdeps/ia64/fpu/e_exp2f.S | 6 +++---
|
||||
sysdeps/ia64/fpu/e_log2f.S | 6 +++---
|
||||
sysdeps/ia64/fpu/e_powf.S | 6 +++---
|
||||
5 files changed, 17 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 6debca5f83..73d5c57f0d 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,10 @@
|
||||
+2018-10-26 Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
+
|
||||
+ [BZ #23822]
|
||||
+ * sysdeps/ia64/fpu/e_exp2f.S (exp2f): Use WEAK_LIBM_ENTRY.
|
||||
+ * sysdeps/ia64/fpu/e_log2f.S (log2f): Likewise.
|
||||
+ * sysdeps/ia64/fpu/e_exp2f.S (powf): Likewise.
|
||||
+
|
||||
2018-10-25 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #23562]
|
||||
diff --git a/NEWS b/NEWS
|
||||
index fda6788519..f4d9885819 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -20,6 +20,7 @@ The following bugs are resolved with this release:
|
||||
[23679] gethostid: Missing NULL check for gethostbyname_r result
|
||||
[23717] Fix stack overflow in stdlib/tst-setcontext9
|
||||
[23821] si_band in siginfo_t has wrong type long int on sparc64
|
||||
+ [23822] ia64 static libm.a is missing exp2f, log2f and powf symbols
|
||||
|
||||
|
||||
Version 2.28
|
||||
diff --git a/sysdeps/ia64/fpu/e_exp2f.S b/sysdeps/ia64/fpu/e_exp2f.S
|
||||
index 77bc6ea686..3010a95a2d 100644
|
||||
--- a/sysdeps/ia64/fpu/e_exp2f.S
|
||||
+++ b/sysdeps/ia64/fpu/e_exp2f.S
|
||||
@@ -221,7 +221,7 @@ LOCAL_OBJECT_END(T_table)
|
||||
|
||||
|
||||
.section .text
|
||||
-GLOBAL_LIBM_ENTRY(__exp2f)
|
||||
+WEAK_LIBM_ENTRY(exp2f)
|
||||
|
||||
|
||||
{.mfi
|
||||
@@ -468,10 +468,10 @@ OUT_RANGE_exp2:
|
||||
}
|
||||
;;
|
||||
|
||||
-GLOBAL_LIBM_END(__exp2f)
|
||||
+WEAK_LIBM_END(exp2f)
|
||||
libm_alias_float_other (__exp2, exp2)
|
||||
#ifdef SHARED
|
||||
-.symver __exp2f,exp2f@@GLIBC_2.27
|
||||
+.symver exp2f,exp2f@@GLIBC_2.27
|
||||
.weak __exp2f_compat
|
||||
.set __exp2f_compat,__exp2f
|
||||
.symver __exp2f_compat,exp2f@GLIBC_2.2
|
||||
diff --git a/sysdeps/ia64/fpu/e_log2f.S b/sysdeps/ia64/fpu/e_log2f.S
|
||||
index 5ca3bd61ea..e4ea094344 100644
|
||||
--- a/sysdeps/ia64/fpu/e_log2f.S
|
||||
+++ b/sysdeps/ia64/fpu/e_log2f.S
|
||||
@@ -252,7 +252,7 @@ LOCAL_OBJECT_END(T_table)
|
||||
|
||||
|
||||
.section .text
|
||||
-GLOBAL_LIBM_ENTRY(__log2f)
|
||||
+WEAK_LIBM_ENTRY(log2f)
|
||||
|
||||
{ .mfi
|
||||
alloc r32=ar.pfs,1,4,4,0
|
||||
@@ -491,10 +491,10 @@ SPECIAL_log2f:
|
||||
br.ret.sptk b0;;
|
||||
}
|
||||
|
||||
-GLOBAL_LIBM_END(__log2f)
|
||||
+WEAK_LIBM_END(log2f)
|
||||
libm_alias_float_other (__log2, log2)
|
||||
#ifdef SHARED
|
||||
-.symver __log2f,log2f@@GLIBC_2.27
|
||||
+.symver log2f,log2f@@GLIBC_2.27
|
||||
.weak __log2f_compat
|
||||
.set __log2f_compat,__log2f
|
||||
.symver __log2f_compat,log2f@GLIBC_2.2
|
||||
diff --git a/sysdeps/ia64/fpu/e_powf.S b/sysdeps/ia64/fpu/e_powf.S
|
||||
index 7449f8c7d5..945d5cdf28 100644
|
||||
--- a/sysdeps/ia64/fpu/e_powf.S
|
||||
+++ b/sysdeps/ia64/fpu/e_powf.S
|
||||
@@ -868,7 +868,7 @@ data8 0xEAC0C6E7DD24392F , 0x00003FFF
|
||||
LOCAL_OBJECT_END(pow_tbl2)
|
||||
|
||||
.section .text
|
||||
-GLOBAL_LIBM_ENTRY(__powf)
|
||||
+WEAK_LIBM_ENTRY(powf)
|
||||
|
||||
// Get exponent of x. Will be used to calculate K.
|
||||
{ .mfi
|
||||
@@ -2002,10 +2002,10 @@ POW_OVER_UNDER_ERROR:
|
||||
}
|
||||
;;
|
||||
|
||||
-GLOBAL_LIBM_END(__powf)
|
||||
+WEAK_LIBM_END(powf)
|
||||
libm_alias_float_other (__pow, pow)
|
||||
#ifdef SHARED
|
||||
-.symver __powf,powf@@GLIBC_2.27
|
||||
+.symver powf,powf@@GLIBC_2.27
|
||||
.weak __powf_compat
|
||||
.set __powf_compat,__powf
|
||||
.symver __powf_compat,powf@GLIBC_2.2
|
|
@ -1,7 +1,7 @@
|
|||
# Template file for 'glibc'
|
||||
pkgname=glibc
|
||||
version=2.28
|
||||
revision=2
|
||||
revision=3
|
||||
bootstrap=yes
|
||||
short_desc="The GNU C library"
|
||||
maintainer="Juan RP <xtraeme@voidlinux.eu>"
|
||||
|
|
Loading…
Reference in New Issue