Skip to content

Commit 15de9cc

Browse files
[mono][sgen] Add separate card mark function to be used with debug (#110269)
When marking cards for a non-array object or a an element vt in an object, it is enough to mark a card for any address within that object/vt because they are always fully scanned. Cardtable consistency checks are not accounting for this detail and it is difficult to have it implemented. Instead, when having such debug flags enabled, we use an explicit approach where every single card is being marked. Co-authored-by: Vlad Brezae <[email protected]>
1 parent 9b2b783 commit 15de9cc

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

src/mono/mono/sgen/sgen-cardtable.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,31 @@ sgen_card_table_wbarrier_range_copy (gpointer _dest, gconstpointer _src, int siz
165165
}
166166
}
167167

168+
// Marks more cards so that it works with remset consistency debug checks
169+
static void
170+
sgen_card_table_wbarrier_range_copy_debug (gpointer _dest, gconstpointer _src, int size)
171+
{
172+
GCObject **dest = (GCObject **)_dest;
173+
GCObject **src = (GCObject **)_src;
174+
175+
size_t nursery_bits = sgen_nursery_bits;
176+
char *start = sgen_nursery_start;
177+
G_GNUC_UNUSED char *end = sgen_nursery_end;
178+
179+
while (size) {
180+
GCObject *value = *src;
181+
*dest = value;
182+
if (SGEN_PTR_IN_NURSERY (value, nursery_bits, start, end) || sgen_concurrent_collection_in_progress) {
183+
volatile guint8 *card_address = (volatile guint8 *)sgen_card_table_get_card_address ((mword)dest);
184+
*card_address = 1;
185+
sgen_dummy_use (value);
186+
}
187+
++src;
188+
++dest;
189+
size -= SIZEOF_VOID_P;
190+
}
191+
}
192+
168193
MONO_RESTORE_WARNING
169194

170195
#ifdef SGEN_HAVE_OVERLAPPING_CARDS
@@ -606,7 +631,7 @@ sgen_cardtable_scan_object (GCObject *obj, mword block_obj_size, guint8 *cards,
606631
}
607632

608633
void
609-
sgen_card_table_init (SgenRememberedSet *remset)
634+
sgen_card_table_init (SgenRememberedSet *remset, gboolean consistency_checks)
610635
{
611636
sgen_cardtable = (guint8 *)sgen_alloc_os_memory (CARD_COUNT_IN_BYTES, (SgenAllocFlags)(SGEN_ALLOC_INTERNAL | SGEN_ALLOC_ACTIVATE), "card table", MONO_MEM_ACCOUNT_SGEN_CARD_TABLE);
612637

@@ -637,7 +662,10 @@ sgen_card_table_init (SgenRememberedSet *remset)
637662

638663
remset->find_address = sgen_card_table_find_address;
639664
remset->find_address_with_cards = sgen_card_table_find_address_with_cards;
640-
remset->wbarrier_range_copy = sgen_card_table_wbarrier_range_copy;
665+
if (consistency_checks)
666+
remset->wbarrier_range_copy = sgen_card_table_wbarrier_range_copy_debug;
667+
else
668+
remset->wbarrier_range_copy = sgen_card_table_wbarrier_range_copy;
641669

642670
need_mod_union = sgen_get_major_collector ()->is_concurrent;
643671
}

src/mono/mono/sgen/sgen-cardtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void sgen_card_table_preclean_mod_union (guint8 *cards, guint8 *cards_preclean,
3030
guint8* sgen_get_card_table_configuration (int *shift_bits, gpointer *mask);
3131
guint8* sgen_get_target_card_table_configuration (int *shift_bits, target_mgreg_t *mask);
3232

33-
void sgen_card_table_init (SgenRememberedSet *remset);
33+
void sgen_card_table_init (SgenRememberedSet *remset, gboolean consistency_checks);
3434

3535
/*How many bytes a single card covers*/
3636
#define CARD_BITS 9

src/mono/mono/sgen/sgen-gc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,7 @@ sgen_gc_init (void)
38953895

38963896
memset (&remset, 0, sizeof (remset));
38973897

3898-
sgen_card_table_init (&remset);
3898+
sgen_card_table_init (&remset, remset_consistency_checks);
38993899

39003900
sgen_register_root (NULL, 0, sgen_make_user_root_descriptor (sgen_mark_normal_gc_handles), ROOT_TYPE_NORMAL, MONO_ROOT_SOURCE_GC_HANDLE, GINT_TO_POINTER (ROOT_TYPE_NORMAL), "GC Handles (SGen, Normal)");
39013901

0 commit comments

Comments
 (0)