Skip to content

Commit 425463a

Browse files
committed
Check arena in current context in pre_reentrancy.
1 parent d6eb8ac commit 425463a

File tree

7 files changed

+51
-47
lines changed

7 files changed

+51
-47
lines changed

include/jemalloc/internal/jemalloc_internal_inlines_a.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,10 @@ tcache_get(tsd_t *tsd) {
146146
}
147147

148148
static inline void
149-
pre_reentrancy(tsd_t *tsd) {
149+
pre_reentrancy(tsd_t *tsd, arena_t *arena) {
150+
/* arena is the current context. Reentry from a0 is not allowed. */
151+
assert(arena != arena_get(tsd_tsdn(tsd), 0, false));
152+
150153
bool fast = tsd_fast(tsd);
151154
++*tsd_reentrancy_levelp_get(tsd);
152155
if (fast) {

src/arena.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,7 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) {
20512051
* is done enough that we should have tsd.
20522052
*/
20532053
assert(!tsdn_null(tsdn));
2054-
pre_reentrancy(tsdn_tsd(tsdn));
2054+
pre_reentrancy(tsdn_tsd(tsdn), arena);
20552055
if (hooks_arena_new_hook) {
20562056
hooks_arena_new_hook();
20572057
}

src/background_thread.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ background_threads_disable_single(tsd_t *tsd, background_thread_info_t *info) {
316316
&background_thread_lock);
317317
}
318318

319-
pre_reentrancy(tsd);
319+
pre_reentrancy(tsd, NULL);
320320
malloc_mutex_lock(tsd_tsdn(tsd), &info->mtx);
321321
bool has_thread;
322322
assert(info->state != background_thread_paused);
@@ -408,7 +408,7 @@ check_background_thread_creation(tsd_t *tsd, unsigned *n_created,
408408
*/
409409
malloc_mutex_unlock(tsd_tsdn(tsd), &background_thread_lock);
410410

411-
pre_reentrancy(tsd);
411+
pre_reentrancy(tsd, NULL);
412412
int err = background_thread_create_signals_masked(&info->thread,
413413
NULL, background_thread_entry, (void *)(uintptr_t)i);
414414
post_reentrancy(tsd);
@@ -557,7 +557,7 @@ background_thread_create(tsd_t *tsd, unsigned arena_ind) {
557557
return false;
558558
}
559559

560-
pre_reentrancy(tsd);
560+
pre_reentrancy(tsd, NULL);
561561
/*
562562
* To avoid complications (besides reentrancy), create internal
563563
* background threads with the underlying pthread_create.

src/base.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ base_map(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, size_t size)
2525
if (extent_hooks == &extent_hooks_default) {
2626
addr = extent_alloc_mmap(NULL, size, PAGE, &zero, &commit);
2727
} else {
28-
assert(!tsdn_null(tsdn));
29-
pre_reentrancy(tsdn_tsd(tsdn));
28+
/* No arena context as we are creating new arenas. */
29+
tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn);
30+
pre_reentrancy(tsd, NULL);
3031
addr = extent_hooks->alloc(extent_hooks, NULL, size, PAGE,
3132
&zero, &commit, ind);
32-
post_reentrancy(tsdn_tsd(tsdn));
33+
post_reentrancy(tsd);
3334
}
3435

3536
return addr;
@@ -64,8 +65,8 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr,
6465
/* Nothing worked. This should never happen. */
6566
not_reached();
6667
} else {
67-
assert(!tsdn_null(tsdn));
68-
pre_reentrancy(tsdn_tsd(tsdn));
68+
tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn);
69+
pre_reentrancy(tsd, NULL);
6970
if (extent_hooks->dalloc != NULL &&
7071
!extent_hooks->dalloc(extent_hooks, addr, size, true,
7172
ind)) {
@@ -88,7 +89,7 @@ base_unmap(tsdn_t *tsdn, extent_hooks_t *extent_hooks, unsigned ind, void *addr,
8889
}
8990
/* Nothing worked. That's the application's problem. */
9091
label_done:
91-
post_reentrancy(tsdn_tsd(tsdn));
92+
post_reentrancy(tsd);
9293
return;
9394
}
9495
}

