Skip to content

Commit d30a2d3

Browse files
committed
Split global roots
Split gc_mark_roots into multiple functions so that they can be called from different work packets.
1 parent e37fb27 commit d30a2d3

File tree

4 files changed

+90
-18
lines changed

4 files changed

+90
-18
lines changed

gc.c

+68-5
Original file line numberDiff line numberDiff line change
@@ -7315,6 +7315,11 @@ rb_gc_remove_weak(VALUE parent_obj, VALUE *ptr)
73157315
static inline void
73167316
gc_mark_set_parent(rb_objspace_t *objspace, VALUE obj)
73177317
{
7318+
WHEN_USING_MMTK({
7319+
// MMTk scans object concurrently. This function only adds one more source of data race.
7320+
return;
7321+
})
7322+
73187323
if (RVALUE_OLD_P(obj)) {
73197324
objspace->rgengc.parent_object = obj;
73207325
}
@@ -7670,7 +7675,17 @@ gc_mark_roots(rb_objspace_t *objspace, const char **categoryp)
76707675
#if USE_MMTK
76717676
const bool mmtk_enabled_local = rb_mmtk_enabled_p(); // Allows control-flow sensitive analysis of ec etc
76727677
if (mmtk_enabled_local) {
7673-
rb_mmtk_assert_mmtk_worker();
7678+
if (GET_RACTOR()->mfd == NULL) {
7679+
// When using MMTk, we don't directly call `gc_mark_roots` for scanning roots.
7680+
// Instead, we split this function into multiple functions named `rb_mmtk_scan_*_roots`
7681+
// so that they can be paralleled by calling them from different work packets.
7682+
rb_bug("gc_mark_roots should not be called when using MMTk.");
7683+
} else {
7684+
// We still call `gc_mark_roots` when enumerating objects reachable from roots.
7685+
// In this case, this function will be called from mutator.
7686+
rb_mmtk_assert_mutator();
7687+
}
7688+
76747689
vm = GET_VM();
76757690
} else {
76767691
#endif
@@ -7759,6 +7774,57 @@ gc_mark_roots(rb_objspace_t *objspace, const char **categoryp)
77597774
#undef MARK_CHECKPOINT
77607775
}
77617776

7777+
#if USE_MMTK
7778+
void
7779+
rb_mmtk_scan_vm_roots(void)
7780+
{
7781+
rb_vm_t *vm = GET_VM();
7782+
rb_objspace_t *objspace = vm->objspace;
7783+
7784+
rb_vm_mark(vm);
7785+
if (vm->self) gc_mark(objspace, vm->self);
7786+
}
7787+
7788+
void
7789+
rb_mmtk_scan_finalizer_tbl_roots(void)
7790+
{
7791+
rb_vm_t *vm = GET_VM();
7792+
rb_objspace_t *objspace = vm->objspace;
7793+
7794+
mark_finalizer_tbl(objspace, finalizer_table);
7795+
}
7796+
7797+
void
7798+
rb_mmtk_scan_end_proc_roots(void)
7799+
{
7800+
rb_mark_end_proc();
7801+
}
7802+
7803+
void
7804+
rb_mmtk_scan_global_tbl_roots(void)
7805+
{
7806+
rb_gc_mark_global_tbl();
7807+
}
7808+
7809+
void
7810+
rb_mmtk_scan_obj_to_id_tbl_roots(void)
7811+
{
7812+
rb_vm_t *vm = GET_VM();
7813+
rb_objspace_t *objspace = vm->objspace;
7814+
7815+
mark_tbl_no_pin(objspace, objspace->obj_to_id_tbl); /* Only mark ids */
7816+
}
7817+
7818+
void
7819+
rb_mmtk_scan_misc_roots(void)
7820+
{
7821+
rb_vm_t *vm = GET_VM();
7822+
rb_objspace_t *objspace = vm->objspace;
7823+
7824+
if (stress_to_class) rb_gc_mark(stress_to_class);
7825+
}
7826+
#endif
7827+
77627828
#if RGENGC_CHECK_MODE >= 4
77637829

77647830
#define MAKE_ROOTSIG(obj) (((VALUE)(obj) << 1) | 0x01)
@@ -14778,11 +14844,8 @@ rb_mmtk_update_ci_table(void)
1477814844

1477914845
// Workaround private functions
1478014846
void
14781-
rb_mmtk_mark_roots(void)
14847+
rb_mmtk_scan_final_jobs_roots(void)
1478214848
{
14783-
rb_vm_t *vm = GET_VM();
14784-
const char *phase;
14785-
gc_mark_roots(vm->objspace, &phase);
1478614849
rb_mmtk_mark_final_jobs();
1478714850
}
1478814851

internal/gc.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,14 @@ void rb_gc_initial_stress_set(VALUE flag);
235235
} while (0)
236236

