]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Fix usage of elision transient failure adapt param
authorPaul Murphy <murphyp@linux.vnet.ibm.com>
Thu, 27 Aug 2015 14:48:04 +0000 (09:48 -0500)
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Tue, 27 Oct 2015 19:27:41 +0000 (17:27 -0200)
The skip_lock_out_of_tbegin_retries adaptive parameter was
not being used correctly, nor as described.  This prevents
a fallback for all users of the lock if a transient abort
occurs within the accepted number of retries.

[BZ #19174]
* sysdeps/powerpc/nptl/elide.h (__elide_lock): Fix usage of
.skip_lock_out_of_tbegin_retries.
* sysdeps/unix/sysv/linux/powerpc/elision-lock.c
(__lll_lock_elision): Likewise, and respect a value of
try_tbegin <= 0.

ChangeLog
NEWS
sysdeps/powerpc/nptl/elide.h
sysdeps/unix/sysv/linux/powerpc/elision-lock.c

index a392a750303f458f94a241032d39cc336c41e0df..0a70fee96467e9cf809e187be23d1e75c46b32da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-10-27  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
+
+       [BZ #19174]
+       * sysdeps/powerpc/nptl/elide.h (__elide_lock): Fix usage of
+       .skip_lock_out_of_tbegin_retries.
+       * sysdeps/unix/sysv/linux/powerpc/elision-lock.c
+       (__lll_lock_elision): Likewise, and respect a value of
+       try_tbegin <= 0.
+
 2015-10-27  Carlos Eduardo Seo  <cseo@linux.vnet.ibm.com>
 
        * elf/dl-support.c (_dl_aux_init): Added AT_PLATFORM to the case
diff --git a/NEWS b/NEWS
index 1122affd0dfc0642551561fe9dcefc877ddd6879..5120ddc24d0449ee1e0cc9a104a2f4387ac4fc58 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -21,7 +21,7 @@ Version 2.23
   18970, 18977, 18980, 18981, 18982, 18985, 19003, 19007, 19012, 19016,
   19018, 19032, 19046, 19049, 19050, 19059, 19071, 19074, 19076, 19077,
   19078, 19079, 19085, 19086, 19088, 19094, 19095, 19124, 19125, 19129,
-  19134, 19137, 19156.
+  19134, 19137, 19156, 19174.
 
 * There is now a --disable-timezone-tools configure option for disabling the
   building and installing of the timezone related utilities (zic, zdump, and
index 12171f45dc1758f5d9a4f5ae07d57516fae53459..2e1e4432789ef858be07d63391dc247a202f2577 100644 (file)
@@ -27,7 +27,7 @@
    configurations.  Returns true if the system should retry again or false
    otherwise.  */
 static inline bool
-__get_new_count (uint8_t *adapt_count)
+__get_new_count (uint8_t *adapt_count, int attempt)
 {
   /* A persistent failure indicates that a retry will probably
      result in another failure.  Use normal locking now and
@@ -40,7 +40,7 @@ __get_new_count (uint8_t *adapt_count)
     }
   /* 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
+  else if (attempt <= 1 && __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;
@@ -78,7 +78,7 @@ __get_new_count (uint8_t *adapt_count)
              __builtin_tabort (_ABORT_LOCK_BUSY);                      \
            }                                                           \
          else                                                          \
-           if (!__get_new_count(&adapt_count))                         \
+           if (!__get_new_count (&adapt_count,i))                      \
              break;                                                    \
        }                                                               \
     ret;                                                               \
index 376273237989c90612da2e6bb59ae7b2abc3fb39..4775fcad104f1eeb0a333c42e225dbcc4ee5d216 100644 (file)
@@ -50,8 +50,7 @@ __lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared)
       goto use_lock;
     }
 
-  int try_begin = aconf.try_tbegin;
-  while (1)
+  for (int i = aconf.try_tbegin; i > 0; i--)
     {
       if (__builtin_tbegin (0))
        {
@@ -65,21 +64,19 @@ __lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared)
          /* 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 (try_begin-- <= 0
-             || _TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
+         if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
            {
              if (aconf.skip_lock_internal_abort > 0)
                *adapt_count = aconf.skip_lock_internal_abort;
              goto use_lock;
            }
-         /* Same logic as above, but for for a number of temporary failures
-            in a row.  */
-         else if (aconf.skip_lock_out_of_tbegin_retries > 0
-                   && aconf.try_tbegin > 0)
-           *adapt_count = aconf.skip_lock_out_of_tbegin_retries;
        }
      }
 
+  /* Fall back to locks for a bit if retries have been exhausted */
+  if (aconf.try_tbegin > 0 && aconf.skip_lock_out_of_tbegin_retries > 0)
+    *adapt_count = aconf.skip_lock_out_of_tbegin_retries;
+
 use_lock:
   return LLL_LOCK ((*lock), pshared);
 }