side: Introduce caller address master
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 23 Apr 2024 19:36:03 +0000 (15:36 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 23 Apr 2024 19:36:03 +0000 (15:36 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/trace.h
src/side.c
src/tracer.c

index 662c7c788a33d6be12d357c5339d7d7a10677f03..4b6ab3fd19a78b684168d5dbc3d5e1f8545c80cd 100644 (file)
@@ -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);
 
index f758102ec34b5237018a208a4f17c1052a5e97c0..1ed91f8bb0cc5730d6d5705944e86ed633862cd1 100644 (file)
@@ -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);
 }
index 1f270323d474d84bdeba3c5c921a9276fe8173f3..1973c4cedeb39f0e669ed2a9de77af6c18c14e49 100644 (file)
@@ -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");
This page took 0.026547 seconds and 4 git commands to generate.