diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-11-12 00:46:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-12 16:18:57 -0500 |
commit | 1d7138de878d1d4210727c1200193e69596f93b3 (patch) | |
tree | f7abb08bfdf35d1e876f93d24ce44072d2f6ed72 /include/linux/igmp.h | |
parent | f5539b5bfa2e00f2a6fd35731db66142a2f327c0 (diff) |
igmp: RCU conversion of in_dev->mc_list
in_dev->mc_list is protected by one rwlock (in_dev->mc_list_lock).
This can easily be converted to a RCU protection.
Writers hold RTNL, so mc_list_lock is removed, not replaced by a
spinlock.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Cypher Wu <cypher.w@gmail.com>
Cc: Américo Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/igmp.h')
-rw-r--r-- | include/linux/igmp.h | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/igmp.h b/include/linux/igmp.h index 93fc2449af10..7d164670f264 100644 --- a/include/linux/igmp.h +++ b/include/linux/igmp.h | |||
@@ -167,10 +167,10 @@ struct ip_sf_socklist { | |||
167 | */ | 167 | */ |
168 | 168 | ||
169 | struct ip_mc_socklist { | 169 | struct ip_mc_socklist { |
170 | struct ip_mc_socklist *next; | 170 | struct ip_mc_socklist __rcu *next_rcu; |
171 | struct ip_mreqn multi; | 171 | struct ip_mreqn multi; |
172 | unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */ | 172 | unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */ |
173 | struct ip_sf_socklist *sflist; | 173 | struct ip_sf_socklist __rcu *sflist; |
174 | struct rcu_head rcu; | 174 | struct rcu_head rcu; |
175 | }; | 175 | }; |
176 | 176 | ||
@@ -186,11 +186,14 @@ struct ip_sf_list { | |||
186 | struct ip_mc_list { | 186 | struct ip_mc_list { |
187 | struct in_device *interface; | 187 | struct in_device *interface; |
188 | __be32 multiaddr; | 188 | __be32 multiaddr; |
189 | unsigned int sfmode; | ||
189 | struct ip_sf_list *sources; | 190 | struct ip_sf_list *sources; |
190 | struct ip_sf_list *tomb; | 191 | struct ip_sf_list *tomb; |
191 | unsigned int sfmode; | ||
192 | unsigned long sfcount[2]; | 192 | unsigned long sfcount[2]; |
193 | struct ip_mc_list *next; | 193 | union { |
194 | struct ip_mc_list *next; | ||
195 | struct ip_mc_list __rcu *next_rcu; | ||
196 | }; | ||
194 | struct timer_list timer; | 197 | struct timer_list timer; |
195 | int users; | 198 | int users; |
196 | atomic_t refcnt; | 199 | atomic_t refcnt; |
@@ -201,6 +204,7 @@ struct ip_mc_list { | |||
201 | char loaded; | 204 | char loaded; |
202 | unsigned char gsquery; /* check source marks? */ | 205 | unsigned char gsquery; /* check source marks? */ |
203 | unsigned char crcount; | 206 | unsigned char crcount; |
207 | struct rcu_head rcu; | ||
204 | }; | 208 | }; |
205 | 209 | ||
206 | /* V3 exponential field decoding */ | 210 | /* V3 exponential field decoding */ |