[04/13] Linux: Explicitly disable cancellation checking in the dynamic loader

Message ID 6570a09c7a6652d387548c8af2dd39fc37df9174.1620323953.git.fweimer@redhat.com
State Committed
Commit 1c75f89613a0b2428c21c19598559a2d64221cde
Headers
Series Linux: Move most stack management out of libpthread |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Florian Weimer May 6, 2021, 6:10 p.m. UTC
  Historically, SINGLE_THREAD_P is defined to 1 in the dynamic loader.
This has the side effect of disabling cancellation points.  In order
to enable future use of SINGLE_THREAD_P for single-thread
optimizations in the dynamic loader (which becomes important once
more code is moved from libpthread), introduce a new
NO_SYSCALL_CANCEL_CHECKING macro which is always 1 for IS_IN (rtld),
indepdently of the actual SINGLE_THREAD_P value.
---
 sysdeps/unix/sysdep.h | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
  

Comments

Carlos O'Donell May 9, 2021, 9:42 p.m. UTC | #1
On 5/6/21 2:10 PM, Florian Weimer via Libc-alpha wrote:
> Historically, SINGLE_THREAD_P is defined to 1 in the dynamic loader.
> This has the side effect of disabling cancellation points.  In order
> to enable future use of SINGLE_THREAD_P for single-thread
> optimizations in the dynamic loader (which becomes important once
> more code is moved from libpthread), introduce a new
> NO_SYSCALL_CANCEL_CHECKING macro which is always 1 for IS_IN (rtld),
> indepdently of the actual SINGLE_THREAD_P value.

LGTM.

Tested on x86_64 and i686 without regression.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  sysdeps/unix/sysdep.h | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
> index 2fa6bfa135..664d093c05 100644
> --- a/sysdeps/unix/sysdep.h
> +++ b/sysdeps/unix/sysdep.h
> @@ -88,10 +88,17 @@
>  #define INLINE_SYSCALL_CALL(...) \
>    __INLINE_SYSCALL_DISP (__INLINE_SYSCALL, __VA_ARGS__)
>  
> +#if IS_IN (rtld)
> +/* All cancellation points are compiled out in the dynamic loader.  */
> +# define NO_SYSCALL_CANCEL_CHECKING 1
> +#else
> +# define NO_SYSCALL_CANCEL_CHECKING SINGLE_THREAD_P
> +#endif
> +
>  #define SYSCALL_CANCEL(...) \
>    ({									     \
>      long int sc_ret;							     \
> -    if (SINGLE_THREAD_P) 						     \
> +    if (NO_SYSCALL_CANCEL_CHECKING)					     \
>        sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); 			     \
>      else								     \
>        {									     \
> @@ -107,7 +114,7 @@
>  #define INTERNAL_SYSCALL_CANCEL(...) \
>    ({									     \
>      long int sc_ret;							     \
> -    if (SINGLE_THREAD_P) 						     \
> +    if (NO_SYSCALL_CANCEL_CHECKING) 					     \
>        sc_ret = INTERNAL_SYSCALL_CALL (__VA_ARGS__); 			     \
>      else								     \
>        {									     \
>
  

Patch

diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
index 2fa6bfa135..664d093c05 100644
--- a/sysdeps/unix/sysdep.h
+++ b/sysdeps/unix/sysdep.h
@@ -88,10 +88,17 @@ 
 #define INLINE_SYSCALL_CALL(...) \
   __INLINE_SYSCALL_DISP (__INLINE_SYSCALL, __VA_ARGS__)
 
+#if IS_IN (rtld)
+/* All cancellation points are compiled out in the dynamic loader.  */
+# define NO_SYSCALL_CANCEL_CHECKING 1
+#else
+# define NO_SYSCALL_CANCEL_CHECKING SINGLE_THREAD_P
+#endif
+
 #define SYSCALL_CANCEL(...) \
   ({									     \
     long int sc_ret;							     \
-    if (SINGLE_THREAD_P) 						     \
+    if (NO_SYSCALL_CANCEL_CHECKING)					     \
       sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); 			     \
     else								     \
       {									     \
@@ -107,7 +114,7 @@ 
 #define INTERNAL_SYSCALL_CANCEL(...) \
   ({									     \
     long int sc_ret;							     \
-    if (SINGLE_THREAD_P) 						     \
+    if (NO_SYSCALL_CANCEL_CHECKING) 					     \
       sc_ret = INTERNAL_SYSCALL_CALL (__VA_ARGS__); 			     \
     else								     \
       {									     \