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 /include/net/neighbour.h | |
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 'include/net/neighbour.h')
-rw-r--r-- | include/net/neighbour.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h index 7d08fd1062f0..37845dae6488 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h | |||
@@ -138,13 +138,22 @@ struct pneigh_entry { | |||
138 | * neighbour table manipulation | 138 | * neighbour table manipulation |
139 | */ | 139 | */ |
140 | 140 | ||
141 | struct neigh_hash_table { | ||
142 | struct neighbour **hash_buckets; | ||
143 | unsigned int hash_mask; | ||
144 | __u32 hash_rnd; | ||
145 | struct rcu_head rcu; | ||
146 | }; | ||
147 | |||
141 | 148 | ||
142 | struct neigh_table { | 149 | struct neigh_table { |
143 | struct neigh_table *next; | 150 | struct neigh_table *next; |
144 | int family; | 151 | int family; |
145 | int entry_size; | 152 | int entry_size; |
146 | int key_len; | 153 | int key_len; |
147 | __u32 (*hash)(const void *pkey, const struct net_device *); | 154 | __u32 (*hash)(const void *pkey, |
155 | const struct net_device *dev, | ||
156 | __u32 hash_rnd); | ||
148 | int (*constructor)(struct neighbour *); | 157 | int (*constructor)(struct neighbour *); |
149 | int (*pconstructor)(struct pneigh_entry *); | 158 | int (*pconstructor)(struct pneigh_entry *); |
150 | void (*pdestructor)(struct pneigh_entry *); | 159 | void (*pdestructor)(struct pneigh_entry *); |
@@ -165,9 +174,7 @@ struct neigh_table { | |||
165 | unsigned long last_rand; | 174 | unsigned long last_rand; |
166 | struct kmem_cache *kmem_cachep; | 175 | struct kmem_cache *kmem_cachep; |
167 | struct neigh_statistics __percpu *stats; | 176 | struct neigh_statistics __percpu *stats; |
168 | struct neighbour **hash_buckets; | 177 | struct neigh_hash_table __rcu *nht; |
169 | unsigned int hash_mask; | ||
170 | __u32 hash_rnd; | ||
171 | struct pneigh_entry **phash_buckets; | 178 | struct pneigh_entry **phash_buckets; |
172 | }; | 179 | }; |
173 | 180 | ||
@@ -237,6 +244,7 @@ extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_en | |||
237 | struct neigh_seq_state { | 244 | struct neigh_seq_state { |
238 | struct seq_net_private p; | 245 | struct seq_net_private p; |
239 | struct neigh_table *tbl; | 246 | struct neigh_table *tbl; |
247 | struct neigh_hash_table *nht; | ||
240 | void *(*neigh_sub_iter)(struct neigh_seq_state *state, | 248 | void *(*neigh_sub_iter)(struct neigh_seq_state *state, |
241 | struct neighbour *n, loff_t *pos); | 249 | struct neighbour *n, loff_t *pos); |
242 | unsigned int bucket; | 250 | unsigned int bucket; |