[ltt-dev] [PATCH 7/7] urcu, call_rcu: Array initialized before pointer is planted

Paul E. McKenney paulmck at linux.vnet.ibm.com
Thu Sep 29 13:33:48 EDT 2011


On Wed, Sep 28, 2011 at 04:34:33PM +0800, Lai Jiangshan wrote:
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>

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
> 





More information about the lttng-dev mailing list