[PATCH v10 0/2] malloc: tcache improvements

Cupertino Miranda cupertino.miranda@oracle.com
Fri Jun 6 10:34:10 GMT 2025


Hi everyone,

This series implements the suggestions of code improvements suggested by
Wilco.
I have also identified and fixed a bug related to error returns from
checked_request2size call.

Looking forward to your reviews.

Cheers,
Cupertino

Changed from v9:
 - Followed improvements suggested by Wilco.
 - Fixed bug related to possible return of 0 from checked_request2size.
   The expected check is delayed to _int_memalign while new tcache
   requires the check to be executed before its usage. Copied the check
   from _int_memalign to _mid_memalign and kept it in both locations.
 - Also changed do_set_tcache_max for similar reasons to previous entry.
Changed from v8:
 - Code changed after another review round from Wilco.
 - Dropped tcache_index function.
 - Check sizes against tcache_max_bytes to delay TLS tcache loading.
 - Re-added tcache_bins, but renaming it to tcache_small_bins. Now it
   only is used for small tcache chunks.
 - Removed MAYBE_INIT_TCACHE, to reduce number of NULL pointer checks
   against tcache TLS variable.
Changes from v7:
 - Applied changes suggested by Wilcos and Andreas reviews.
 - Added __libc_calloc large chunk tcache support.
 - Moved tcache_init call to __libc_calloc2. Semantically it is the same
   but out of the tcache hotpath.
 - Only check for mp_.tcache_max_bytes when adding to tcache bins, i.e.
   before any calls to tcache_put and tcache_put_large.
   No need to check for tcache_max_bytes or even tcache_bins in bin
   retrievals, since the bin entries will be empty when those sizes are not
   added in.
 - Also there is no need to check for mp_.tcache_bins around tcache_get
   as the entries will be empty if there are no such chunks. I have
   removed the field tcache_bins completelly.
Changes from v6:
 - Dropped pointer swizzilng patch.
 - Separated small and large tcache patches to reduce overhead related
   to the introduction of large chunks in tcache.
Changes from v5:
 - Dropped patches already pushed in upstream master.
 - Adapted code to take advantage of new streamlined __libc_malloc
   function by only dealing with small chunk sizes in this call.
   Remaining large chunk size tcache code is moved to __libc_malloc2 which
   is called by __libc_malloc as a tailcall.
Changes from v4:
 - Reorganized patches from most general optimizations to large chunk
   caching changes in tcache.
 - Code changes related to recent reviews from Wilco and DJ.
Changes from v3:
 - force inline of _int_free. This might make sense as a generic patch.
 - performance improvements
Changes from v2:
 - Redesign implementation.
 - Dropped strategy to remove old chunks from tcache to a better
   split and consolidate strategy (future patch, still work in
   progress).
 - Fixed regressions in v2. 
Changes from v1:
 - Typo in the assigment to mp_.tcache_bins in do_set_cache_max
   function. Was setting it to MAX_TCACHE_SIZE instead of
   TCACHE_MAX_BINS.
 - Fixed testsuite regressions.

Cupertino Miranda (2):
  malloc: add tcache support for large chunk caching
  malloc: add testing for large tcache support.

 Rules           |  19 ++++
 malloc/Makefile |  15 +++
 malloc/malloc.c | 293 ++++++++++++++++++++++++++++++++++--------------
 3 files changed, 245 insertions(+), 82 deletions(-)

-- 
2.39.5



More information about the Libc-alpha mailing list