From 1f3c3895935d012c6f13d6745adb0bb8ce4731f1 Mon Sep 17 00:00:00 2001 From: Julian P Samaroo Date: Sat, 18 Dec 2021 15:07:36 -0600 Subject: [PATCH] Add USDTs for multiq insert/deletemin --- contrib/bpftrace/rt_all.bt | 32 ++++++++++++++++++++++++++++++++ src/julia_internal.h | 12 ++++++++++++ src/partr.c | 12 ++++++++++-- src/uprobes.d | 6 ++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/contrib/bpftrace/rt_all.bt b/contrib/bpftrace/rt_all.bt index 4979780489d152..27689d5dc60e98 100755 --- a/contrib/bpftrace/rt_all.bt +++ b/contrib/bpftrace/rt_all.bt @@ -7,11 +7,13 @@ BEGIN usdt:usr/lib/libjulia-internal.so:julia:rt__run__task { + @resume[ustack] = count(); printf("Task running: %x (with PTLS %x)\n", arg0, arg1); } usdt:usr/lib/libjulia-internal.so:julia:rt__pause__task { + @pause[ustack] = count(); printf("Task pausing: %x (with PTLS %x)\n", arg0, arg1); } @@ -29,3 +31,33 @@ usdt:usr/lib/libjulia-internal.so:julia:rt__finish__process__events { printf("Task processed libuv events: %x\n", arg0); } + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__insert__success +{ + printf("Multiq insert success: PTLS %x\n", arg0); +} + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__insert__full +{ + printf("Multiq insert failed (full): PTLS %x\n", arg0); +} + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__deletemin__trylock_success +{ + printf("Multiq deletemin lock acquired: PTLS %x, heap %d\n", arg0, arg1); +} + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__deletemin__trylock_failed +{ + printf("Multiq deletemin lock busy: PTLS %x\n", arg0); +} + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__deletemin__success +{ + printf("Multiq deletemin success: PTLS %x got task %x\n", arg0, arg1); +} + +usdt:usr/lib/libjulia-internal.so:julia:rt__multiq__deletemin__emptyish +{ + printf("Multiq deletemin failed (empty): PTLS %x\n", arg0); +} diff --git a/src/julia_internal.h b/src/julia_internal.h index 0996fda9a0bc48..62a5a03ae35bc3 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -1537,6 +1537,12 @@ uint16_t __gnu_f2h_ieee(float param) JL_NOTSAFEPOINT; #define JL_PROBE_RT_NEW_TASK(parent, child, ptls) do ; while (0) #define JL_PROBE_RT_START_PROCESS_EVENTS(task) do ; while (0) #define JL_PROBE_RT_FINISH_PROCESS_EVENTS(task) do ; while (0) +#define JL_PROBE_RT_MULTIQ_INSERT_SUCCESS(jl_ptls_t ptls) do ; while (0) +#define JL_PROBE_RT_MULTIQ_INSERT_FULL(jl_ptls_t ptls) do ; while (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_SUCCESS(jl_ptls_t ptls, int32_t heap) do ; while (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_FAILED(jl_ptls_t ptls) do ; while (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_SUCCESS(jl_ptls_t ptls, jl_task_t task) do ; while (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_EMPTYISH(jl_ptls_t ptls) do ; while (0) #define JL_PROBE_GC_BEGIN_ENABLED() (0) #define JL_PROBE_GC_STOP_THE_WORLD_ENABLED() (0) @@ -1551,6 +1557,12 @@ uint16_t __gnu_f2h_ieee(float param) JL_NOTSAFEPOINT; #define JL_PROBE_RT_NEW_TASK_ENABLED() (0) #define JL_PROBE_RT_START_PROCESS_EVENTS_ENABLED() (0) #define JL_PROBE_RT_FINISH_PROCESS_EVENTS_ENABLED() (0) +#define JL_PROBE_RT_MULTIQ_INSERT_SUCCESS_ENABLED(jl_ptls_t ptls) (0) +#define JL_PROBE_RT_MULTIQ_INSERT_FULL_ENABLED(jl_ptls_t ptls) (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_SUCCESS_ENABLED(jl_ptls_t ptls, int32_t heap) (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_FAILED_ENABLED(jl_ptls_t ptls) (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_SUCCESS_ENABLED(jl_ptls_t ptls, jl_task_t task) (0) +#define JL_PROBE_RT_MULTIQ_DELETEMIN_EMPTYISH_ENABLED(jl_ptls_t ptls) (0) #endif #endif diff --git a/src/partr.c b/src/partr.c index 048a8411581530..0ba4f08627d44e 100644 --- a/src/partr.c +++ b/src/partr.c @@ -142,6 +142,7 @@ static inline int multiq_insert(jl_task_t *task, int16_t priority) if (jl_atomic_load_relaxed(&heaps[rn].ntasks) >= tasks_per_heap) { uv_mutex_unlock(&heaps[rn].lock); // multiq insertion failed, increase #tasks per heap + JL_PROBE_RT_MULTIQ_INSERT_FULL(ptls); return -1; } @@ -154,6 +155,7 @@ static inline int multiq_insert(jl_task_t *task, int16_t priority) jl_atomic_store_relaxed(&heaps[rn].prio, task->prio); uv_mutex_unlock(&heaps[rn].lock); + JL_PROBE_RT_MULTIQ_INSERT_SUCCESS(ptls); return 0; } @@ -179,17 +181,22 @@ static inline jl_task_t *multiq_deletemin(void) else if (prio1 == prio2 && prio1 == INT16_MAX) continue; if (uv_mutex_trylock(&heaps[rn1].lock) == 0) { - if (prio1 == jl_atomic_load_relaxed(&heaps[rn1].prio)) + if (prio1 == jl_atomic_load_relaxed(&heaps[rn1].prio)) { + JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_SUCCESS(ptls, i); break; + } uv_mutex_unlock(&heaps[rn1].lock); } } - if (i == heap_p) + if (i == heap_p) { + JL_PROBE_RT_MULTIQ_DELETEMIN_EMPTYISH(ptls); return NULL; + } task = heaps[rn1].tasks[0]; if (!jl_set_task_tid(task, ptls->tid)) { uv_mutex_unlock(&heaps[rn1].lock); + JL_PROBE_RT_MULTIQ_DELETEMIN_TRYLOCK_FAILED(ptls); goto retry; } int32_t ntasks = jl_atomic_load_relaxed(&heaps[rn1].ntasks) - 1; @@ -204,6 +211,7 @@ static inline jl_task_t *multiq_deletemin(void) jl_atomic_store_relaxed(&heaps[rn1].prio, prio1); uv_mutex_unlock(&heaps[rn1].lock); + JL_PROBE_RT_MULTIQ_DELETEMIN_SUCCESS(ptls, task); return task; } diff --git a/src/uprobes.d b/src/uprobes.d index 493092cb80cd46..4800486ec6009f 100644 --- a/src/uprobes.d +++ b/src/uprobes.d @@ -15,6 +15,12 @@ provider julia { probe rt__new__task(jl_task_t *parent, jl_task_t *child, jl_ptls_t ptls); probe rt__start__process__events(jl_task_t *task); probe rt__finish__process__events(jl_task_t *task); + probe rt__multiq__insert__success(jl_ptls_t ptls); + probe rt__multiq__insert__full(jl_ptls_t ptls); + probe rt__multiq__deletemin__trylock_success(jl_ptls_t ptls, int32_t heap); + probe rt__multiq__deletemin__trylock_failed(jl_ptls_t ptls); + probe rt__multiq__deletemin__success(jl_ptls_t ptls, jl_task_t task); + probe rt__multiq__deletemin__emptyish(jl_ptls_t ptls); }; #pragma D attributes Evolving/Evolving/Common provider julia provider