From 5e523511334fce944aeedcd5c5c8d4d1a291f631 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 23 Apr 2024 15:36:03 -0400 Subject: [PATCH] side: Introduce caller address Signed-off-by: Mathieu Desnoyers --- include/side/trace.h | 4 ++-- src/side.c | 24 ++++++++++++++---------- src/tracer.c | 16 ++++++++++------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/side/trace.h b/include/side/trace.h index 662c7c7..4b6ab3f 100644 --- a/include/side/trace.h +++ b/include/side/trace.h @@ -101,11 +101,11 @@ void side_events_unregister(struct side_events_register_handle *handle); */ typedef void (*side_tracer_callback_func)(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, - void *priv); + void *priv, void *caller_addr); typedef void (*side_tracer_callback_variadic_func)(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, const struct side_arg_dynamic_struct *var_struct, - void *priv); + void *priv, void *caller_addr); int side_tracer_request_key(uint64_t *key); diff --git a/src/side.c b/src/side.c index f758102..1ed91f8 100644 --- a/src/side.c +++ b/src/side.c @@ -74,11 +74,11 @@ struct side_callback { union { void (*call)(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, - void *priv); + void *priv, void *caller_addr); void (*call_variadic)(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, const struct side_arg_dynamic_struct *var_struct, - void *priv); + void *priv, void *caller_addr); } u; void *priv; uint64_t key; @@ -157,17 +157,20 @@ side_static_event(side_statedump_end, "side", "statedump_end", */ void side_ptrace_hook(const struct side_event_state *event_state __attribute__((unused)), const struct side_arg_vec *side_arg_vec __attribute__((unused)), - const struct side_arg_dynamic_struct *var_struct __attribute__((unused))) + const struct side_arg_dynamic_struct *var_struct __attribute__((unused)), + void *caller_addr __attribute__((unused))) __attribute__((noinline)); void side_ptrace_hook(const struct side_event_state *event_state __attribute__((unused)), const struct side_arg_vec *side_arg_vec __attribute__((unused)), - const struct side_arg_dynamic_struct *var_struct __attribute__((unused))) + const struct side_arg_dynamic_struct *var_struct __attribute__((unused)), + void *caller_addr __attribute__((unused))) { } -static +static inline __attribute__((always_inline)) void _side_call(const struct side_event_state *event_state, const struct side_arg_vec *side_arg_vec, uint64_t key) { + void *caller_addr = __builtin_return_address(0); struct side_rcu_read_state rcu_read_state; const struct side_event_state_0 *es0; const struct side_callback *side_cb; @@ -189,13 +192,13 @@ void _side_call(const struct side_event_state *event_state, const struct side_ar } if ((enabled & SIDE_EVENT_ENABLED_SHARED_PTRACE_MASK) && (key == SIDE_KEY_MATCH_ALL || key == SIDE_KEY_PTRACE)) - side_ptrace_hook(event_state, side_arg_vec, NULL); + side_ptrace_hook(event_state, side_arg_vec, NULL, caller_addr); } side_rcu_read_begin(&event_rcu_gp, &rcu_read_state); for (side_cb = side_rcu_dereference(es0->callbacks); side_cb->u.call != NULL; side_cb++) { if (key != SIDE_KEY_MATCH_ALL && side_cb->key != SIDE_KEY_MATCH_ALL && side_cb->key != key) continue; - side_cb->u.call(es0->desc, side_arg_vec, side_cb->priv); + side_cb->u.call(es0->desc, side_arg_vec, side_cb->priv, caller_addr); } side_rcu_read_end(&event_rcu_gp, &rcu_read_state); } @@ -212,12 +215,13 @@ void side_statedump_call(const struct side_event_state *event_state, _side_call(event_state, side_arg_vec, *(const uint64_t *) statedump_request_key); } -static +static inline __attribute__((always_inline)) void _side_call_variadic(const struct side_event_state *event_state, const struct side_arg_vec *side_arg_vec, const struct side_arg_dynamic_struct *var_struct, uint64_t key) { + void *caller_addr = __builtin_return_address(0); struct side_rcu_read_state rcu_read_state; const struct side_event_state_0 *es0; const struct side_callback *side_cb; @@ -239,13 +243,13 @@ void _side_call_variadic(const struct side_event_state *event_state, } if ((enabled & SIDE_EVENT_ENABLED_SHARED_PTRACE_MASK) && (key == SIDE_KEY_MATCH_ALL || key == SIDE_KEY_PTRACE)) - side_ptrace_hook(event_state, side_arg_vec, var_struct); + side_ptrace_hook(event_state, side_arg_vec, var_struct, caller_addr); } side_rcu_read_begin(&event_rcu_gp, &rcu_read_state); for (side_cb = side_rcu_dereference(es0->callbacks); side_cb->u.call_variadic != NULL; side_cb++) { if (key != SIDE_KEY_MATCH_ALL && side_cb->key != SIDE_KEY_MATCH_ALL && side_cb->key != key) continue; - side_cb->u.call_variadic(es0->desc, side_arg_vec, var_struct, side_cb->priv); + side_cb->u.call_variadic(es0->desc, side_arg_vec, var_struct, side_cb->priv, caller_addr); } side_rcu_read_end(&event_rcu_gp, &rcu_read_state); } diff --git a/src/tracer.c b/src/tracer.c index 1f27032..1973c4c 100644 --- a/src/tracer.c +++ b/src/tracer.c @@ -2023,12 +2023,14 @@ void tracer_print_dynamic(const struct side_arg *item) static void tracer_print_static_fields(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, - uint32_t *nr_items) + uint32_t *nr_items, void *caller_addr) { const struct side_arg *sav = side_ptr_get(side_arg_vec->sav); uint32_t i, side_sav_len = side_arg_vec->len; - printf("provider: %s, event: %s", side_ptr_get(desc->provider_name), side_ptr_get(desc->event_name)); + printf("caller: [%p], provider: %s, event: %s", caller_addr, + side_ptr_get(desc->provider_name), + side_ptr_get(desc->event_name)); if (desc->nr_fields != side_sav_len) { fprintf(stderr, "ERROR: number of fields mismatch between description and arguments\n"); abort(); @@ -2048,11 +2050,12 @@ void tracer_print_static_fields(const struct side_event_description *desc, static void tracer_call(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, - void *priv __attribute__((unused))) + void *priv __attribute__((unused)), + void *caller_addr) { uint32_t nr_fields = 0; - tracer_print_static_fields(desc, side_arg_vec, &nr_fields); + tracer_print_static_fields(desc, side_arg_vec, &nr_fields, caller_addr); printf("\n"); } @@ -2060,11 +2063,12 @@ static void tracer_call_variadic(const struct side_event_description *desc, const struct side_arg_vec *side_arg_vec, const struct side_arg_dynamic_struct *var_struct, - void *priv __attribute__((unused))) + void *priv __attribute__((unused)), + void *caller_addr) { uint32_t nr_fields = 0, i, var_struct_len = var_struct->len; - tracer_print_static_fields(desc, side_arg_vec, &nr_fields); + tracer_print_static_fields(desc, side_arg_vec, &nr_fields, caller_addr); if (side_unlikely(!(desc->flags & SIDE_EVENT_FLAG_VARIADIC))) { fprintf(stderr, "ERROR: unexpected non-variadic event description\n"); -- 2.34.1