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

Message ID 6570a09c7a6652d387548c8af2dd39fc37df9174.1620323953.git.fweimer@redhat.com
State New
Headers show
Series
  • Linux: Move most stack management out of libpthread
Related show

Commit Message

Mark Brown via Libc-alpha May 6, 2021, 6:10 p.m.
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(-)

-- 
2.30.2

Comments

Mark Brown via Libc-alpha May 9, 2021, 9:42 p.m. | #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								     \

>        {									     \

> 



-- 
Cheers,
Carlos.

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								     \
       {									     \