Andreas Schwab
5005d4836d
- tls-dtor-list-mangling.patch: Harden tls_dtor_list with pointer mangling (BZ #19018) - prelink-elf-rtype-class.patch: Keep only ELF_RTYPE_CLASS_{PLT|COPY} bits for prelink (BZ #19178) - vector-finite-math-aliases.patch: Better workaround for aliases of *_finite symbols in vector math library (BZ# 19058) - powerpc-elision-adapt-param.patch: powerpc: Fix usage of elision transient failure adapt param (BZ #19174) - catopen-unbound-alloca.patch: Fix unbound alloca in catopen (CVE-2015-8779, bsc#962739, BZ #17905) - strftime-range-check.patch: Add range check on time fields (CVE-2015-8776, bsc#962736, BZ #18985) - hcreate-overflow-check.patch: Handle overflow in hcreate (CVE-2015-8778, bsc#962737, BZ #18240) - errorcheck-mutex-no-elision.patch: Don't do lock elision on an error checking mutex (bsc#956716, BZ #17514) - refactor-nan-parsing.patch: Refactor strtod parsing of NaN payloads (CVE-2014-9761, bsc#962738, BZ #16962) - send-dg-buffer-overflow.patch: Fix getaddrinfo stack-based buffer overflow (CVE-2015-7547, bsc#961721, BZ #18665) - powerpc-lock-elision-race.patch: renamed from 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch OBS-URL: https://build.opensuse.org/request/show/359989 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=421
82 lines
3.0 KiB
Diff
82 lines
3.0 KiB
Diff
2015-12-17 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.
|
|
|
|
Index: glibc-2.22/sysdeps/powerpc/nptl/elide.h
|
|
===================================================================
|
|
--- glibc-2.22.orig/sysdeps/powerpc/nptl/elide.h
|
|
+++ glibc-2.22/sysdeps/powerpc/nptl/elide.h
|
|
@@ -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: glibc-2.22/sysdeps/unix/sysv/linux/powerpc/elision-lock.c
|
|
===================================================================
|
|
--- glibc-2.22.orig/sysdeps/unix/sysv/linux/powerpc/elision-lock.c
|
|
+++ glibc-2.22/sysdeps/unix/sysv/linux/powerpc/elision-lock.c
|
|
@@ -72,8 +72,7 @@ __lll_lock_elision (int *lock, short *ad
|
|
goto use_lock;
|
|
}
|
|
|
|
- int try_begin = aconf.try_tbegin;
|
|
- while (1)
|
|
+ for (int i = aconf.try_tbegin; i > 0; i--)
|
|
{
|
|
if (__builtin_tbegin (0))
|
|
{
|
|
@@ -87,21 +86,19 @@ __lll_lock_elision (int *lock, short *ad
|
|
/* 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);
|
|
}
|