Commit graph

3723 commits

Author SHA1 Message Date
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
Christoph Grüninger
5acdcee600 Remove extra semicolon after macros
There is no compatible way to consume the semicolon by the macro.
Found by GCC 16 (pedantic).
2026-05-08 11:39:56 -07:00
orbisai0security
1ffd5e96d6 Avoid strncpy in malloc_strcpy
Signed-off-by: orbisai0security <>
2026-05-05 11:14:36 -07:00
Bin Liu
be2de8ccd8 Introduce pinned extents to contain unpurgeable pages
Some pages (e.g., hugetlb pages) cannot be purged, and should be
prioritized for reuse.  A custom extent_alloc hook signals this by
OR'ing EXTENT_ALLOC_FLAG_PINNED into the low bits of the returned
pointer; jemalloc strips the flag bits and caches pinned extents in
a dedicated ecache_pinned, separate from the dirty/muzzy decay
pipeline.

Pinned extents do not coalesce eagerly, except for ones larger than
SC_LARGE_MINCLASS.  A prefer-small policy reuses the smallest fitting
pinned extent, to avoid unnecessary split/fragmentation.
2026-05-05 10:44:28 -07:00
Slobodan Predolac
7638093c73 Improve const correctness in the repo 2026-05-04 11:56:17 -07:00
Slobodan Predolac
86f058287f Restore errno save/restore in pages_purge_process_madvise_impl
TODO comment focused on free only, but this path is reachable via
other calls and it is safer to leave errno preservation here.
2026-05-01 15:07:25 -04:00
Slobodan Predolac
9ae0c1b6d3 Make huge_arena_ind static within the arena module (Follow up for PR #2904) 2026-05-01 13:24:45 -04:00
Slobodan Predolac
3a77966168 Preserve errno across free, free_sized, and free_aligned_sized 2026-04-30 18:07:35 -04:00
Slobodan Predolac
4cc497a4a7 Add configurable HPA opts, shard count override, and bump MAX_ALLOCATIONS
Three changes to make pa_microbench easier to drive for fragmentation
experiments:

- Replace HPA_SHARD_OPTS_DEFAULT use with a single editable g_hpa_opts
  global. The microbench does not consult MALLOC_CONF for HPA shard opts,
  so this is the place to set the baseline configuration (slab_max_alloc,
  hugification_threshold, dirty_mult, hugify_delay_ms, purge_threshold,
  hugify_style, etc.).

- Add -n/--nshards N to override the shard count derived from the trace.
  When set, each event is routed to (event->shard_ind % N), letting us
  study the impact of arena consolidation. Without the flag the behavior
  is unchanged (num_shards = max_shard_id + 1).

- Bump MAX_ALLOCATIONS from 10M to 200M so the full ~50M-event adfinder
  trace (and similar) fits in the in-memory event buffer.
2026-04-30 17:48:32 -04:00
Slobodan Predolac
6e0b8e6daa Improve unit test coverage for jemalloc_init, arenas_management, and jemalloc_fork modules 2026-04-30 15:17:18 -04:00
Slobodan Predolac
ba1e2fe4db Extract fork orchestration into jemalloc_fork module 2026-04-30 15:17:18 -04:00
Slobodan Predolac
ec07fc3c5f Extract initialization logic from jemalloc.c into jemalloc_init module 2026-04-30 15:17:18 -04:00
Slobodan Predolac
e0a8401533 Extract arena state and management from jemalloc.c into arenas_management module 2026-04-30 15:17:18 -04:00
guangli-dai
ee4d7b7f9a Update a0's oversize threshold regardless whether huge arena is enabled or not. 2026-04-29 13:25:29 -07:00
guangli-dai
70b228dece Fix assertion for cases where tiny classes do not exist 2026-04-29 13:25:29 -07:00
lexprfuncall
1a15fe33a4
Replace std::__throw_bad_alloc call with standard C++ (#2900)
* Replace std::__throw_bad_alloc call with standard C++

Since December of 2025, std::__throw_bad_alloc is no longer visible
through #include <new> causing jemalloc build failures with gcc 16.
As far as I can tell, all std::__throw_bad_alloc did was arrange to
raise a std::bad_alloc exception if exceptions are enabled.  I am not
sure whether its usage was truly meaningful in jemalloc since the call
is wrapped in a try catch and any usage of try catch is considered an
error when compiling with -fno-exceptions on gcc, at least.

This change adds a check to configure.ac that determines whether
exceptions are enabled by compiling a simple try catch that raises a
std::bad_alloc exception.  If that test succeeds, the macro
JEMALLOC_HAVE_CXX_EXCEPTIONS is defined, and jemalloc will raise an
exception.  Otherwise, we call std::terminate() to abort.

This was tested on FreeBSD with the gcc16 port with and without exceptions
enabled.

* Replace std::set_new_handler calls with std::get_new_handler

Previously, std::set_new_handler was used as a workaround for
compilers with only partial support for C++11.  Now that C++14 is a
requirement to enable C++ support, we can assume std::get_new_handler
is available.
2026-04-27 11:50:27 -07:00
guangli-dai
bb0a6aca10 Allow spaces in prefix. 2026-04-27 09:59:59 -07:00
Slobodan Predolac
76015f519f Fix bug in pa_microbench
pa_microbench was creating its own emap_t per shard on top of the
arena_emap_global that JET malloc initializes during jet_malloc(16)
at startup, breaking the production assumption of one rtree per
process. Fix it by reusing the existing JET emap.
2026-04-23 18:36:13 -04:00
guangli-dai
8072ccc5e9 Fix a link error in the doc 2026-04-23 14:40:13 -07:00
Slobodan Predolac
6cd31c0985 Fix several typos in the comments 2026-04-22 13:35:18 -04:00
guangli-dai
d7b283ed32 Update Github Actions generation script and upgrade freeBSD actions. 2026-04-21 13:16:44 -07:00
Christoph Grüninger
94977e823e [ci] Update GitHub Actions to their latest major release 2026-04-20 19:40:42 -07:00
guangli-dai
873d91033b Add conf.c into msvc and update INSTALL.md 2026-04-20 12:22:59 -07:00
guangli-dai
0edea8b1b0 Update msys to vs2022 for appveyor 2026-04-19 22:49:25 -07:00
Integral
1f44a8b11d
Change permission modes of static libraries to 644 (#2885)
Static libraries are archives and do not need the executable bit.
2026-04-19 14:13:02 -07:00
Guangli Dai
81034ce1f1
Update ChangeLog for release 5.3.1 2026-04-13 17:12:37 -07:00
Ian Ker-Seymer
b8646f4db3 Fix opt.max_background_threads default in docs 2026-04-13 14:46:53 -07:00
Guangli Dai
6515df8cec
Documentation updates (#2869)
* Document new mallctl interfaces added since 5.3.0

Add documentation for the following new mallctl entries:
- opt.debug_double_free_max_scan: double-free detection scan limit
- opt.prof_bt_max: max profiling backtrace depth
- opt.disable_large_size_classes: page-aligned large allocations
- opt.process_madvise_max_batch: batched process_madvise purging
- thread.tcache.max: per-thread tcache_max control
- thread.tcache.ncached_max.read_sizeclass: query ncached_max
- thread.tcache.ncached_max.write: set ncached_max per size range
- arena.<i>.name: get/set arena names
- arenas.hugepage: hugepage size
- approximate_stats.active: lightweight active bytes estimate

Remove config.prof_frameptr since it still needs more development
and is still experimental.

Co-authored-by: lexprfuncall <carl.shapiro@gmail.com>
2026-04-07 10:41:44 -07:00
Slobodan Predolac
f265645d02 Emit retained HPA slab stats in JSON 2026-04-01 23:15:19 -04:00