src/extent.c

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,18 @@ extent_alloc_default(extent_hooks_t *extent_hooks, void *new_addr, size_t size,
10251025
alignment, zero, commit);
10261026
}
10271027

1028+
static void
1029+
extent_hook_pre_reentrancy(tsdn_t *tsdn, arena_t *arena) {
1030+
tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn);
1031+
pre_reentrancy(tsd, arena);
1032+
}
1033+
1034+
static void
1035+
extent_hook_post_reentrancy(tsdn_t *tsdn) {
1036+
tsd_t *tsd = tsdn_null(tsdn) ? tsd_fetch() : tsdn_tsd(tsdn);
1037+
post_reentrancy(tsd);
1038+
}
1039+
10281040
/*
10291041
* If virtual memory is retained, create increasingly larger extents from which
10301042
* to split requested extents in order to limit the total number of disjoint
@@ -1073,12 +1085,11 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
10731085
&zeroed, &committed, (dss_prec_t)atomic_load_u(
10741086
&arena->dss_prec, ATOMIC_RELAXED));
10751087
} else {
1076-
assert(!tsdn_null(tsdn));
1077-
pre_reentrancy(tsdn_tsd(tsdn));
1088+
extent_hook_pre_reentrancy(tsdn, arena);
10781089
ptr = (*r_extent_hooks)->alloc(*r_extent_hooks, NULL,
10791090
alloc_size, PAGE, &zeroed, &committed,
10801091
arena_ind_get(arena));
1081-
post_reentrancy(tsdn_tsd(tsdn));
1092+
extent_hook_post_reentrancy(tsdn);
10821093
}
10831094

10841095
extent_init(extent, arena, ptr, alloc_size, false, NSIZES,
@@ -1250,11 +1261,10 @@ extent_alloc_wrapper_hard(tsdn_t *tsdn, arena_t *arena,
12501261
addr = extent_alloc_default_impl(tsdn, arena, new_addr, esize,
12511262
alignment, zero, commit);
12521263
} else {
1253-
assert(!tsdn_null(tsdn));
1254-
pre_reentrancy(tsdn_tsd(tsdn));
1264+
extent_hook_pre_reentrancy(tsdn, arena);
12551265
addr = (*r_extent_hooks)->alloc(*r_extent_hooks, new_addr,
12561266
esize, alignment, zero, commit, arena_ind_get(arena));
1257-
post_reentrancy(tsdn_tsd(tsdn));
1267+
extent_hook_post_reentrancy(tsdn);
12581268
}
12591269
if (addr == NULL) {
12601270
extent_dalloc(tsdn, arena, extent);
@@ -1492,13 +1502,12 @@ extent_dalloc_wrapper_try(tsdn_t *tsdn, arena_t *arena,
14921502
err = extent_dalloc_default_impl(extent_base_get(extent),
14931503
extent_size_get(extent));
14941504
} else {
1495-
assert(!tsdn_null(tsdn));
1496-
pre_reentrancy(tsdn_tsd(tsdn));
1505+
extent_hook_pre_reentrancy(tsdn, arena);
14971506
err = ((*r_extent_hooks)->dalloc == NULL ||
14981507
(*r_extent_hooks)->dalloc(*r_extent_hooks,
14991508
extent_base_get(extent), extent_size_get(extent),
15001509
extent_committed_get(extent), arena_ind_get(arena)));
1501-
post_reentrancy(tsdn_tsd(tsdn));
1510+
extent_hook_post_reentrancy(tsdn);
15021511
}
15031512

15041513
if (!err) {
@@ -1525,8 +1534,7 @@ extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena,
15251534

15261535
extent_reregister(tsdn, extent);
15271536
if (*r_extent_hooks != &extent_hooks_default) {
1528-
assert(!tsdn_null(tsdn));
1529-
pre_reentrancy(tsdn_tsd(tsdn));
1537+
extent_hook_pre_reentrancy(tsdn, arena);
15301538
}
15311539
/* Try to decommit; purge if that fails. */
15321540
bool zeroed;
@@ -1550,7 +1558,7 @@ extent_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena,
15501558
zeroed = false;
15511559
}
15521560
if (*r_extent_hooks != &extent_hooks_default) {
1553-
post_reentrancy(tsdn_tsd(tsdn));
1561+
extent_hook_post_reentrancy(tsdn);
15541562
}
15551563
extent_zeroed_set(extent, zeroed);
15561564

