From patchwork Wed Oct 28 22:34:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Paul E. Murphy" X-Patchwork-Id: 9439 X-Patchwork-Delegate: tuliom@linux.vnet.ibm.com Received: (qmail 86844 invoked by alias); 28 Oct 2015 22:34:39 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 86827 invoked by uid 89); 28 Oct 2015 22:34:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: e17.ny.us.ibm.com X-IBM-Helo: d01dlp03.pok.ibm.com X-IBM-MailFrom: murphyp@linux.vnet.ibm.com X-IBM-RcptTo: libc-alpha@sourceware.org From: "Paul E. Murphy" Subject: [PATCH] powerpc: More elision improvements To: "libc-alpha@sourceware.org" , Tulio Magno Quites Machado Filho , Torvald Riegel , Adhemerval Zanella Message-ID: <56314D77.5080703@linux.vnet.ibm.com> Date: Wed, 28 Oct 2015 17:34:31 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15102822-0041-0000-0000-000002174819 __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. 2015-10-28 Paul E. Murphy * 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. --- sysdeps/unix/sysv/linux/powerpc/elision-trylock.c | 11 ++++++----- sysdeps/unix/sysv/linux/powerpc/htm.h | 12 +++++++----- 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 440939c..6f61eba 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 57d5cd6..5127b4b 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