• P
    rcu: Define rcu_assign_pointer() in terms of smp_store_release() · 88c18630
    Paul E. McKenney 提交于
    The new smp_store_release() function provides better guarantees than did
    rcu_assign_pointer(), and potentially less overhead on some architectures.
    The guarantee that smp_store_release() provides that rcu_assign_pointer()
    does that is obscure, but its lack could cause considerable confusion.
    This guarantee is illustrated by the following code fragment:
    
    	struct foo {
    		int a;
    		int b;
    		int c;
    		struct foo *next;
    	};
    	struct foo foo1;
    	struct foo foo2;
    	struct foo __rcu *foop;
    
    	...
    
    	foo2.a = 1;
    	foo2.b = 2;
    	BUG_ON(foo2.c);
    	rcu_assign_pointer(foop, &foo);
    
    	...
    
    	fp = rcu_dereference(foop);
    	fp.c = 3;
    
    The current rcu_assign_pointer() semantics permit the BUG_ON() to
    trigger because rcu_assign_pointer()'s smp_wmb() is not guaranteed to
    order prior reads against later writes.  This commit therefore upgrades
    rcu_assign_pointer() from smp_wmb() to smp_store_release() to avoid this
    counter-intuitive outcome.
    Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
    Reviewed-by: NJosh Triplett <josh@joshtriplett.org>
    88c18630
rcupdate.h 37.6 KB