Skip to content

Commit

Permalink
powerpc: More elision improvements
Browse files Browse the repository at this point in the history
__lll_trylock_elision sets the adapt_count variable too
aggressively, and incorrectly on persistent aborts.  Taking
a cue from s390, adapt_count is only updated if the lock
is locked, or a persistent failure occurs.

In addition, the abort codes have been renumbered and
refactored for clarity.  As it stands, glibc only cares
if the abort is persistent or not.

All aborts are now persistent, excepting a busy lock.  This
includes changing _ABORT_NESTED_TRYLOCK into a persistent
abort.

	* sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
	(__lll_trylock_elision): Fix setting of adapt_count.
	* sysdeps/unix/sysv/linux/powerpc/htm.h
	(_ABORT_PERSISTENT): Define to clarify persistent aborts.
	(_ABORT_NESTED_TRYLOCK): Renumber, and make persistent.
	(_ABORT_SYSCALL): Renumber, and clarify definition.
	(_ABORT_LOCK_BUSY): Renumber, make non-persistent.
  • Loading branch information
Paul Murphy authored and Tulio Magno Quites Machado Filho committed Nov 19, 2015
1 parent 79adcb5 commit 86b4939
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2015-11-19 Paul E. Murphy <murphyp@linux.vnet.ibm.com>

* sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
(__lll_trylock_elision): Fix setting of adapt_count.
* sysdeps/unix/sysv/linux/powerpc/htm.h
(_ABORT_PERSISTENT): Define to clarify persistent aborts.
(_ABORT_NESTED_TRYLOCK): Renumber, and make persistent.
(_ABORT_SYSCALL): Renumber, and clarify definition.
(_ABORT_LOCK_BUSY): Renumber, make non-persistent.

2015-11-19 Paul E. Murphy <murphyp@linux.vnet.ibm.com>

* sysdeps/ieee754/ldbl-128ibm/mpn2ldl.c: Include gmp headers
Expand Down
11 changes: 6 additions & 5 deletions sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,12 @@ __lll_trylock_elision (int *futex, short *adapt_count)
if (*futex == 0)
return 0;

/* Lock was busy. Fall back to normal locking. */
__builtin_tabort (_ABORT_LOCK_BUSY);
/* Lock was busy. This is never a nested transaction.
End it, and set the adapt count. */
__builtin_tend (0);

if (aconf.skip_lock_busy > 0)
*adapt_count = aconf.skip_lock_busy;
}
else
{
Expand All @@ -57,9 +61,6 @@ __lll_trylock_elision (int *futex, short *adapt_count)
if (aconf.skip_trylock_internal_abort > 0)
*adapt_count = aconf.skip_trylock_internal_abort;
}

if (aconf.skip_lock_busy > 0)
*adapt_count = aconf.skip_lock_busy;
}

use_lock:
Expand Down
12 changes: 7 additions & 5 deletions sysdeps/unix/sysv/linux/powerpc/htm.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,12 @@

#endif /* __ASSEMBLER__ */

/* Definitions used for TEXASR Failure code (bits 0:6), they need to be even
because tabort. always sets the first bit. */
#define _ABORT_LOCK_BUSY 0x3f /* Lock already used. */
#define _ABORT_NESTED_TRYLOCK 0x3e /* Write operation in trylock. */
#define _ABORT_SYSCALL 0x3d /* Syscall issued. */
/* Definitions used for TEXASR Failure code (bits 0:7). If the failure
should be persistent, the abort code must be odd. 0xd0 through 0xff
are reserved for the kernel and potential hypervisor. */
#define _ABORT_PERSISTENT 0x01 /* An unspecified persistent abort. */
#define _ABORT_LOCK_BUSY 0x34 /* Busy lock, not persistent. */
#define _ABORT_NESTED_TRYLOCK (0x32 | _ABORT_PERSISTENT)
#define _ABORT_SYSCALL (0x30 | _ABORT_PERSISTENT)

#endif

0 comments on commit 86b4939

Please sign in to comment.