This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] powerpc: Fix tabort usage in syscalls


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
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]