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/decnet/dn_neigh.c | |
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/decnet/dn_neigh.c')
-rw-r--r-- | net/decnet/dn_neigh.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c index 0363bb95cc7d..a085dbcf5c7f 100644 --- a/net/decnet/dn_neigh.c +++ b/net/decnet/dn_neigh.c | |||
@@ -48,7 +48,6 @@ | |||
48 | #include <net/dn_neigh.h> | 48 | #include <net/dn_neigh.h> |
49 | #include <net/dn_route.h> | 49 | #include <net/dn_route.h> |
50 | 50 | ||
51 | static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev); | ||
52 | static int dn_neigh_construct(struct neighbour *); | 51 | static int dn_neigh_construct(struct neighbour *); |
53 | static void dn_long_error_report(struct neighbour *, struct sk_buff *); | 52 | static void dn_long_error_report(struct neighbour *, struct sk_buff *); |
54 | static void dn_short_error_report(struct neighbour *, struct sk_buff *); | 53 | static void dn_short_error_report(struct neighbour *, struct sk_buff *); |
@@ -93,6 +92,13 @@ static const struct neigh_ops dn_phase3_ops = { | |||
93 | .queue_xmit = dev_queue_xmit | 92 | .queue_xmit = dev_queue_xmit |
94 | }; | 93 | }; |
95 | 94 | ||
95 | static u32 dn_neigh_hash(const void *pkey, | ||
96 | const struct net_device *dev, | ||
97 | __u32 hash_rnd) | ||
98 | { | ||
99 | return jhash_2words(*(__u16 *)pkey, 0, hash_rnd); | ||
100 | } | ||
101 | |||
96 | struct neigh_table dn_neigh_table = { | 102 | struct neigh_table dn_neigh_table = { |
97 | .family = PF_DECnet, | 103 | .family = PF_DECnet, |
98 | .entry_size = sizeof(struct dn_neigh), | 104 | .entry_size = sizeof(struct dn_neigh), |
@@ -122,11 +128,6 @@ struct neigh_table dn_neigh_table = { | |||
122 | .gc_thresh3 = 1024, | 128 | .gc_thresh3 = 1024, |
123 | }; | 129 | }; |
124 | 130 | ||
125 | static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev) | ||
126 | { | ||
127 | return jhash_2words(*(__u16 *)pkey, 0, dn_neigh_table.hash_rnd); | ||
128 | } | ||
129 | |||
130 | static int dn_neigh_construct(struct neighbour *neigh) | 131 | static int dn_neigh_construct(struct neighbour *neigh) |
131 | { | 132 | { |
132 | struct net_device *dev = neigh->dev; | 133 | struct net_device *dev = neigh->dev; |