From: Mathieu Desnoyers Date: Mon, 8 Oct 2012 14:44:38 +0000 (-0400) Subject: Fix urcu-call-rcu-impl.h: false-sharing X-Git-Tag: v0.8.0~201 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=b9f893b69fbc31baea418794938f4eb74cc4923a Fix urcu-call-rcu-impl.h: false-sharing > > 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 Signed-off-by: Mathieu Desnoyers --- diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h index cf65992..dca98e4 100644 --- a/urcu-call-rcu-impl.h +++ b/urcu-call-rcu-impl.h @@ -49,12 +49,14 @@ 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. */