Commit graph

3751 commits

Author SHA1 Message Date
Slobodan Predolac
c88d5cf67f Move te_prof_sample_event_lookahead into src/jemalloc.c and rename it to prof_sample_lookahead 2026-06-04 11:32:53 -04:00
Slobodan Predolac
de9ad1450b Drop the jemalloc_internal_includes.h umbrella
Convert the production source files in src/ (69 .c/.cpp) and
test/jemalloc_test.h.in to list the headers they actually use, then
delete the umbrella.  Three consolidated headers (peak_event.h,
prof_sys.h, sz.h) also gain explicit transitive includes.

Every translation unit now declares what it uses.  A missing include
now fails at the failing file rather than silently working because
something upstream pulled in the world.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
306ee67a15 Consolidate arena_* header split into arena.h
arena_types.h + arena_structs.h + arena_externs.h merged into arena.h,
keeping the three logical sections (TYPES / STRUCTS / EXTERNS) with
explicit dividers.  arena_inlines_a.h and arena_inlines_b.h stay
separate; arena_inlines_b.h now carries a comment explaining why
merging the two would reintroduce a real #include cycle through
tcache_inlines.h -> arena_choose (the asymmetric cycle-breaker).

arena_decay_constants.h (new): minimal header for
ARENA_DECAY_NTICKS_PER_UPDATE.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
6396e44a3c Consolidate prof_* and tcache_* header splits
Both components had a four-way split (_types, _structs, _externs,
_inlines) that predates explicit per-file includes.  With the edata
<-> prof_types coupling broken in the prior commit, merging _types +
_structs + _externs no longer risks an include cycle.

- prof.h    replaces prof_types.h + prof_structs.h + prof_externs.h.
- tcache.h  replaces tcache_types.h + tcache_structs.h + tcache_externs.h.

prof_inlines.h and tcache_inlines.h stay separate: prof_inlines.h
sits at the bottom of the dependency layering, and tcache_inlines.h's
include of arena_externs.h is the asymmetric cycle-breaker that keeps
the arena <-> tcache symbol cycle from becoming an include cycle.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
09d419ded5 Consolidate simple component headers (large, background_thread, bin)
Fold historical *_types/_structs/_externs/_inlines splits where the
layering is no longer load-bearing.

- large_externs.h -> large.h: rename; it was a single-purpose
  function-prototype file.
- background_thread_structs.h + background_thread_externs.h ->
  background_thread.h: merge.  background_thread_inlines.h stays
  separate because it depends on arena_inlines_a.h.
- bin_types.h -> bin.h: BIN_SHARDS_MAX / N_BIN_SHARDS_DEFAULT join the
  bin_t struct and the bin_dalloc_locked_info_t type.  bin_inlines.h
  stays separate so TUs that only need the bin_t type don't pull in
  the tcache-flush inline closure.  The two bin_stats_* helpers move
  from bin.h into bin_inlines.h so all bin inlines live together.
- tsd_binshards.h (new): houses tsd_binshards_t and its zero
  initializer.  Lets tsd_internals.h pull it in for X-macro expansion
  without dragging mutex.h -- mutex.h depends on TSD machinery, which
  would form a cycle through bin.h.

jemalloc_internal_includes.h drops the references to the deleted/
merged headers.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
c944cad7b1 Break two include cycles
- test_hooks.h: drop the #include of jemalloc_preamble.h.  preamble
  pulls test_hooks.h, and test_hooks.h needs nothing from preamble.

- edata.h: drop the #include of prof_types.h in favor of forward
  declarations of prof_tctx_t and prof_recent_t (used only as pointer
  types).  prof_structs.h can then drop its #include of edata.h,
  severing the edata <-> prof_types coupling.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
