diff options
| author | Paul E. McKenney <paulmck@us.ibm.com> | 2004-10-27 18:28:24 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-10-27 18:28:24 -0700 |
| commit | fa56b76fabdfdff9f8bcb8831ea9e7b4f76eddaf (patch) | |
| tree | 346688ebceddfc2f2c015367d065f12206aaa48d /net | |
| parent | 85a8f4f2956d63628482c685b812432421629fa2 (diff) | |
[PATCH] RCU: use rcu_assign_pointer()
This patch uses the rcu_assign_pointer() API to eliminate a number of explicit
memory barriers from code using RCU. This has been tested successfully on
i386 and ppc64.
Signed-off-by: <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'net')
| -rw-r--r-- | net/core/netfilter.c | 3 | ||||
| -rw-r--r-- | net/decnet/dn_route.c | 13 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 3 | ||||
| -rw-r--r-- | net/ipv4/route.c | 7 | ||||
| -rw-r--r-- | net/sched/sch_api.c | 3 |
5 files changed, 11 insertions, 18 deletions
diff --git a/net/core/netfilter.c b/net/core/netfilter.c index 91b3bb238edc..9db8b4467f9d 100644 --- a/net/core/netfilter.c +++ b/net/core/netfilter.c @@ -751,10 +751,9 @@ int nf_log_register(int pf, nf_logfn *logfn) /* Any setup of logging members must be done before * substituting pointer. */ - smp_wmb(); spin_lock(&nf_log_lock); if (!nf_logging[pf]) { - nf_logging[pf] = logfn; + rcu_assign_pointer(nf_logging[pf], logfn); ret = 0; } spin_unlock(&nf_log_lock); diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 34f0b81e1784..32e3cd4bc3b9 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c @@ -287,10 +287,9 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * if (compare_keys(&rth->fl, &rt->fl)) { /* Put it first */ *rthp = rth->u.rt_next; - smp_wmb(); - rth->u.rt_next = dn_rt_hash_table[hash].chain; - smp_wmb(); - dn_rt_hash_table[hash].chain = rth; + rcu_assign_pointer(rth->u.rt_next, + dn_rt_hash_table[hash].chain); + rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth); rth->u.dst.__use++; dst_hold(&rth->u.dst); @@ -304,10 +303,8 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route * rthp = &rth->u.rt_next; } - smp_wmb(); - rt->u.rt_next = dn_rt_hash_table[hash].chain; - smp_wmb(); - dn_rt_hash_table[hash].chain = rt; + rcu_assign_pointer(rt->u.rt_next, dn_rt_hash_table[hash].chain); + rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt); dst_hold(&rt->u.dst); rt->u.dst.__use++; diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index bda63766b6ab..cb697aba93a2 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -158,8 +158,7 @@ struct in_device *inetdev_init(struct net_device *dev) /* Account for reference dev->ip_ptr */ in_dev_hold(in_dev); - smp_wmb(); - dev->ip_ptr = in_dev; + rcu_assign_pointer(dev->ip_ptr, in_dev); #ifdef CONFIG_SYSCTL devinet_sysctl_register(in_dev, &in_dev->cnf); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 27ce169f63b9..2d8003194fdd 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -801,14 +801,13 @@ restart: * must be visible to another weakly ordered CPU before * the insertion at the start of the hash chain. */ - smp_wmb(); - rth->u.rt_next = rt_hash_table[hash].chain; + rcu_assign_pointer(rth->u.rt_next, + rt_hash_table[hash].chain); /* * Since lookup is lockfree, the update writes * must be ordered for consistency on SMP. */ - smp_wmb(); - rt_hash_table[hash].chain = rth; + rcu_assign_pointer(rt_hash_table[hash].chain, rth); rth->u.dst.__use++; dst_hold(&rth->u.dst); diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 127fb296bf92..fee8da1a1c77 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -453,10 +453,9 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp) /* enqueue is accessed locklessly - make sure it's visible * before we set a netdevice's qdisc pointer to sch */ - smp_wmb(); if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS-1])) == 0) { qdisc_lock_tree(dev); - list_add_tail(&sch->list, &dev->qdisc_list); + list_add_tail_rcu(&sch->list, &dev->qdisc_list); qdisc_unlock_tree(dev); #ifdef CONFIG_NET_ESTIMATOR |
