aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/neighbour.h
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-10-04 02:15:44 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-05 17:54:36 -0400
commitd6bf781712a1d25cc8987036b3a48535b331eb91 (patch)
treecf83ab68ef2519576578d8336a43cc13cd375cde /include/net/neighbour.h
parent110b2499370c401cdcc7c63e481084467291d556 (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.h16
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
141struct 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
142struct neigh_table { 149struct 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
237struct neigh_seq_state { 244struct 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;