Load enabled state with relaxed atomic MO
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 28 Oct 2022 01:40:30 +0000 (21:40 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 28 Oct 2022 01:40:30 +0000 (21:40 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/side.c

index 5c2dac4f89792480addf38ad32930cac75233e86..acc8db3ec7da91c23aa372905049a45b7e623161 100644 (file)
@@ -39,6 +39,7 @@ void side_call(const struct side_event_description *desc, const struct side_arg_
 {
        const struct side_callback *side_cb;
        unsigned int rcu_period;
+       uint32_t enabled;
 
        if (side_unlikely(!initialized))
                side_init();
@@ -46,10 +47,11 @@ void side_call(const struct side_event_description *desc, const struct side_arg_
                printf("ERROR: unexpected variadic event description\n");
                abort();
        }
-       if (side_unlikely(*desc->enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
+       enabled = __atomic_load_n(desc->enabled, __ATOMIC_RELAXED);
+       if (side_unlikely(enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
                // TODO: call kernel write.
        }
-       if (side_unlikely(!(*desc->enabled & SIDE_EVENT_ENABLED_USER_MASK)))
+       if (side_unlikely(!(enabled & SIDE_EVENT_ENABLED_USER_MASK)))
                return;
 
        //TODO: replace tracer_call by rcu iteration on list of registered callbacks
@@ -67,13 +69,19 @@ void side_call_variadic(const struct side_event_description *desc,
 {
        const struct side_callback *side_cb;
        unsigned int rcu_period;
+       uint32_t enabled;
 
        if (side_unlikely(!initialized))
                side_init();
-       if (side_unlikely(*desc->enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
+       if (side_unlikely(!(desc->flags & SIDE_EVENT_FLAG_VARIADIC))) {
+               printf("ERROR: unexpected non-variadic event description\n");
+               abort();
+       }
+       enabled = __atomic_load_n(desc->enabled, __ATOMIC_RELAXED);
+       if (side_unlikely(enabled & SIDE_EVENT_ENABLED_KERNEL_USER_EVENT_MASK)) {
                // TODO: call kernel write.
        }
-       if (side_unlikely(!(*desc->enabled & SIDE_EVENT_ENABLED_USER_MASK)))
+       if (side_unlikely(!(enabled & SIDE_EVENT_ENABLED_USER_MASK)))
                return;
 
        //TODO: replace tracer_call by rcu iteration on list of registered callbacks
This page took 0.036511 seconds and 4 git commands to generate.