Move nr_callbacks to event state
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 24 Nov 2023 20:56:47 +0000 (15:56 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 24 Nov 2023 20:56:47 +0000 (15:56 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/abi/event-description.h
include/side/instrumentation-c-api.h
include/side/trace.h
src/side.c

index a978436f95ae6ecc6e99b1a4397bb24a1dfada6f..1c72d4d77d076dfd3baf2d588e25fce23122ace7 100644 (file)
@@ -57,8 +57,7 @@ struct side_event_description {
        side_enum_t(enum side_loglevel, uint32_t) loglevel;
        uint32_t nr_fields;
        uint32_t nr_attr;
-       uint32_t nr_callbacks;
-#define side_event_description_orig_abi_last nr_callbacks
+#define side_event_description_orig_abi_last nr_attr
        /* End of fields supported in the original ABI. */
 
        char end[];     /* End with a flexible array to account for extensibility. */
index 5b5e1a3b614f763a168c8770d709ae184070d88a..5b7b40c9d484d2c8d719d36936cc4e072eba06fe 100644 (file)
                .p = { \
                        .version = SIDE_EVENT_STATE_ABI_VERSION, \
                }, \
+               .nr_callbacks = 0, \
                .enabled = 0, \
                .callbacks = &side_empty_callback, \
                .desc = &(_identifier), \
                .loglevel = SIDE_ENUM_INIT(_loglevel), \
                .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \
                .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM_SELECT_ARG1(_, ##_attr, side_attr_list())), \
-               .nr_callbacks = 0, \
        }; \
        static const struct side_event_description *side_event_ptr__##_identifier \
                __attribute__((section("side_event_description_ptr"), used)) = &(_identifier);
index 005d499763b5aba12dd646616a133a706cb94ace..d13432b79350149caaf05026cc43c4d3d01262b0 100644 (file)
@@ -62,6 +62,7 @@ struct side_event_state {
 
 struct side_event_state_0 {
        struct side_event_state p;      /* Required first field. */
+       uint32_t nr_callbacks;
        uintptr_t enabled;
        const struct side_callback *callbacks;
        struct side_event_description *desc;
index 643b273d1b8170d44ce97170db64c6cda187d163..e33800680550b1fa27b27a21e41237cf80cbab10 100644 (file)
@@ -155,7 +155,7 @@ int _side_tracer_callback_register(struct side_event_description *desc,
        if (side_unlikely(event_state->version != 0))
                abort();
        es0 = side_container_of(event_state, struct side_event_state_0, p);
-       old_nr_cb = desc->nr_callbacks;
+       old_nr_cb = es0->nr_callbacks;
        if (old_nr_cb == UINT32_MAX) {
                ret = SIDE_ERROR_INVAL;
                goto unlock;
@@ -185,7 +185,7 @@ int _side_tracer_callback_register(struct side_event_description *desc,
        side_rcu_wait_grace_period(&rcu_gp);
        if (old_nr_cb)
                free(old_cb);
-       desc->nr_callbacks++;
+       es0->nr_callbacks++;
        /* Increment concurrently with kernel setting the top bits. */
        if (!old_nr_cb)
                (void) __atomic_add_fetch(&es0->enabled, 1, __ATOMIC_RELAXED);
@@ -239,7 +239,7 @@ static int _side_tracer_callback_unregister(struct side_event_description *desc,
                ret = SIDE_ERROR_NOENT;
                goto unlock;
        }
-       old_nr_cb = desc->nr_callbacks;
+       old_nr_cb = es0->nr_callbacks;
        old_cb = (struct side_callback *) es0->callbacks;
        if (old_nr_cb == 1) {
                new_cb = (struct side_callback *) &side_empty_callback;
@@ -259,7 +259,7 @@ static int _side_tracer_callback_unregister(struct side_event_description *desc,
        side_rcu_assign_pointer(es0->callbacks, new_cb);
        side_rcu_wait_grace_period(&rcu_gp);
        free(old_cb);
-       desc->nr_callbacks--;
+       es0->nr_callbacks--;
        /* Decrement concurrently with kernel setting the top bits. */
        if (old_nr_cb == 1)
                (void) __atomic_add_fetch(&es0->enabled, -1, __ATOMIC_RELAXED);
@@ -317,15 +317,16 @@ static
 void side_event_remove_callbacks(struct side_event_description *desc)
 {
        struct side_event_state *event_state = side_ptr_get(desc->state);
-       uint32_t nr_cb = desc->nr_callbacks;
        struct side_event_state_0 *es0;
        struct side_callback *old_cb;
+       uint32_t nr_cb;
 
-       if (!nr_cb)
-               return;
        if (side_unlikely(event_state->version != 0))
                abort();
        es0 = side_container_of(event_state, struct side_event_state_0, p);
+       nr_cb = es0->nr_callbacks;
+       if (!nr_cb)
+               return;
        old_cb = (struct side_callback *) es0->callbacks;
        (void) __atomic_add_fetch(&es0->enabled, -1, __ATOMIC_RELAXED);
        /*
@@ -333,7 +334,7 @@ void side_event_remove_callbacks(struct side_event_description *desc)
         * caution. This should not matter because instrumentation is
         * unreachable.
         */
-       desc->nr_callbacks = 0;
+       es0->nr_callbacks = 0;
        side_rcu_assign_pointer(es0->callbacks, &side_empty_callback);
        /*
         * No need to wait for grace period because instrumentation is
This page took 0.0434330000000001 seconds and 4 git commands to generate.