237237
#if USE_MMTK
238-
void rb_mmtk_mark_roots(void);
238+
void rb_mmtk_scan_vm_roots(void);
239+
void rb_mmtk_scan_finalizer_tbl_roots(void);
240+
void rb_mmtk_scan_end_proc_roots(void);
241+
void rb_mmtk_scan_global_tbl_roots(void);
242+
void rb_mmtk_scan_obj_to_id_tbl_roots(void);
243+
void rb_mmtk_scan_misc_roots(void);
244+
void rb_mmtk_scan_final_jobs_roots(void);
245+
239246
void rb_mmtk_mark_children(VALUE obj);
240247
void rb_mmtk_update_object_references(VALUE obj);
241248
void rb_mmtk_obj_free(VALUE obj);

internal/mmtk.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@ typedef struct MMTk_RubyUpcalls {
6262
void (*block_for_gc)(MMTk_VMMutatorThread tls);
6363
size_t (*number_of_mutators)(void);
6464
void (*get_mutators)(void (*visit_mutator)(MMTk_Mutator*, void*), void *data);
65-
void (*scan_vm_specific_roots)(void);
65+
void (*scan_vm_roots)(void);
66+
void (*scan_finalizer_tbl_roots)(void);
67+
void (*scan_end_proc_roots)(void);
68+
void (*scan_global_tbl_roots)(void);
69+
void (*scan_obj_to_id_tbl_roots)(void);
70+
void (*scan_misc_roots)(void);
71+
void (*scan_final_jobs_roots)(void);
6672
void (*scan_roots_in_mutator_thread)(MMTk_VMMutatorThread mutator_tls,
6773
MMTk_VMWorkerThread worker_tls);
6874
void (*scan_object_ruby_style)(MMTk_ObjectReference object);

mmtk_support.c

+7-11
Original file line numberDiff line numberDiff line change
@@ -1556,16 +1556,6 @@ rb_mmtk_get_mutators(void (*visit_mutator)(MMTk_Mutator *mutator, void *data), v
15561556
}
15571557
}
15581558

1559-
static void
1560-
rb_mmtk_scan_vm_specific_roots(void)
1561-
{
1562-
rb_mmtk_assert_mmtk_worker();
1563-
1564-
RUBY_DEBUG_LOG("Scanning VM-specific roots...");
1565-
1566-
rb_mmtk_mark_roots();
1567-
}
1568-
15691559
static void
15701560
rb_mmtk_scan_roots_in_mutator_thread(MMTk_VMMutatorThread mutator, MMTk_VMWorkerThread worker)
15711561
{
@@ -1616,7 +1606,13 @@ MMTk_RubyUpcalls ruby_upcalls = {
16161606
rb_mmtk_block_for_gc,
16171607
rb_mmtk_number_of_mutators,
16181608
rb_mmtk_get_mutators,
1619-
rb_mmtk_scan_vm_specific_roots,
1609+
rb_mmtk_scan_vm_roots,
1610+
rb_mmtk_scan_finalizer_tbl_roots,
1611+
rb_mmtk_scan_end_proc_roots,
1612+
rb_mmtk_scan_global_tbl_roots,
1613+
rb_mmtk_scan_obj_to_id_tbl_roots,
1614+
rb_mmtk_scan_misc_roots,
1615+
rb_mmtk_scan_final_jobs_roots,
16201616
rb_mmtk_scan_roots_in_mutator_thread,
16211617
rb_mmtk_scan_object_ruby_style,
16221618
rb_mmtk_call_gc_mark_children,

0 commit comments

Comments
 (0)