diff options
| -rw-r--r-- | arch/x86_64/kernel/mce.c | 3 | ||||
| -rw-r--r-- | include/linux/list.h | 2 | ||||
| -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 |
7 files changed, 12 insertions, 22 deletions
diff --git a/arch/x86_64/kernel/mce.c b/arch/x86_64/kernel/mce.c index c771dc8e3f60..5da150baf25e 100644 --- a/arch/x86_64/kernel/mce.c +++ b/arch/x86_64/kernel/mce.c @@ -361,8 +361,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, loff memset(mcelog.entry, 0, next * sizeof(struct mce)); mcelog.next = 0; - smp_wmb(); - + synchronize_kernel(); /* Collect entries that were still getting written before the synchronize. */ diff --git a/include/linux/list.h b/include/linux/list.h index 94bed0f27d33..7cad5322077c 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -568,8 +568,6 @@ static inline void hlist_del_init(struct hlist_node *n) } } -#define hlist_del_rcu_init hlist_del_init - static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) { struct hlist_node *first = h->first; 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 |
