[PATCH 1/2] Revert "nptl: More useful padding in struct pthread"

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Mon Jan 6 19:23:59 GMT 2025



On 04/01/25 10:19, Florian Weimer wrote:
> This reverts commit 7c22dcda27743658b6b8ea479283b384ad56bd5a.
> 
> The padding is required by Chromium's MaybeUpdateGlibcTidCache
> in sandbox/linux/services/namespace_sandbox.cc.

I agree that a revert of this change is a better solution for 2.41.
We can discuss for 2.42 a proper solution, being either the clone
adjustments to setup the tid or a new symbol.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  nptl/descr.h | 56 +++++++++++++++++++++++++++++-----------------------
>  1 file changed, 31 insertions(+), 25 deletions(-)
> 
> diff --git a/nptl/descr.h b/nptl/descr.h
> index bcc537ed7d..d0d30929e2 100644
> --- a/nptl/descr.h
> +++ b/nptl/descr.h
> @@ -129,32 +129,41 @@ struct priority_protection_data
>  /* Thread descriptor data structure.  */
>  struct pthread
>  {
> +  union
> +  {
>  #if !TLS_DTV_AT_TP
> -  /* This overlaps the TCB as used for TLS without threads (see tls.h).  */
> -  tcbhead_t header;
> +    /* This overlaps the TCB as used for TLS without threads (see tls.h).  */
> +    tcbhead_t header;
>  #else
> -  struct
> -  {
> -    /* multiple_threads is enabled either when the process has spawned at
> -       least one thread or when a single-threaded process cancels itself.
> -       This enables additional code to introduce locking before doing some
> -       compare_and_exchange operations and also enable cancellation points.
> -       The concepts of multiple threads and cancellation points ideally
> -       should be separate, since it is not necessary for multiple threads to
> -       have been created for cancellation points to be enabled, as is the
> -       case is when single-threaded process cancels itself.
> -
> -       Since enabling multiple_threads enables additional code in
> -       cancellation points and compare_and_exchange operations, there is a
> -       potential for an unneeded performance hit when it is enabled in a
> -       single-threaded, self-canceling process.  This is OK though, since a
> -       single-threaded process will enable async cancellation only when it
> -       looks to cancel itself and is hence going to end anyway.  */
> -    int multiple_threads;
> -    int gscope_flag;
> -  } header;
> +    struct
> +    {
> +      /* multiple_threads is enabled either when the process has spawned at
> +	 least one thread or when a single-threaded process cancels itself.
> +	 This enables additional code to introduce locking before doing some
> +	 compare_and_exchange operations and also enable cancellation points.
> +	 The concepts of multiple threads and cancellation points ideally
> +	 should be separate, since it is not necessary for multiple threads to
> +	 have been created for cancellation points to be enabled, as is the
> +	 case is when single-threaded process cancels itself.
> +
> +	 Since enabling multiple_threads enables additional code in
> +	 cancellation points and compare_and_exchange operations, there is a
> +	 potential for an unneeded performance hit when it is enabled in a
> +	 single-threaded, self-canceling process.  This is OK though, since a
> +	 single-threaded process will enable async cancellation only when it
> +	 looks to cancel itself and is hence going to end anyway.  */
> +      int multiple_threads;
> +      int gscope_flag;
> +    } header;
>  #endif
>  
> +    /* This extra padding has no special purpose, and this structure layout
> +       is private and subject to change without affecting the official ABI.
> +       We just have it here in case it might be convenient for some
> +       implementation-specific instrumentation hack or suchlike.  */
> +    void *__padding[24];
> +  };
> +
>    /* This descriptor's link on the GL (dl_stack_used) or
>       GL (dl_stack_user) list.  */
>    list_t list;
> @@ -398,9 +407,6 @@ struct pthread
>    /* getrandom vDSO per-thread opaque state.  */
>    void *getrandom_buf;
>  
> -  /* Can be used for backports preserving internal TCB layout.  */
> -  void *padding[8];
> -
>    /* rseq area registered with the kernel.  Use a custom definition
>       here to isolate from kernel struct rseq changes.  The
>       implementation of sched_getcpu needs acccess to the cpu_id field;



More information about the Libc-alpha mailing list