9d75722344 Move malloc routing into new malloc_dispatch module
Pull the tcache-aware routing helpers out of arena into a layer that
sits directly below the public malloc interface:

  arena_malloc           -> malloc_dispatch_malloc
  arena_palloc           -> malloc_dispatch_palloc
  arena_ralloc           -> malloc_dispatch_ralloc
  arena_dalloc*          -> malloc_dispatch_dalloc*
  arena_sdalloc*         -> malloc_dispatch_sdalloc*
  arena_dalloc_promoted  -> malloc_dispatch_dalloc_promoted

The new module (malloc_dispatch.h, malloc_dispatch_inlines.h,
src/malloc_dispatch.c) owns the tcache-vs-fall-through decision; the
only consumer is jemalloc_internal_inlines_c.h.  arena keeps a narrower
arena_prof_demote() for the sampled-allocation demotion path.
2026-06-04 11:32:53 -04:00
Slobodan Predolac
5543c262c7 Add header dep graph script for cleanup verification 2026-06-04 11:32:53 -04:00
Christoph Grüninger
c22d929ab4 void function should not return anything
Found by GCC 16 (-Wpedantic).
2026-06-03 11:14:29 -07:00
Slobodan Predolac
c823cf2f3c Speculative fix for Windows tasks that sometime fail on aligned_alloc 2026-06-02 13:24:23 -04:00
Slobodan Predolac
0bce098955 Remove utilization query mallctl 2026-06-02 13:24:23 -04:00
Slobodan Predolac
bcdd23d44c Remove pactivep mallctl 2026-06-02 13:24:23 -04:00
Slobodan Predolac
206e3cb1a2 Deduplicate arena create ctl 2026-06-02 13:24:23 -04:00
Slobodan Predolac
cc7be7fbe2 Remove safety check abort mallctl 2026-06-02 13:24:23 -04:00
Slobodan Predolac
820065072b Add test_prof_hook_noop coverage 2026-06-02 13:24:23 -04:00
Slobodan Predolac
901365d473 Internalize malloc_conf_2_conf_harder ctl 2026-06-02 13:24:23 -04:00
Slobodan Predolac
9e143468a2 Refactor arena ctl helpers 2026-06-02 13:24:23 -04:00
Slobodan Predolac
716bda4394 Improve unit test coverage in tcache, pac, hpa_central 2026-06-01 18:18:31 -04:00
Slobodan Predolac
1619dda8a4 Remove cache bin dead stores 2026-06-01 18:18:31 -04:00
Slobodan Predolac
6b24522545 Fix numeric overflow checks in size classes 2026-05-27 11:39:04 -04:00
Slobodan Predolac
136d342aa0 Remove prof lookahead surplus API 2026-05-22 23:34:10 -07:00
Slobodan Predolac
44c2ffaff6 Remove fresh-slab batch fill 2026-05-22 23:34:10 -07:00
Slobodan Predolac
c5a1822d69 Remove batch_alloc API 2026-05-22 23:34:10 -07:00
Slobodan Predolac
78cbeaf8a4 Remove batch_alloc mallctl 2026-05-22 23:34:10 -07:00
Bin Liu
a5db9feee5 Fix psset_enumerate_search pages-vs-bytes comparison 2026-05-21 13:07:08 -07:00
Slobodan Predolac
00f53eb337 Add follow-up test for postfork multithread
Fix FreeBSD postfork child handler never being called: FreeBSD's libthr
calls _malloc_postfork in both parent and child (see freebsd-src
lib/libthr/thread/thr_fork.c), but jemalloc mapped it to the parent
handler only.  Detect the child via getpid() and route to
jemalloc_postfork_child, which resets nthreads and rebuilds the
descriptor queue.

Remove the child_survivor_bytes vs pre_survivor_bytes comparison: on
macOS where jemalloc registers as the default zone, internal allocations
during the postfork handler (pthread_mutex_init) can inflate the
surviving thread's tcache.

