about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/elision-trylock.c11
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/htm.h12
2 files changed, 13 insertions, 10 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c b/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
index 440939cda1..6f61eba48e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
+++ b/sysdeps/unix/sysv/linux/powerpc/elision-trylock.c
@@ -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
     {
@@ -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:
diff --git a/sysdeps/unix/sysv/linux/powerpc/htm.h b/sysdeps/unix/sysv/linux/powerpc/htm.h
index 57d5cd6262..5127b4bf0a 100644
--- a/sysdeps/unix/sysv/linux/powerpc/htm.h
+++ b/sysdeps/unix/sysv/linux/powerpc/htm.h
@@ -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