Skip to content

Commit 29221fe

Browse files
d-nettoRAI CI (GitHub Action Automation)
authored and
RAI CI (GitHub Action Automation)
committed
parallelize sweeping of object pools (JuliaLang#51282)
Sweeping of object pools will either construct a free list through dead objects (if there is at least one live object in a given page) or return the page to the OS (if there are no live objects whatsoever). With this PR, we're basically constructing the free-lists for each GC page in parallel.
1 parent 45931f6 commit 29221fe

File tree

8 files changed

+187
-100
lines changed

8 files changed

+187
-100
lines changed

src/gc-debug.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ static void gc_clear_mark_outer(int bits)
115115
{
116116
for (int i = 0; i < gc_n_threads; i++) {
117117
jl_ptls_t ptls2 = gc_all_tls_states[i];
118-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
118+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
119119
while (pg != NULL) {
120120
gc_clear_mark_page(pg, bits);
121121
pg = pg->next;
@@ -1129,7 +1129,7 @@ static void gc_count_pool_pagetable(void)
11291129
{
11301130
for (int i = 0; i < gc_n_threads; i++) {
11311131
jl_ptls_t ptls2 = gc_all_tls_states[i];
1132-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
1132+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
11331133
while (pg != NULL) {
11341134
if (gc_alloc_map_is_set(pg->data)) {
11351135
gc_count_pool_page(pg);

src/gc-pages.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -129,30 +129,30 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
129129
jl_gc_pagemeta_t *meta = NULL;
130130

131131
// try to get page from `pool_lazily_freed`
132-
meta = pop_lf_page_metadata_back(&global_page_pool_lazily_freed);
132+
meta = pop_lf_back(&global_page_pool_lazily_freed);
133133
if (meta != NULL) {
134134
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
135135
// page is already mapped
136136
return meta;
137137
}
138138

139139
// try to get page from `pool_clean`
140-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
140+
meta = pop_lf_back(&global_page_pool_clean);
141141
if (meta != NULL) {
142142
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
143143
goto exit;
144144
}
145145

146146
// try to get page from `pool_freed`
147-
meta = pop_lf_page_metadata_back(&global_page_pool_freed);
147+
meta = pop_lf_back(&global_page_pool_freed);
148148
if (meta != NULL) {
149149
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
150150
goto exit;
151151
}
152152

153153
uv_mutex_lock(&gc_perm_lock);
154154
// another thread may have allocated a large block while we were waiting...
155-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
155+
meta = pop_lf_back(&global_page_pool_clean);
156156
if (meta != NULL) {
157157
uv_mutex_unlock(&gc_perm_lock);
158158
gc_alloc_map_set(meta->data, 1);
@@ -166,10 +166,10 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
166166
pg->data = data + GC_PAGE_SZ * i;
167167
gc_alloc_map_maybe_create(pg->data);
168168
if (i == 0) {
169-
gc_alloc_map_set(pg->data, 1);
169+
gc_alloc_map_set(pg->data, GC_PAGE_ALLOCATED);
170170
}
171171
else {
172-
push_lf_page_metadata_back(&global_page_pool_clean, pg);
172+
push_lf_back(&global_page_pool_clean, pg);
173173
}
174174
}
175175
uv_mutex_unlock(&gc_perm_lock);

0 commit comments

Comments
 (0)