mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-18 06:30:05 +00:00
powerpc: Fix usage of elision transient failure adapt param
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.
This commit is contained in:
parent
76c5ae0028
commit
72f1463df8
@ -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>
|
2015-10-27 Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* elf/dl-support.c (_dl_aux_init): Added AT_PLATFORM to the case
|
* elf/dl-support.c (_dl_aux_init): Added AT_PLATFORM to the case
|
||||||
|
2
NEWS
2
NEWS
@ -21,7 +21,7 @@ Version 2.23
|
|||||||
18970, 18977, 18980, 18981, 18982, 18985, 19003, 19007, 19012, 19016,
|
18970, 18977, 18980, 18981, 18982, 18985, 19003, 19007, 19012, 19016,
|
||||||
19018, 19032, 19046, 19049, 19050, 19059, 19071, 19074, 19076, 19077,
|
19018, 19032, 19046, 19049, 19050, 19059, 19071, 19074, 19076, 19077,
|
||||||
19078, 19079, 19085, 19086, 19088, 19094, 19095, 19124, 19125, 19129,
|
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
|
* There is now a --disable-timezone-tools configure option for disabling the
|
||||||
building and installing of the timezone related utilities (zic, zdump, and
|
building and installing of the timezone related utilities (zic, zdump, and
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
configurations. Returns true if the system should retry again or false
|
configurations. Returns true if the system should retry again or false
|
||||||
otherwise. */
|
otherwise. */
|
||||||
static inline bool
|
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
|
/* A persistent failure indicates that a retry will probably
|
||||||
result in another failure. Use normal locking now and
|
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
|
/* Same logic as above, but for a number of temporary failures in a
|
||||||
a row. */
|
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)
|
&& __elision_aconf.try_tbegin > 0)
|
||||||
*adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
|
*adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
|
||||||
return true;
|
return true;
|
||||||
@ -78,7 +78,7 @@ __get_new_count (uint8_t *adapt_count)
|
|||||||
__builtin_tabort (_ABORT_LOCK_BUSY); \
|
__builtin_tabort (_ABORT_LOCK_BUSY); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
if (!__get_new_count(&adapt_count)) \
|
if (!__get_new_count (&adapt_count,i)) \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
ret; \
|
ret; \
|
||||||
|
@ -50,8 +50,7 @@ __lll_lock_elision (int *lock, short *adapt_count, EXTRAARG int pshared)
|
|||||||
goto use_lock;
|
goto use_lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
int try_begin = aconf.try_tbegin;
|
for (int i = aconf.try_tbegin; i > 0; i--)
|
||||||
while (1)
|
|
||||||
{
|
{
|
||||||
if (__builtin_tbegin (0))
|
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
|
/* A persistent failure indicates that a retry will probably
|
||||||
result in another failure. Use normal locking now and
|
result in another failure. Use normal locking now and
|
||||||
for the next couple of calls. */
|
for the next couple of calls. */
|
||||||
if (try_begin-- <= 0
|
if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
|
||||||
|| _TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
|
|
||||||
{
|
{
|
||||||
if (aconf.skip_lock_internal_abort > 0)
|
if (aconf.skip_lock_internal_abort > 0)
|
||||||
*adapt_count = aconf.skip_lock_internal_abort;
|
*adapt_count = aconf.skip_lock_internal_abort;
|
||||||
goto use_lock;
|
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:
|
use_lock:
|
||||||
return LLL_LOCK ((*lock), pshared);
|
return LLL_LOCK ((*lock), pshared);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user