aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/neighbour.h
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2010-10-06 20:49:21 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-06 21:01:33 -0400
commit767e97e1e0db0d0f3152cd2f3bd3403596aedbad (patch)
treecda6089e75f98fc3c9812993cf790fccac98b67a /include/net/neighbour.h
parent546add79468183f266c75c632c96e4b0029e0d96 (diff)
neigh: RCU conversion of struct neighbour
This is the second step for neighbour RCU conversion. (first was commit d6bf7817 : RCU conversion of neigh hash table) neigh_lookup() becomes lockless, but still take a reference on found neighbour. (no more read_lock()/read_unlock() on tbl->lock) struct neighbour gets an additional rcu_head field and is freed after an RCU grace period. Future work would need to eventually not take a reference on neighbour for temporary dst (DST_NOCACHE), but this would need dst->_neighbour to use a noref bit like we did for skb->_dst. 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.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 37845dae6488..a4538d553704 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -91,7 +91,7 @@ struct neigh_statistics {
91#define NEIGH_CACHE_STAT_INC(tbl, field) this_cpu_inc((tbl)->stats->field) 91#define NEIGH_CACHE_STAT_INC(tbl, field) this_cpu_inc((tbl)->stats->field)
92 92
93struct neighbour { 93struct neighbour {
94 struct neighbour *next; 94 struct neighbour __rcu *next;
95 struct neigh_table *tbl; 95 struct neigh_table *tbl;
96 struct neigh_parms *parms; 96 struct neigh_parms *parms;
97 struct net_device *dev; 97 struct net_device *dev;
@@ -111,6 +111,7 @@ struct neighbour {
111 struct sk_buff_head arp_queue; 111 struct sk_buff_head arp_queue;
112 struct timer_list timer; 112 struct timer_list timer;
113 const struct neigh_ops *ops; 113 const struct neigh_ops *ops;
114 struct rcu_head rcu;
114 u8 primary_key[0]; 115 u8 primary_key[0];
115}; 116};
116 117
@@ -139,7 +140,7 @@ struct pneigh_entry {
139 */ 140 */
140 141
141struct neigh_hash_table { 142struct neigh_hash_table {
142 struct neighbour **hash_buckets; 143 struct neighbour __rcu **hash_buckets;
143 unsigned int hash_mask; 144 unsigned int hash_mask;
144 __u32 hash_rnd; 145 __u32 hash_rnd;
145 struct rcu_head rcu; 146 struct rcu_head rcu;