From bc0b4a5c6246621e9b7946253252b0682b0f9d1e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Mon, 26 Oct 2015 14:32:06 +0100 Subject: [PATCH] - 2.22 branch fixes --- glibc-git.patch | 197 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 191 insertions(+), 6 deletions(-) diff --git a/glibc-git.patch b/glibc-git.patch index ca31638..bd86ae7 100644 --- a/glibc-git.patch +++ b/glibc-git.patch @@ -1,8 +1,27 @@ diff --git a/ChangeLog b/ChangeLog -index cb9124e..d0d2f56 100644 +index cb9124e..b32cd09 100644 --- a/ChangeLog +++ b/ChangeLog -@@ -1,3 +1,140 @@ +@@ -1,3 +1,159 @@ ++2015-10-20 Tulio Magno Quites Machado Filho ++ ++ [BZ #18743] ++ * sysdeps/powerpc/nptl/elide.h (__elide_lock): Move most of this ++ code to... ++ (ELIDE_LOCK): ...here. ++ (__get_new_count): New function with part of the code from ++ __elide_lock that updates the value of adapt_count after a ++ transaction abort. ++ (__elided_trylock): Moved this code to... ++ (ELIDE_TRYLOCK): ...here. ++ ++2015-10-06 Florian Weimer ++ ++ [BZ #19018] ++ * stdlib/cxa_thread_atexit_impl.c (__cxa_thread_atexit_impl): ++ Mangle function pointer before storing it. ++ (__call_tls_dtors): Demangle function pointer before calling it. ++ +2015-10-15 Florian Weimer + + [BZ #18928] @@ -144,10 +163,10 @@ index cb9124e..d0d2f56 100644 * version.h (RELEASE): Set to "stable". diff --git a/NEWS b/NEWS -index 4c31de7..fa6f58d 100644 +index 4c31de7..92037ce 100644 --- a/NEWS +++ b/NEWS -@@ -5,6 +5,15 @@ See the end for copying conditions. +@@ -5,6 +5,16 @@ See the end for copying conditions. Please send GNU C library bug reports via using `glibc' in the "product" field. @@ -155,7 +174,8 @@ index 4c31de7..fa6f58d 100644 + +* The following bugs are resolved with this release: + -+ 18589, 18778, 18781, 18787, 18796, 18870, 18887, 18921, 18928, 18969. ++ 18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887, 18921, 18928, ++ 18969, 19018. + +* The LD_POINTER_GUARD environment variable can no longer be used to + disable the pointer guard feature. It is always enabled. @@ -163,7 +183,7 @@ index 4c31de7..fa6f58d 100644 Version 2.22 * The following bugs are resolved with this release: -@@ -84,7 +93,7 @@ Version 2.22 +@@ -84,7 +94,7 @@ Version 2.22 release. Use of this header will trigger a deprecation warning. Application developers should update their code to use instead. @@ -732,6 +752,36 @@ index cac1562..79b2b3e 100755 if ($name ne "nss_ldap" && $name ne "db1" && !($name =~/^nss1_/) && $name ne "thread_db" && $name ne "nss_test1" && $name ne "libgcc_s") { +diff --git a/stdlib/cxa_thread_atexit_impl.c b/stdlib/cxa_thread_atexit_impl.c +index 2d5d56a..5717f09 100644 +--- a/stdlib/cxa_thread_atexit_impl.c ++++ b/stdlib/cxa_thread_atexit_impl.c +@@ -98,6 +98,10 @@ static __thread struct link_map *lm_cache; + int + __cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol) + { ++#ifdef PTR_MANGLE ++ PTR_MANGLE (func); ++#endif ++ + /* Prepend. */ + struct dtor_list *new = calloc (1, sizeof (struct dtor_list)); + new->func = func; +@@ -142,9 +146,13 @@ __call_tls_dtors (void) + while (tls_dtor_list) + { + struct dtor_list *cur = tls_dtor_list; ++ dtor_func func = cur->func; ++#ifdef PTR_DEMANGLE ++ PTR_DEMANGLE (func); ++#endif + + tls_dtor_list = tls_dtor_list->next; +- cur->func (cur->obj); ++ func (cur->obj); + + /* Ensure that the MAP dereference happens before + l_tls_dtor_count decrement. That way, we protect this access from a diff --git a/string/Makefile b/string/Makefile index 8424a61..ebe9354 100644 --- a/string/Makefile @@ -1037,6 +1087,141 @@ index 6509f5c..9edf056 100644 #endif return true; } +diff --git a/sysdeps/powerpc/nptl/elide.h b/sysdeps/powerpc/nptl/elide.h +index 389f5a5..12171f4 100644 +--- a/sysdeps/powerpc/nptl/elide.h ++++ b/sysdeps/powerpc/nptl/elide.h +@@ -23,67 +23,78 @@ + # include + # include + +-/* Returns true if the lock defined by is_lock_free as elided. +- ADAPT_COUNT is a pointer to per-lock state variable. */ +- ++/* Get the new value of adapt_count according to the elision ++ configurations. Returns true if the system should retry again or false ++ otherwise. */ + static inline bool +-__elide_lock (uint8_t *adapt_count, int is_lock_free) ++__get_new_count (uint8_t *adapt_count) + { +- if (*adapt_count > 0) ++ /* A persistent failure indicates that a retry will probably ++ result in another failure. Use normal locking now and ++ for the next couple of calls. */ ++ if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) + { +- (*adapt_count)--; ++ if (__elision_aconf.skip_lock_internal_abort > 0) ++ *adapt_count = __elision_aconf.skip_lock_internal_abort; + return false; + } +- +- for (int i = __elision_aconf.try_tbegin; i > 0; i--) +- { +- if (__builtin_tbegin (0)) +- { +- if (is_lock_free) +- return true; +- /* Lock was busy. */ +- __builtin_tabort (_ABORT_LOCK_BUSY); +- } +- else +- { +- /* A persistent failure indicates that a retry will probably +- result in another failure. Use normal locking now and +- for the next couple of calls. */ +- if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) +- { +- if (__elision_aconf.skip_lock_internal_abort > 0) +- *adapt_count = __elision_aconf.skip_lock_internal_abort; +- break; +- } +- /* Same logic as above, but for a number of temporary failures in a +- a row. */ +- else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0 +- && __elision_aconf.try_tbegin > 0) +- *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries; +- } +- } +- +- return false; ++ /* Same logic as above, but for a number of temporary failures in a ++ a row. */ ++ else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0 ++ && __elision_aconf.try_tbegin > 0) ++ *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries; ++ return true; + } + +-# define ELIDE_LOCK(adapt_count, is_lock_free) \ +- __elide_lock (&(adapt_count), is_lock_free) +- +- +-static inline bool +-__elide_trylock (uint8_t *adapt_count, int is_lock_free, int write) +-{ +- if (__elision_aconf.try_tbegin > 0) +- { +- if (write) +- __builtin_tabort (_ABORT_NESTED_TRYLOCK); +- return __elide_lock (adapt_count, is_lock_free); +- } +- return false; +-} ++/* CONCURRENCY NOTES: ++ ++ The evaluation of the macro expression is_lock_free encompasses one or ++ more loads from memory locations that are concurrently modified by other ++ threads. For lock elision to work, this evaluation and the rest of the ++ critical section protected by the lock must be atomic because an ++ execution with lock elision must be equivalent to an execution in which ++ the lock would have been actually acquired and released. Therefore, we ++ evaluate is_lock_free inside of the transaction that represents the ++ critical section for which we want to use lock elision, which ensures ++ the atomicity that we require. */ ++ ++/* Returns 0 if the lock defined by is_lock_free was elided. ++ ADAPT_COUNT is a per-lock state variable. */ ++# define ELIDE_LOCK(adapt_count, is_lock_free) \ ++ ({ \ ++ int ret = 0; \ ++ if (adapt_count > 0) \ ++ (adapt_count)--; \ ++ else \ ++ for (int i = __elision_aconf.try_tbegin; i > 0; i--) \ ++ { \ ++ if (__builtin_tbegin (0)) \ ++ { \ ++ if (is_lock_free) \ ++ { \ ++ ret = 1; \ ++ break; \ ++ } \ ++ __builtin_tabort (_ABORT_LOCK_BUSY); \ ++ } \ ++ else \ ++ if (!__get_new_count(&adapt_count)) \ ++ break; \ ++ } \ ++ ret; \ ++ }) + + # define ELIDE_TRYLOCK(adapt_count, is_lock_free, write) \ +- __elide_trylock (&(adapt_count), is_lock_free, write) ++ ({ \ ++ int ret = 0; \ ++ if (__elision_aconf.try_tbegin > 0) \ ++ { \ ++ if (write) \ ++ __builtin_tabort (_ABORT_NESTED_TRYLOCK); \ ++ ret = ELIDE_LOCK (adapt_count, is_lock_free); \ ++ } \ ++ ret; \ ++ }) + + + static inline bool diff --git a/sysdeps/sparc/sparc32/sem_open.c b/sysdeps/sparc/sparc32/sem_open.c index 16cb9ad..59df2d7 100644 --- a/sysdeps/sparc/sparc32/sem_open.c -- 2.44.0