[packages/glibc] - 2.22 branch fixes

arekm arekm at pld-linux.org
Mon Oct 26 14:32:18 CET 2015


commit bc0b4a5c6246621e9b7946253252b0682b0f9d1e
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Mon Oct 26 14:32:06 2015 +0100

    - 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  <tuliom at linux.vnet.ibm.com>
++
++	[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  <fweimer at redhat.com>
++
++	[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  <fweimer at redhat.com>
 +
 +	[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 <http://sourceware.org/bugzilla/>
  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 <regex.h> 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 <htm.h>
+ # include <elision-conf.h>
+ 
+-/* 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
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/glibc.git/commitdiff/bc0b4a5c6246621e9b7946253252b0682b0f9d1e



More information about the pld-cvs-commit mailing list