Add double-fork test to verify prefork pid is refreshed correctly when a
child process forks again.
2026-05-20 08:57:37 -04:00
Christoph Grüninger
300b58b49b arena_s: Replace bin_t all_bins[0] by [] for C99 or newer
Zero-sized arrays are not allowed by ISO C.
C99 introduced a way to express this.
Type-checking fails, because all_bins is asigned malloced
storage of length > 0.
Found by GCC and Clang (-Wpedantic).
2026-05-19 12:02:12 -04:00
Tony Printezis
295e48944b Set SEC_MAX_NALLOCS to 8. 2026-05-18 16:06:10 -07:00
Tony Printezis
f008ce9fe1 Remove hpa_sec_batch_fill_extra and calculate nallocs automatically.
This change includes the following improvements:

- Remove the hpa_sec_batch_fill_extra parameter.
- Refactor the hpa_alloc() code and helper functions to be able to
  allocate more than one extent out of a single pageslab. This way
  we can amortize the per-pageslab costs (active bitmap iteration,
  pageslab metadata updates) across multiple extents.
- Decide on a min and max number of extents that will be allocated
  in hpa_alloc(). The code will try to allocate at least the min
  and allocate up to the max as long as we can allocate additional
  ones from the pageslab we already have, as additional allocations
  are relatively cheap.
- Add extent allocation distribution stats.
- Amend hpa_sec_integration.c unit test.
2026-05-14 11:00:33 -07:00
Slobodan Predolac
639e70fcfb Make TSD state non-atomic 2026-05-13 18:27:43 -04:00
Slobodan Predolac
cec4e84c02 Remove obsolete TSD nominal list 2026-05-13 18:27:43 -04:00
Slobodan Predolac
42e671433f Remove obsolete TSD recompute state 2026-05-13 18:27:43 -04:00
Slobodan Predolac
ff2c2548a3 Remove generic experimental hooks 2026-05-13 18:27:43 -04:00
Slobodan Predolac
3f9d8ca3d0 Add postfork descriptor relink test to unit/fork 2026-05-13 17:50:41 -04:00
Slobodan Predolac
88745978e9 Pass surviving descriptor through jemalloc_postfork_child orchestrator
The orchestrator looks up the surviving descriptor via
tcache_postfork_arena_descriptor and threads it into
arena_postfork_child, eliminating arena's call into tcache. Also reset
cache_bin_array_descriptor_ql_mtx right before the queue rebuild it
protects.
2026-05-13 17:50:41 -04:00
Slobodan Predolac
3cd9753e23 Move tcache_stats_merge into arena as arena_cache_bins_stats_merge 2026-05-13 17:50:41 -04:00
Slobodan Predolac
35d102fa32 Encapsulate cache_bin_array_descriptor queue ops behind arena helpers
tcache.c was reaching into arena->cache_bin_array_descriptor_ql{,_mtx}
directly to register / unregister / postfork-relink its descriptor.
That queue and mutex are owned by arena, so the locking and ql_*
operations belong in arena.c.
2026-05-13 17:50:41 -04:00
Slobodan Predolac
36820f9b76 Drop redundant tcache_t param from tcache_arena_{associate,dissociate,reassociate}
After tcache_init runs, tcache_slow->tcache == tcache always holds, so
the tcache_t parameter to the three association helpers is derivable
from tcache_slow.
2026-05-13 17:50:41 -04:00
Slobodan Predolac
b92420d309 Replace arena->tcache_ql with cache_bin_array_descriptor_ql walks
Drop the duplicate arena->tcache_ql; stats merging walks the
cache_bin_array_descriptor_ql directly. Rename the protecting mutex
from tcache_ql_mtx to cache_bin_array_descriptor_ql_mtx to match. Add
an assertion in test_thread_migrate_arena that the dissociate-time
flush zeros cache_bin->tstats.nrequests.
2026-05-13 17:50:41 -04:00
Slobodan Predolac
f9c84860e0 Fold tcache reassociation into thread_migrate_arena helper 2026-05-13 17:50:41 -04:00
Slobodan Predolac
54ef51121b Extract postfork-child tcache list relink into tcache_arena_postfork_child 2026-05-13 17:50:41 -04:00
Slobodan Predolac
b6cfaa4fe2 Extract large-cacheable tcache check into tcache_can_cache_large 2026-05-13 17:50:41 -04:00
Slobodan Predolac
3c1c6ae419 Hide bin slab-locality query behind arena_locality_hint
bin_t is an arena implementation detail; tcache should not reach into
it. Extract the slab-address lookup into bin.c as bin_current_slab_addr,
and expose it to tcache only through arena_locality_hint(tsdn, arena,
szind), which composes bin_choose + bin_current_slab_addr.
2026-05-13 17:50:41 -04:00
Slobodan Predolac
e286fba00a Extract bin->stats.nrequests mutation into bin_stats_nrequests_add 2026-05-13 17:50:41 -04:00
guangli-dai
8edd101286 Remove dead pai_t field and delete pai.h
After replacing PAI vtable dispatch with direct calls in the previous
commit, the embedded pai_t member in pac_t and hpa_shard_t is dead
weight, and pai.h has no remaining users. Remove them.

