From 85b8bd1f70b647185ba979a5613efeb59980194f Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Tue, 11 Dec 2012 14:58:08 +0100 Subject: [PATCH] [sgen] More dtrace probes. --- data/mono.d | 12 ++++++++++++ mono/metadata/sgen-gc.c | 25 +++++++++++++++++++++++++ mono/utils/dtrace.h | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/data/mono.d b/data/mono.d index dcd9303f0e5..db3d56c3e4c 100644 --- a/data/mono.d +++ b/data/mono.d @@ -19,6 +19,16 @@ provider mono { probe gc__begin (int generation); probe gc__end (int generation); + probe gc__checkpoint__1 (int generation); + probe gc__checkpoint__2 (int generation); + probe gc__checkpoint__3 (int generation); + probe gc__checkpoint__4 (int generation); + probe gc__checkpoint__5 (int generation); + probe gc__checkpoint__6 (int generation); + probe gc__checkpoint__7 (int generation); + probe gc__checkpoint__8 (int generation); + probe gc__checkpoint__9 (int generation); + probe gc__concurrent__start__begin (int generation); probe gc__concurrent__start__end (int generation, long long num_major_objects_marked); probe gc__concurrent__update__finish__begin (int generation, long long num_major_objects_marked); @@ -59,6 +69,8 @@ provider mono { probe gc__finalize__invoke (uintptr_t addr, uintptr_t size, char *ns_name, char *class_name); probe gc__weak__update (uintptr_t ref_addr, uintptr_t old_addr, uintptr_t new_addr, uintptr_t size, char *ns_name, char *class_name, int track); + + probe gc__global__remset__add (uintptr_t ref_addr, uintptr_t obj_addr, uintptr_t size, char *ns_name, char *class_name); }; #pragma D attributes Evolving/Evolving/Common provider mono provider diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index c887e93cd60..1b588c65bc3 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1141,6 +1141,13 @@ void sgen_add_to_global_remset (gpointer ptr) { remset.record_pointer (ptr); + + if (G_UNLIKELY (MONO_GC_GLOBAL_REMSET_ADD_ENABLED ())) { + void *obj = *(void**)ptr; + MonoVTable *vt = (MonoVTable*)LOAD_VTABLE (obj); + MONO_GC_GLOBAL_REMSET_ADD ((mword)ptr, (mword)obj, sgen_safe_object_get_size (obj), + vt->klass->name_space, vt->klass->name); + } } /* @@ -2518,9 +2525,13 @@ collect_nursery (SgenGrayQueue *unpin_queue) if (remset.prepare_for_minor_collection) remset.prepare_for_minor_collection (); + MONO_GC_CHECKPOINT_1 (GENERATION_NURSERY); + sgen_process_fin_stage_entries (); sgen_process_dislink_stage_entries (); + MONO_GC_CHECKPOINT_2 (GENERATION_NURSERY); + /* pin from pinned handles */ sgen_init_pinning (); mono_profiler_gc_event (MONO_GC_EVENT_MARK_START, 0); @@ -2539,6 +2550,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) SGEN_LOG (2, "Finding pinned pointers: %d in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (btv, atv)); SGEN_LOG (4, "Start scan with %d pinned objects", sgen_get_pinned_count ()); + MONO_GC_CHECKPOINT_3 (GENERATION_NURSERY); + if (whole_heap_check_before_collection) { sgen_clear_nursery_fragments (); sgen_check_whole_heap (); @@ -2567,6 +2580,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) time_minor_scan_remsets += TV_ELAPSED (atv, btv); SGEN_LOG (2, "Old generation scan: %d usecs", TV_ELAPSED (atv, btv)); + MONO_GC_CHECKPOINT_4 (GENERATION_NURSERY); + if (!sgen_collection_is_parallel ()) { ctx.scan_func = current_object_ops.scan_object; ctx.copy_func = NULL; @@ -2581,6 +2596,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) TV_GETTIME (atv); time_minor_scan_pinned += TV_ELAPSED (btv, atv); + MONO_GC_CHECKPOINT_5 (GENERATION_NURSERY); + /* registered roots, this includes static fields */ scrrjd_normal = sgen_alloc_internal_dynamic (sizeof (ScanFromRegisteredRootsJobData), INTERNAL_MEM_WORKER_JOB_DATA, TRUE); scrrjd_normal->copy_or_mark_func = current_object_ops.copy_or_mark_object; @@ -2601,6 +2618,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) TV_GETTIME (btv); time_minor_scan_registered_roots += TV_ELAPSED (atv, btv); + MONO_GC_CHECKPOINT_6 (GENERATION_NURSERY); + /* thread data */ stdjd = sgen_alloc_internal_dynamic (sizeof (ScanThreadDataJobData), INTERNAL_MEM_WORKER_JOB_DATA, TRUE); stdjd->heap_start = sgen_get_nursery_start (); @@ -2611,6 +2630,8 @@ collect_nursery (SgenGrayQueue *unpin_queue) time_minor_scan_thread_data += TV_ELAPSED (btv, atv); btv = atv; + MONO_GC_CHECKPOINT_7 (GENERATION_NURSERY); + g_assert (!sgen_collection_is_parallel () && !sgen_collection_is_concurrent ()); if (sgen_collection_is_parallel () || sgen_collection_is_concurrent ()) @@ -2625,11 +2646,15 @@ collect_nursery (SgenGrayQueue *unpin_queue) sfejd_critical_fin->list = critical_fin_list; sgen_workers_enqueue_job (job_scan_finalizer_entries, sfejd_critical_fin); + MONO_GC_CHECKPOINT_8 (GENERATION_NURSERY); + finish_gray_stack (sgen_get_nursery_start (), nursery_next, GENERATION_NURSERY, &gray_queue); TV_GETTIME (atv); time_minor_finish_gray_stack += TV_ELAPSED (btv, atv); mono_profiler_gc_event (MONO_GC_EVENT_MARK_END, 0); + MONO_GC_CHECKPOINT_9 (GENERATION_NURSERY); + /* * The (single-threaded) finalization code might have done * some copying/marking so we can only reset the GC thread's diff --git a/mono/utils/dtrace.h b/mono/utils/dtrace.h index fd7eeca90ad..755203a2f6b 100644 --- a/mono/utils/dtrace.h +++ b/mono/utils/dtrace.h @@ -51,6 +51,34 @@ #define MONO_GC_END_ENABLED() (0) +#define MONO_GC_CHECKPOINT_1(generation) +#define MONO_GC_CHECKPOINT_1_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_2(generation) +#define MONO_GC_CHECKPOINT_2_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_3(generation) +#define MONO_GC_CHECKPOINT_3_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_4(generation) +#define MONO_GC_CHECKPOINT_4_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_5(generation) +#define MONO_GC_CHECKPOINT_5_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_6(generation) +#define MONO_GC_CHECKPOINT_6_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_7(generation) +#define MONO_GC_CHECKPOINT_7_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_8(generation) +#define MONO_GC_CHECKPOINT_8_ENABLED() (0) + +#define MONO_GC_CHECKPOINT_9(generation) +#define MONO_GC_CHECKPOINT_9_ENABLED() (0) + + #define MONO_GC_CONCURRENT_START_BEGIN(generation) #define MONO_GC_CONCURRENT_START_BEGIN_ENABLED() (0) @@ -146,6 +174,10 @@ #define MONO_GC_WEAK_UPDATE(ref_addr,old_addr,new_addr,size,ns_name,class_name,track) #define MONO_GC_WEAK_UPDATE_ENABLED() (0) + +#define MONO_GC_GLOBAL_REMSET_ADD(ref_addr,obj_addr,size,ns_name,class_name) +#define MONO_GC_GLOBAL_REMSET_ADD() (0) + #endif #endif -- 2.25.1