urcu-defer: make call_rcu() energy efficient using futex()
[urcu.git] / urcu-defer-static.h
index 4cfa837e502632cc2f66b8f6cd5fe084efba11c0..dd24c61d85d7885d685323757f83c52c2df2f15f 100644 (file)
@@ -125,6 +125,7 @@ struct defer_queue {
 extern struct defer_queue __thread defer_queue;
 
 extern void rcu_defer_barrier_thread(void);
+extern void wake_up_defer(void);
 
 /*
  * not signal-safe.
@@ -150,7 +151,6 @@ static inline void _rcu_defer_queue(void (*fct)(void *p), void *p)
                assert(head - LOAD_SHARED(defer_queue.tail) == 0);
        }
 
-       smp_wmb();      /* Publish new pointer before write q[] */
        if (unlikely(defer_queue.last_fct_in != fct)) {
                defer_queue.last_fct_in = fct;
                if (unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
@@ -181,8 +181,13 @@ static inline void _rcu_defer_queue(void (*fct)(void *p), void *p)
                }
        }
        _STORE_SHARED(defer_queue.q[head++ & DEFER_QUEUE_MASK], p);
-       smp_wmb();      /* Write q[] before head. */
+       smp_wmb();      /* Publish new pointer before head */
+                       /* Write q[] before head. */
        STORE_SHARED(defer_queue.head, head);
+       /*
+        * Wake-up any waiting defer thread.
+        */
+       wake_up_defer();
 }
 
 #endif /* _URCU_DEFER_STATIC_H */
This page took 0.022422 seconds and 4 git commands to generate.