diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-02-22 20:04:49 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-02-25 03:41:03 -0500 |
commit | a898def29e4119bc01ebe7ca97423181f4c0ea2d (patch) | |
tree | e6f89d4f4a91fd24507ad600ebb9ad620ec9d9a8 /net/decnet | |
parent | 3120438ad68601f341e61e7cb1323b0e1a6ca367 (diff) |
net: Add checking to rcu_dereference() primitives
Update rcu_dereference() primitives to use new lockdep-based
checking. The rcu_dereference() in __in6_dev_get() may be
protected either by rcu_read_lock() or RTNL, per Eric Dumazet.
The rcu_dereference() in __sk_free() is protected by the fact
that it is never reached if an update could change it. Check
for this by using rcu_dereference_check() to verify that the
struct sock's ->sk_wmem_alloc counter is zero.
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <1266887105-1528-5-git-send-email-paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'net/decnet')
-rw-r--r-- | net/decnet/dn_route.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index a03284061a31..a7bf03ca0a36 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c | |||
@@ -1155,8 +1155,8 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl | |||
1155 | 1155 | ||
1156 | if (!(flags & MSG_TRYHARD)) { | 1156 | if (!(flags & MSG_TRYHARD)) { |
1157 | rcu_read_lock_bh(); | 1157 | rcu_read_lock_bh(); |
1158 | for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt; | 1158 | for (rt = rcu_dereference_bh(dn_rt_hash_table[hash].chain); rt; |
1159 | rt = rcu_dereference(rt->u.dst.dn_next)) { | 1159 | rt = rcu_dereference_bh(rt->u.dst.dn_next)) { |
1160 | if ((flp->fld_dst == rt->fl.fld_dst) && | 1160 | if ((flp->fld_dst == rt->fl.fld_dst) && |
1161 | (flp->fld_src == rt->fl.fld_src) && | 1161 | (flp->fld_src == rt->fl.fld_src) && |
1162 | (flp->mark == rt->fl.mark) && | 1162 | (flp->mark == rt->fl.mark) && |
@@ -1618,9 +1618,9 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
1618 | if (h > s_h) | 1618 | if (h > s_h) |
1619 | s_idx = 0; | 1619 | s_idx = 0; |
1620 | rcu_read_lock_bh(); | 1620 | rcu_read_lock_bh(); |
1621 | for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0; | 1621 | for(rt = rcu_dereference_bh(dn_rt_hash_table[h].chain), idx = 0; |
1622 | rt; | 1622 | rt; |
1623 | rt = rcu_dereference(rt->u.dst.dn_next), idx++) { | 1623 | rt = rcu_dereference_bh(rt->u.dst.dn_next), idx++) { |
1624 | if (idx < s_idx) | 1624 | if (idx < s_idx) |
1625 | continue; | 1625 | continue; |
1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); | 1626 | skb_dst_set(skb, dst_clone(&rt->u.dst)); |
@@ -1654,12 +1654,12 @@ static struct dn_route *dn_rt_cache_get_first(struct seq_file *seq) | |||
1654 | 1654 | ||
1655 | for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) { | 1655 | for(s->bucket = dn_rt_hash_mask; s->bucket >= 0; --s->bucket) { |
1656 | rcu_read_lock_bh(); | 1656 | rcu_read_lock_bh(); |
1657 | rt = dn_rt_hash_table[s->bucket].chain; | 1657 | rt = rcu_dereference_bh(dn_rt_hash_table[s->bucket].chain); |
1658 | if (rt) | 1658 | if (rt) |
1659 | break; | 1659 | break; |
1660 | rcu_read_unlock_bh(); | 1660 | rcu_read_unlock_bh(); |
1661 | } | 1661 | } |
1662 | return rcu_dereference(rt); | 1662 | return rt; |
1663 | } | 1663 | } |
1664 | 1664 | ||
1665 | static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) | 1665 | static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_route *rt) |
@@ -1674,7 +1674,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou | |||
1674 | rcu_read_lock_bh(); | 1674 | rcu_read_lock_bh(); |
1675 | rt = dn_rt_hash_table[s->bucket].chain; | 1675 | rt = dn_rt_hash_table[s->bucket].chain; |
1676 | } | 1676 | } |
1677 | return rcu_dereference(rt); | 1677 | return rcu_dereference_bh(rt); |
1678 | } | 1678 | } |
1679 | 1679 | ||
1680 | static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 1680 | static void *dn_rt_cache_seq_start(struct seq_file *seq, loff_t *pos) |