This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] powerpc: Fix tabort usage in syscalls
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: "Paul E. Murphy" <murphyp at linux dot vnet dot ibm dot com>
- Cc: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, "munroesj at linux dot vnet dot ibm dot com" <munroesj at linux dot vnet dot ibm dot com>, Tulio Magno Quites Machado Filho <tuliom at linux dot vnet dot ibm dot com>
- Date: Sat, 8 Aug 2015 08:06:40 +0200
- Subject: Re: [PATCH] powerpc: Fix tabort usage in syscalls
- Authentication-results: sourceware.org; auth=none
- References: <55C4C152 dot 8030506 at linux dot vnet dot ibm dot com>
LGTM, thanks for checking on that.
> Em 07/08/2015, Ãs 16:31, Paul E. Murphy <murphyp@linux.vnet.ibm.com> escreveu:
>
> Fix usage of tabort in generated syscalls. r0 has special meaning
> when used with this instruction, thus it will not generate
> persistent errors, nor return an error code. This mitigates poor
> CPU usage when performing elided critical sections.
Kinda curious, could you elaborate about this performance issue?
>
> Additionally, transactions should be aborted when entering a user
> invoked syscall. Otherwise the results of the transaction may be
> undefined.
>
> 2015-08-03 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
>
> * sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION): Use
> register other than r0 for tabort, it has special meaning.
> * sysdeps/powerpc/powerpc64/sysdep.h (ABORT_TRANSACTION): Likewise
> * sysdeps/unix.sysv/linux/powerpc/syscall.S (syscall): Abort
> transaction before starting syscall.
> ---
> sysdeps/powerpc/powerpc32/sysdep.h | 4 ++--
> sysdeps/powerpc/powerpc64/sysdep.h | 4 ++--
> sysdeps/unix/sysv/linux/powerpc/syscall.S | 1 +
> 3 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h
> index e16fe3e..ecb492a 100644
> --- a/sysdeps/powerpc/powerpc32/sysdep.h
> +++ b/sysdeps/powerpc/powerpc32/sysdep.h
> @@ -95,8 +95,8 @@ GOT_LABEL: ; \
> lwz 0,TM_CAPABLE(2); \
> cmpwi 0,0; \
> beq 1f; \
> - li 0,_ABORT_SYSCALL; \
> - tabort. 0; \
> + li 11,_ABORT_SYSCALL; \
> + tabort. 11; \
> .align 4; \
> 1:
> #else
> diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
> index bf2a884..a9d37ad 100644
> --- a/sysdeps/powerpc/powerpc64/sysdep.h
> +++ b/sysdeps/powerpc/powerpc64/sysdep.h
> @@ -279,8 +279,8 @@ LT_LABELSUFFIX(name,_name_end): ; \
> lwz 0,TM_CAPABLE(13); \
> cmpwi 0,0; \
> beq 1f; \
> - li 0,_ABORT_SYSCALL; \
> - tabort. 0; \
> + li 11,_ABORT_SYSCALL; \
> + tabort. 11; \
> .align 4; \
> 1:
> #else
> diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S
> index 157e3e3..4477303 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S
> +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S
> @@ -18,6 +18,7 @@
> #include <sysdep.h>
> ENTRY (syscall)
> + ABORT_TRANSACTION
> mr r0,r3
> mr r3,r4
> mr r4,r5
> --
> 1.7.1
>