Split nr callbacks from enabled references
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 29 Oct 2022 00:25:31 +0000 (20:25 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 29 Oct 2022 00:25:31 +0000 (20:25 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/trace.h
src/side.c

index 3f5ae798b96cb242e89f0d42d3892d1a389ca421..edd7617727c13c22653dce7a3589dc6c474c0575 100644 (file)
@@ -299,7 +299,7 @@ struct side_event_description {
        uint32_t loglevel;      /* enum side_loglevel */
        uint32_t nr_fields;
        uint32_t nr_attr;
-       uint32_t _unused;
+       uint32_t nr_callbacks;
        uint64_t flags;
        const char *provider_name;
        const char *event_name;
@@ -1074,7 +1074,7 @@ struct side_tracer_dynamic_vla_visitor_ctx {
                .loglevel = _loglevel, \
                .nr_fields = SIDE_ARRAY_SIZE(SIDE_PARAM(_fields)), \
                .nr_attr = SIDE_ARRAY_SIZE(SIDE_PARAM(_attr)), \
-               ._unused = 0, \
+               .nr_callbacks = 0, \
                .flags = (_flags), \
                .provider_name = _provider, \
                .event_name = _event, \
index 7596a5537bdefb8854a6279530417e6976b97573..02cef042435616052228b5d98a7359728f77c038 100644 (file)
@@ -14,7 +14,7 @@
 #define SIDE_EVENT_ENABLED_KERNEL_MASK                 0xFF000000
 #define SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK      0x80000000
 
-/* Allow 2^24 tracer callbacks to be registered on an event. */
+/* Allow 2^24 tracer references on an event. */
 #define SIDE_EVENT_ENABLED_USER_MASK                   0x00FFFFFF
 
 struct side_events_register_handle {
@@ -140,8 +140,8 @@ int _side_tracer_callback_register(struct side_event_description *desc,
        if (!initialized)
                side_init();
        pthread_mutex_lock(&side_lock);
-       old_nr_cb = *desc->enabled & SIDE_EVENT_ENABLED_USER_MASK;
-       if (old_nr_cb == SIDE_EVENT_ENABLED_USER_MASK) {
+       old_nr_cb = desc->nr_callbacks;
+       if (old_nr_cb == UINT32_MAX) {
                ret = SIDE_ERROR_INVAL;
                goto unlock;
        }
@@ -167,8 +167,10 @@ 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++;
        /* Increment concurrently with kernel setting the top bits. */
-       (void) __atomic_add_fetch(desc->enabled, 1, __ATOMIC_RELAXED);
+       if (!old_nr_cb)
+               (void) __atomic_add_fetch(desc->enabled, 1, __ATOMIC_RELAXED);
 unlock:
        pthread_mutex_unlock(&side_lock);
        return ret;
@@ -218,7 +220,7 @@ int _side_tracer_callback_unregister(struct side_event_description *desc,
                ret = SIDE_ERROR_NOENT;
                goto unlock;
        }
-       old_nr_cb = *desc->enabled & SIDE_EVENT_ENABLED_USER_MASK;
+       old_nr_cb = desc->nr_callbacks;
        old_cb = (struct side_callback *) desc->callbacks;
        if (old_nr_cb == 1) {
                new_cb = (struct side_callback *) &side_empty_callback;
@@ -237,8 +239,10 @@ int _side_tracer_callback_unregister(struct side_event_description *desc,
        side_rcu_assign_pointer(desc->callbacks, new_cb);
        side_rcu_wait_grace_period(&rcu_gp);
        free(old_cb);
+       desc->nr_callbacks--;
        /* Decrement concurrently with kernel setting the top bits. */
-       (void) __atomic_add_fetch(desc->enabled, -1, __ATOMIC_RELAXED);
+       if (old_nr_cb == 1)
+               (void) __atomic_add_fetch(desc->enabled, -1, __ATOMIC_RELAXED);
 unlock:
        pthread_mutex_unlock(&side_lock);
        return ret;
@@ -302,12 +306,14 @@ void side_event_remove_callbacks(struct side_event_description *desc)
        if (!nr_cb)
                return;
        old_cb = (struct side_callback *) desc->callbacks;
+       if (desc->nr_callbacks)
+               (void) __atomic_add_fetch(desc->enabled, -1, __ATOMIC_RELAXED);
        /*
         * Setting the state back to 0 cb and empty callbacks out of
         * caution. This should not matter because instrumentation is
         * unreachable.
         */
-       (void) __atomic_add_fetch(desc->enabled, -nr_cb, __ATOMIC_RELAXED);
+       desc->nr_callbacks = 0;
        side_rcu_assign_pointer(desc->callbacks, &side_empty_callback);
        /*
         * No need to wait for grace period because instrumentation is
This page took 0.026511 seconds and 4 git commands to generate.