diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-10-04 02:15:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-05 17:54:36 -0400 |
commit | d6bf781712a1d25cc8987036b3a48535b331eb91 (patch) | |
tree | cf83ab68ef2519576578d8336a43cc13cd375cde /net/ipv4 | |
parent | 110b2499370c401cdcc7c63e481084467291d556 (diff) |
net neigh: RCU conversion of neigh hash table
David
This is the first step for RCU conversion of neigh code.
Next patches will convert hash_buckets[] and "struct neighbour" to RCU
protected objects.
Thanks
[PATCH net-next] net neigh: RCU conversion of neigh hash table
Instead of storing hash_buckets, hash_mask and hash_rnd in "struct
neigh_table", a new structure is defined :
struct neigh_hash_table {
struct neighbour **hash_buckets;
unsigned int hash_mask;
__u32 hash_rnd;
struct rcu_head rcu;
};
And "struct neigh_table" has an RCU protected pointer to such a
neigh_hash_table.
This means the signature of (*hash)() function changed: We need to add a
third parameter with the actual hash_rnd value, since this is not
anymore a neigh_table field.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/arp.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index d9031ad67826..f35309578170 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -127,7 +127,7 @@ EXPORT_SYMBOL(clip_tbl_hook); | |||
127 | /* | 127 | /* |
128 | * Interface to generic neighbour cache. | 128 | * Interface to generic neighbour cache. |
129 | */ | 129 | */ |
130 | static u32 arp_hash(const void *pkey, const struct net_device *dev); | 130 | static u32 arp_hash(const void *pkey, const struct net_device *dev, __u32 rnd); |
131 | static int arp_constructor(struct neighbour *neigh); | 131 | static int arp_constructor(struct neighbour *neigh); |
132 | static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb); | 132 | static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb); |
133 | static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb); | 133 | static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb); |
@@ -225,9 +225,11 @@ int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir) | |||
225 | } | 225 | } |
226 | 226 | ||
227 | 227 | ||
228 | static u32 arp_hash(const void *pkey, const struct net_device *dev) | 228 | static u32 arp_hash(const void *pkey, |
229 | const struct net_device *dev, | ||
230 | __u32 hash_rnd) | ||
229 | { | 231 | { |
230 | return jhash_2words(*(u32 *)pkey, dev->ifindex, arp_tbl.hash_rnd); | 232 | return jhash_2words(*(u32 *)pkey, dev->ifindex, hash_rnd); |
231 | } | 233 | } |
232 | 234 | ||
233 | static int arp_constructor(struct neighbour *neigh) | 235 | static int arp_constructor(struct neighbour *neigh) |