Changes:
- Drop pai_t pai member (and "must be first member" comment) from
  pac_t and hpa_shard_t.
- Replace #include "jemalloc/internal/pai.h" with the actually-needed
  edata.h / tsd_types.h in pac.h, hpa.h, sec.h, pa.h.
- Update extent_pai_t comment in edata.h to no longer reference pai.h.
- Update three remaining test files (hpa_thp_always,
  hpa_vectorized_madvise, hpa_vectorized_madvise_large_batch) to call
  hpa_*(tsdn, shard, ...) directly instead of pai_*(tsdn, &shard->pai,
  ...).
- Delete include/jemalloc/internal/pai.h.

No behavioral changes.
2026-05-12 13:43:16 -07:00
Guangli Dai
1dfa6f7aa4 Replace PAI vtable dispatch with direct calls
The pai_t interface implements C-style polymorphism via function pointers
to abstract over PAC and HPA. This abstraction provides no real benefit:
only two implementations exist, the dispatcher already knows which one to
use, and HPA stubs 2 of 5 operations. Remove the runtime dispatch in
favor of direct calls.

This commit:
- Promotes pac_alloc/expand/shrink/dalloc/time_until_deferred_work to
  external linkage and replaces the pai_t *self parameter with pac_t *pac.
- Promotes hpa_alloc/expand/shrink/dalloc/time_until_deferred_work to
  external linkage and replaces pai_t *self with hpa_shard_t *shard.
- Updates hpa_dalloc_batch's signature to take hpa_shard_t * directly
  and removes the hpa_from_pai container-of helper. Updates internal
  callers in hpa_alloc, hpa_dalloc, and hpa_sec_flush_impl.
- Drops the vtable assignments from pac_init() and hpa_shard_init().
- Replaces pai_alloc/dalloc/etc. dispatch in pa.c with direct calls.
  HPA expand and shrink (which are unconditional failure stubs) are
  skipped entirely for HPA-owned extents.
- Removes the pa_get_pai() helper.
- Updates tests in test/unit/hpa.c and test/unit/hpa_sec_integration.c
  to call hpa_alloc/dalloc/etc. directly.

The pai_t struct field stays as dead weight in pac_t and hpa_shard_t;
it is removed in the next commit along with pai.h itself.

No behavioral changes.
2026-05-12 13:43:16 -07:00
Slobodan Predolac
163c871d6c Add DSS allocation path unit tests 2026-05-12 13:14:39 -04:00
Slobodan Predolac
6e7c364e90 Hide methods from jemalloc_init.h that are not used in other units 2026-05-11 16:23:09 -07:00
Christoph Grüninger
a34a8c5e13 Unify semicolon after ph_proto and ph_structs
Fix extra semicolon after these macros.
Found by GCC 16 (pedantic).
2026-05-08 11:39:56 -07:00
Christoph Grüninger
548e233966 Fix wrong semicolon
Move into else branch, otherwise there are two semicolon in the
if branch.
Found by Clang 22 (pedantic).
2026-05-08 11:39:56 -07:00