Skip to content

Commit

Permalink
[release-1.11] fix GC race bug in pool sweep (#55485)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
d-netto committed Aug 14, 2024
1 parent 133b83a commit bcb33ed
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 6 deletions.
10 changes: 5 additions & 5 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1430,7 +1430,7 @@ STATIC_INLINE void gc_dump_page_utilization_data(void) JL_NOTSAFEPOINT
}
}

int64_t buffered_pages = 0;
_Atomic(int64_t) buffered_pages = 0;

// Returns pointer to terminal pointer of list rooted at *pfl.
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,
Expand Down Expand Up @@ -1461,8 +1461,8 @@ static void gc_sweep_page(gc_page_profiler_serializer_t *s, jl_gc_pool_t *p, jl_
// the eager one uses less memory.
// FIXME - need to do accounting on a per-thread basis
// on quick sweeps, keep a few pages empty but allocated for performance
if (!current_sweep_full && buffered_pages <= default_collect_interval / GC_PAGE_SZ) {
buffered_pages++;
if (!current_sweep_full && jl_atomic_load_relaxed(&buffered_pages) <= default_collect_interval / GC_PAGE_SZ) {
jl_atomic_fetch_add_relaxed(&buffered_pages, 1);
keep_as_local_buffer = 1;
}
#endif
Expand Down Expand Up @@ -1756,7 +1756,7 @@ void gc_free_pages(void)
static void gc_sweep_pool(void)
{
gc_time_pool_start();
buffered_pages = 0;
jl_atomic_store_relaxed(&buffered_pages, 0);

// For the benefit of the analyzer, which doesn't know that gc_n_threads
// doesn't change over the course of this function
Expand Down Expand Up @@ -1800,7 +1800,7 @@ static void gc_sweep_pool(void)
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_buffered.bottom);
while (pg != NULL) {
jl_gc_pagemeta_t *pg2 = pg->next;
buffered_pages++;
jl_atomic_fetch_add_relaxed(&buffered_pages, 1);
pg = pg2;
}
}
Expand Down
1 change: 0 additions & 1 deletion src/gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,6 @@ extern jl_gc_num_t gc_num;
extern bigval_t *big_objects_marked;
extern arraylist_t finalizer_list_marked;
extern arraylist_t to_finalize;
extern int64_t buffered_pages;
extern int gc_first_tid;
extern int gc_n_threads;
extern jl_ptls_t* gc_all_tls_states;
Expand Down

0 comments on commit bcb33ed

Please sign in to comment.