X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fdecnet%2Fdn_route.c;h=309a8b317a9ed285e97ae60cd3b029fcfbfdd3bc;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=64bdf10b75b7fcbb099df3242c311a65784d60f3;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c index 64bdf10b7..309a8b317 100644 --- a/net/decnet/dn_route.c +++ b/net/decnet/dn_route.c @@ -99,9 +99,9 @@ extern struct neigh_table dn_neigh_table; static unsigned char dn_hiord_addr[6] = {0xAA,0x00,0x04,0x00,0x00,0x00}; -int dn_rt_min_delay = 2 * HZ; -int dn_rt_max_delay = 10 * HZ; -int dn_rt_mtu_expires = 10 * 60 * HZ; +static const int dn_rt_min_delay = 2 * HZ; +static const int dn_rt_max_delay = 10 * HZ; +static const int dn_rt_mtu_expires = 10 * 60 * HZ; static unsigned long dn_rt_deadline; @@ -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++; @@ -339,7 +336,7 @@ nothing_to_declare: } } -static spinlock_t dn_rt_flush_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(dn_rt_flush_lock); void dn_rt_cache_flush(int delay) { @@ -683,9 +680,8 @@ out: return NET_RX_DROP; } -static int dn_output(struct sk_buff **pskb) +static int dn_output(struct sk_buff *skb) { - struct sk_buff *skb = *pskb; struct dst_entry *dst = skb->dst; struct dn_route *rt = (struct dn_route *)dst; struct net_device *dev = dst->dev; @@ -796,11 +792,6 @@ static int dn_rt_bug(struct sk_buff *skb) return NET_RX_BAD; } -static int dn_rt_bug_out(struct sk_buff **pskb) -{ - return dn_rt_bug(*pskb); -} - static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res) { struct dn_fib_info *fi = res->fi; @@ -1392,7 +1383,7 @@ make_route: rt->u.dst.neighbour = neigh; rt->u.dst.dev = out_dev; rt->u.dst.lastuse = jiffies; - rt->u.dst.output = dn_rt_bug_out; + rt->u.dst.output = dn_rt_bug; switch(res.type) { case RTN_UNICAST: rt->u.dst.input = dn_forward; @@ -1685,7 +1676,7 @@ static struct dn_route *dn_rt_cache_get_first(struct seq_file *seq) rt = dn_rt_hash_table[s->bucket].chain; if (rt) break; - rcu_read_unlock(); + rcu_read_unlock_bh(); } return rt; } @@ -1831,7 +1822,7 @@ void __init dn_route_init(void) dn_rt_hash_mask--; for(i = 0; i <= dn_rt_hash_mask; i++) { - dn_rt_hash_table[i].lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&dn_rt_hash_table[i].lock); dn_rt_hash_table[i].chain = NULL; }