Skip to content

Commit bcb33ed

Browse files
authored
[release-1.11] fix GC race bug in pool sweep (#55485)
We have parallel sweeping on 1.11, so we should use atomics here. This issue has already been fixed on master due to #54961. We can also backport #54961 to release-1.11, but I have some preference to land this one since it's considerably less disruptive and we're already on RC2.
1 parent 133b83a commit bcb33ed

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

src/gc.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -1430,7 +1430,7 @@ STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT
14301430
}
14311431
}
14321432

1433-
int64_t buffered_pages = 0;
1433+
_Atomic(int64_t) buffered_pages = 0;
14341434

14351435
// Returns pointer to terminal pointer of list rooted at *pfl.
14361436
static void gc_sweep_page(gc_page_profiler_serializer_t *s, jl_gc_pool_t *p, jl_gc_page_stack_t *allocd, jl_gc_page_stack_t *buffered,
@@ -1461,8 +1461,8 @@ static void gc_sweep_page(gc_page_profiler_serializer_t *s, jl_gc_pool_t *p, jl_
14611461
// the eager one uses less memory.
14621462
// FIXME - need to do accounting on a per-thread basis
14631463
// on quick sweeps, keep a few pages empty but allocated for performance
1464-
if (!current_sweep_full && buffered_pages <= default_collect_interval / GC_PAGE_SZ) {
1465-
buffered_pages++;
1464+
if (!current_sweep_full && jl_atomic_load_relaxed(&buffered_pages) <= default_collect_interval / GC_PAGE_SZ) {
1465+
jl_atomic_fetch_add_relaxed(&buffered_pages, 1);
14661466
keep_as_local_buffer = 1;
14671467
}
14681468
#endif
@@ -1756,7 +1756,7 @@ void gc_free_pages(void)
17561756
static void gc_sweep_pool(void)
17571757
{
17581758
gc_time_pool_start();
1759-
buffered_pages = 0;
1759+
jl_atomic_store_relaxed(&buffered_pages, 0);
17601760

17611761
// For the benefit of the analyzer, which doesn't know that gc_n_threads
17621762
// doesn't change over the course of this function
@@ -1800,7 +1800,7 @@ static void gc_sweep_pool(void)
18001800
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_buffered.bottom);
18011801
while (pg != NULL) {
18021802
jl_gc_pagemeta_t *pg2 = pg->next;
1803-
buffered_pages++;
1803+
jl_atomic_fetch_add_relaxed(&buffered_pages, 1);
18041804
pg = pg2;
18051805
}
18061806
}

src/gc.h

-1
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,6 @@ extern jl_gc_num_t gc_num;
441441
extern bigval_t *big_objects_marked;
442442
extern arraylist_t finalizer_list_marked;
443443
extern arraylist_t to_finalize;
444-
extern int64_t buffered_pages;
445444
extern int gc_first_tid;
446445
extern int gc_n_threads;
447446
extern jl_ptls_t* gc_all_tls_states;

0 commit comments

Comments
 (0)