[PATCH 5/6] malloc: Inline tcache_free

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Mon Apr 14 13:58:45 GMT 2025



On 31/03/25 10:01, Wilco Dijkstra wrote:
> 
> Inline tcache_free since it's only used by __libc_free.  Add __glibc_likely
> for the tcache checks.

LGTM, thanks.

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

> 
> ---
> 
> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index f8f35b337d91a0a4790d27163728fec53083f026..46383c4909c8c4bb16c02b00573c23d149ecd69d 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -3243,34 +3243,6 @@ tcache_double_free_verify (tcache_entry *e, size_t tc_idx)
>      }
>  }
>  
> -/* Try to free chunk to the tcache, if success return true.
> -   Caller must ensure that chunk and size are valid.  */
> -static __always_inline bool
> -tcache_free (mchunkptr p, INTERNAL_SIZE_T size)
> -{
> -  bool done = false;
> -  size_t tc_idx = csize2tidx (size);
> -  if (tcache != NULL && tc_idx < mp_.tcache_bins)
> -    {
> -      /* Check to see if it's already in the tcache.  */
> -      tcache_entry *e = (tcache_entry *) chunk2mem (p);
> -
> -      /* This test succeeds on double free.  However, we don't 100%
> -	 trust it (it also matches random payload data at a 1 in
> -	 2^<size_t> chance), so verify it's not an unlikely
> -	 coincidence before aborting.  */
> -      if (__glibc_unlikely (e->key == tcache_key))
> -	tcache_double_free_verify (e, tc_idx);
> -
> -      if (tcache->counts[tc_idx] < mp_.tcache_count)
> -	{
> -	  tcache_put (p, tc_idx);
> -	  done = true;
> -	}
> -    }
> -  return done;
> -}
> -
>  static void
>  tcache_thread_shutdown (void)
>  {
> @@ -3471,8 +3443,20 @@ __libc_free (void *mem)
>    check_inuse_chunk (arena_for_chunk (p), p);
>  
>  #if USE_TCACHE
> -  if (tcache_free (p, size))
> -    return;
> +  size_t tc_idx = csize2tidx (size);
> +
> +  if (__glibc_likely (tcache != NULL && tc_idx < mp_.tcache_bins))
> +    {
> +      /* Check to see if it's already in the tcache.  */
> +      tcache_entry *e = (tcache_entry *) chunk2mem (p);
> +
> +      /* Check for double free - verify if the key matches.  */
> +      if (__glibc_unlikely (e->key == tcache_key))
> +        tcache_double_free_verify (e, tc_idx);
> +
> +      if (__glibc_likely (tcache->counts[tc_idx] < mp_.tcache_count))
> +        return tcache_put (p, tc_idx);
> +    }
>  #endif
>  
>    /* Check size >= MINSIZE and p + size does not overflow.  */
> 



More information about the Libc-alpha mailing list