summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@us.ibm.com>2004-10-27 18:28:24 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-10-27 18:28:24 -0700
commitfa56b76fabdfdff9f8bcb8831ea9e7b4f76eddaf (patch)
tree346688ebceddfc2f2c015367d065f12206aaa48d /net
parent85a8f4f2956d63628482c685b812432421629fa2 (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.c3
-rw-r--r--net/decnet/dn_route.c13
-rw-r--r--net/ipv4/devinet.c3
-rw-r--r--net/ipv4/route.c7
-rw-r--r--net/sched/sch_api.c3
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