[04/13] Linux: Explicitly disable cancellation checking in the dynamic loader
Checks
Context |
Check |
Description |
dj/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
Commit Message
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
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 \
> { \
>
@@ -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 \
{ \