@@ -1595,12 +1603,11 @@ extent_destroy_wrapper(tsdn_t *tsdn, arena_t *arena,
15951603
extent_destroy_default_impl(extent_base_get(extent),
15961604
extent_size_get(extent));
15971605
} else if ((*r_extent_hooks)->destroy != NULL) {
1598-
assert(!tsdn_null(tsdn));
1599-
pre_reentrancy(tsdn_tsd(tsdn));
1606+
extent_hook_pre_reentrancy(tsdn, arena);
16001607
(*r_extent_hooks)->destroy(*r_extent_hooks,
16011608
extent_base_get(extent), extent_size_get(extent),
16021609
extent_committed_get(extent), arena_ind_get(arena));
1603-
post_reentrancy(tsdn_tsd(tsdn));
1610+
extent_hook_post_reentrancy(tsdn);
16041611
}
16051612

16061613
extent_dalloc(tsdn, arena, extent);
@@ -1622,14 +1629,13 @@ extent_commit_impl(tsdn_t *tsdn, arena_t *arena,
16221629

16231630
extent_hooks_assure_initialized(arena, r_extent_hooks);
16241631
if (*r_extent_hooks != &extent_hooks_default) {
1625-
assert(!tsdn_null(tsdn));
1626-
pre_reentrancy(tsdn_tsd(tsdn));
1632+
extent_hook_pre_reentrancy(tsdn, arena);
16271633
}
16281634
bool err = ((*r_extent_hooks)->commit == NULL ||
16291635
(*r_extent_hooks)->commit(*r_extent_hooks, extent_base_get(extent),
16301636
extent_size_get(extent), offset, length, arena_ind_get(arena)));
16311637
if (*r_extent_hooks != &extent_hooks_default) {
1632-
post_reentrancy(tsdn_tsd(tsdn));
1638+
extent_hook_post_reentrancy(tsdn);
16331639
}
16341640
extent_committed_set(extent, extent_committed_get(extent) || !err);
16351641
return err;
@@ -1660,15 +1666,14 @@ extent_decommit_wrapper(tsdn_t *tsdn, arena_t *arena,
16601666
extent_hooks_assure_initialized(arena, r_extent_hooks);
16611667

16621668
if (*r_extent_hooks != &extent_hooks_default) {
1663-
assert(!tsdn_null(tsdn));
1664-
pre_reentrancy(tsdn_tsd(tsdn));
1669+
extent_hook_pre_reentrancy(tsdn, arena);
16651670
}
16661671
bool err = ((*r_extent_hooks)->decommit == NULL ||
16671672
(*r_extent_hooks)->decommit(*r_extent_hooks,
16681673
extent_base_get(extent), extent_size_get(extent), offset, length,
16691674
arena_ind_get(arena)));
16701675
if (*r_extent_hooks != &extent_hooks_default) {
1671-
post_reentrancy(tsdn_tsd(tsdn));
1676+
extent_hook_post_reentrancy(tsdn);
16721677
}
16731678
extent_committed_set(extent, extent_committed_get(extent) && err);
16741679
return err;
@@ -1700,16 +1705,14 @@ extent_purge_lazy_impl(tsdn_t *tsdn, arena_t *arena,
17001705
if ((*r_extent_hooks)->purge_lazy == NULL) {
17011706
return true;
17021707
}
1703-
17041708
if (*r_extent_hooks != &extent_hooks_default) {
1705-
assert(!tsdn_null(tsdn));
1706-
pre_reentrancy(tsdn_tsd(tsdn));
1709+
extent_hook_pre_reentrancy(tsdn, arena);
17071710
}
17081711
bool err = (*r_extent_hooks)->purge_lazy(*r_extent_hooks,
17091712
extent_base_get(extent), extent_size_get(extent), offset, length,
17101713
arena_ind_get(arena));
17111714
if (*r_extent_hooks != &extent_hooks_default) {
1712-
post_reentrancy(tsdn_tsd(tsdn));
1715+
extent_hook_post_reentrancy(tsdn);
17131716
}
17141717

17151718
return err;
@@ -1750,14 +1753,13 @@ extent_purge_forced_impl(tsdn_t *tsdn, arena_t *arena,
17501753
return true;
17511754
}
17521755
if (*r_extent_hooks != &extent_hooks_default) {
1753-
assert(!tsdn_null(tsdn));
1754-
pre_reentrancy(tsdn_tsd(tsdn));
1756+
extent_hook_pre_reentrancy(tsdn, arena);
17551757
}
17561758
bool err = (*r_extent_hooks)->purge_forced(*r_extent_hooks,
17571759
extent_base_get(extent), extent_size_get(extent), offset, length,
17581760
arena_ind_get(arena));
17591761
if (*r_extent_hooks != &extent_hooks_default) {
1760-
post_reentrancy(tsdn_tsd(tsdn));
1762+
extent_hook_post_reentrancy(tsdn);
17611763
}
17621764
return err;
17631765
}
@@ -1829,14 +1831,13 @@ extent_split_impl(tsdn_t *tsdn, arena_t *arena,
18291831
extent_lock2(tsdn, extent, trail);
18301832

18311833
if (*r_extent_hooks != &extent_hooks_default) {
1832-
assert(!tsdn_null(tsdn));
1833-
pre_reentrancy(tsdn_tsd(tsdn));
1834+
extent_hook_pre_reentrancy(tsdn, arena);
18341835
}
18351836
bool err = (*r_extent_hooks)->split(*r_extent_hooks, extent_base_get(extent),
18361837
size_a + size_b, size_a, size_b, extent_committed_get(extent),
18371838
arena_ind_get(arena));
18381839
if (*r_extent_hooks != &extent_hooks_default) {
1839-
post_reentrancy(tsdn_tsd(tsdn));
1840+
extent_hook_post_reentrancy(tsdn);
18401841
}
18411842
if (err) {
18421843
goto label_error_c;
@@ -1908,13 +1909,12 @@ extent_merge_impl(tsdn_t *tsdn, arena_t *arena,
19081909
err = extent_merge_default_impl(extent_base_get(a),
19091910
extent_base_get(b));
19101911
} else {
1911-
assert(!tsdn_null(tsdn));
1912-
pre_reentrancy(tsdn_tsd(tsdn));
1912+
extent_hook_pre_reentrancy(tsdn, arena);
19131913
err = (*r_extent_hooks)->merge(*r_extent_hooks,
19141914
extent_base_get(a), extent_size_get(a), extent_base_get(b),
19151915
extent_size_get(b), extent_committed_get(a),
19161916
arena_ind_get(arena));
1917-
post_reentrancy(tsdn_tsd(tsdn));
1917+
extent_hook_post_reentrancy(tsdn);
19181918
}
19191919

19201920
if (err) {

src/jemalloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1476,7 +1476,7 @@ malloc_init_hard(void) {
14761476

14771477
malloc_mutex_lock(tsd_tsdn(tsd), &init_lock);
14781478
/* Set reentrancy level to 1 during init. */
1479-
pre_reentrancy(tsd);
1479+
pre_reentrancy(tsd, NULL);
14801480
/* Initialize narenas before prof_boot2 (for allocation). */
14811481
if (malloc_init_narenas() || background_thread_boot1(tsd_tsdn(tsd))) {
14821482
UNLOCK_RETURN(tsd_tsdn(tsd), true, true)

src/prof.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1633,7 +1633,7 @@ prof_dump(tsd_t *tsd, bool propagate_err, const char *filename,
16331633
return true;
16341634
}
16351635

1636-
pre_reentrancy(tsd);
1636+
pre_reentrancy(tsd, NULL);
16371637
malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_mtx);
16381638

16391639
prof_gctx_tree_t gctxs;

0 commit comments

Comments
 (0)