From mboxrd@z Thu Jan 1 00:00:00 1970 From: paulmck@linux.vnet.ibm.com (Paul E. McKenney) Date: Thu, 29 Sep 2011 10:33:48 -0700 Subject: [ltt-dev] [PATCH 7/7] urcu, call_rcu: Array initialized before pointer is planted In-Reply-To: <78bc30a7c083ea5fb41ac3b53d305490d9361752.1317198301.git.laijs@cn.fujitsu.com> References: <78bc30a7c083ea5fb41ac3b53d305490d9361752.1317198301.git.laijs@cn.fujitsu.com> Message-ID: <20110929173348.GC2362@linux.vnet.ibm.com> On Wed, Sep 28, 2011 at 04:34:33PM +0800, Lai Jiangshan wrote: > Signed-off-by: Lai Jiangshan This one I don't understand. It looks to me that all dereferences of the per_cpu_call_rcu_data pointer are done while holding the call_rcu_mutex, so there should be no need for the memory barrier. Yes, there is an access to the pointer without lock protection in create_all_cpu_call_rcu_data(), but that access does not do a dereference, so still no need for the memory barrier. So, what am I missing? Thanx, Paul > --- > urcu-call-rcu-impl.h | 4 ++++ > 1 files changed, 4 insertions(+), 0 deletions(-) > > diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h > index 3c68ae7..462139a 100644 > --- a/urcu-call-rcu-impl.h > +++ b/urcu-call-rcu-impl.h > @@ -104,6 +104,10 @@ static void alloc_cpu_call_rcu_data(void) > p = malloc(maxcpus * sizeof(*per_cpu_call_rcu_data)); > if (p != NULL) { > memset(p, '\0', maxcpus * sizeof(*per_cpu_call_rcu_data)); > + > + /* Array initialized before pointer is planted. */ > + cmm_smp_mb(); > + > per_cpu_call_rcu_data = p; > } else { > if (!warned) { > -- > 1.7.4.4 >