Fix urcu-call-rcu-impl.h: false-sharing
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Oct 2012 14:44:38 +0000 (10:44 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Oct 2012 14:44:38 +0000 (10:44 -0400)
> >  struct call_rcu_data {
> > -   struct cds_wfq_queue cbs;
> > +   /*
> > +    * Align the tail on cache line size to eliminate false-sharing
> > +    * with head.
> > +    */
> > +   struct cds_wfcq_tail __attribute__((aligned(CAA_CACHE_LINE_SIZE))) cbs_tail;
> > +   /* Alignment on cache line size will add padding here */
> > +
> > +   struct cds_wfcq_head cbs_head;
>
>
> wrong here. In this code, cbs_tail and cbs_head are in the same cache line.

Reported-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
urcu-call-rcu-impl.h

index cf65992f4e57a8bc86187744271c5ee4c58b6d26..dca98e4ae073d45f93d8665235b715661f16c0ad 100644 (file)
 struct call_rcu_data {
        /*
         * Align the tail on cache line size to eliminate false-sharing
-        * with head.
+        * with head. Small note, however: the "qlen" field, kept for
+        * debugging, will cause false-sharing between enqueue and
+        * dequeue.
         */
-       struct cds_wfcq_tail __attribute__((aligned(CAA_CACHE_LINE_SIZE))) cbs_tail;
+       struct cds_wfcq_tail cbs_tail;
        /* Alignment on cache line size will add padding here */
 
-       struct cds_wfcq_head cbs_head;
+       struct cds_wfcq_head __attribute__((aligned(CAA_CACHE_LINE_SIZE))) cbs_head;
        unsigned long flags;
        int32_t futex;
        unsigned long qlen; /* maintained for debugging. */
This page took 0.02536 seconds and 4 git commands to generate.