struct call_rcu_data {
/*
- * Align the tail on cache line size to eliminate false-sharing
- * with head. Small note, however: the "qlen" field, kept for
- * debugging, will cause false-sharing between enqueue and
- * dequeue.
+ * 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 cbs_tail;
- /* Alignment on cache line size will add padding here */
-
- struct cds_wfcq_head __attribute__((aligned(CAA_CACHE_LINE_SIZE))) cbs_head;
+ struct cds_wfcq_head cbs_head;
unsigned long flags;
int32_t futex;
unsigned long qlen; /* maintained for debugging. */
* 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)
{