Fallback mechanism not working on platform where TLS is unsupported
[urcu.git] / urcu-call-rcu-impl.h
index cf65992f4e57a8bc86187744271c5ee4c58b6d26..5dfdb9277b5a351f62d09ee7b534f94c0a4ca3b5 100644 (file)
 
 struct call_rcu_data {
        /*
-        * Align the tail on cache line size to eliminate false-sharing
-        * with head.
+        * We do not align head on a different cache-line than tail
+        * mainly because call_rcu callback-invocation threads use
+        * batching ("splice") to get an entire list of callbacks, which
+        * effectively empties the queue, and requires to touch the tail
+        * anyway.
         */
-       struct cds_wfcq_tail __attribute__((aligned(CAA_CACHE_LINE_SIZE))) cbs_tail;
-       /* Alignment on cache line size will add padding here */
-
+       struct cds_wfcq_tail cbs_tail;
        struct cds_wfcq_head cbs_head;
        unsigned long flags;
        int32_t futex;
@@ -68,7 +69,7 @@ struct call_rcu_data {
  * Protected by call_rcu_mutex.
  */
 
-CDS_LIST_HEAD(call_rcu_data_list);
+static CDS_LIST_HEAD(call_rcu_data_list);
 
 /* Link a thread using call_rcu() to its call_rcu thread. */
 
@@ -625,6 +626,10 @@ void call_rcu(struct rcu_head *head,
  * The caller must wait for a grace-period to pass between return from
  * set_cpu_call_rcu_data() and call to call_rcu_data_free() passing the
  * previous call rcu data as argument.
+ *
+ * Note: introducing __cds_wfcq_splice_blocking() in this function fixed
+ * a list corruption bug in the 0.7.x series. The equivalent fix
+ * appeared in 0.6.8 for the stable-0.6 branch.
  */
 void call_rcu_data_free(struct call_rcu_data *crdp)
 {
This page took 0.023325 seconds and 4 git commands to generate.