aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2014-05-03 10:12:47 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-07 15:09:52 -0400
commit4f4178f3bb1f470d7fb863ec531e08e20a0fd51c (patch)
tree5d98907dfaf90677d80c339bb3953300243a31a0
parent2080cee435088a2390195c2424e494c50e37d6a1 (diff)
net: cdc_mbim: __vlan_find_dev_deep need rcu_read_lock
Fixes this warning introduced by commit 5b8f15f78e6f ("net: cdc_mbim: handle IPv6 Neigbor Solicitations"): =============================== [ INFO: suspicious RCU usage. ] 3.15.0-rc3 #213 Tainted: G W O ------------------------------- net/8021q/vlan_core.c:69 suspicious rcu_dereference_check() usage! other info that might help us debug this: rcu_scheduler_active = 1, debug_locks = 1 no locks held by ksoftirqd/0/3. stack backtrace: CPU: 0 PID: 3 Comm: ksoftirqd/0 Tainted: G W O 3.15.0-rc3 #213 Hardware name: LENOVO 2776LEG/2776LEG, BIOS 6EET55WW (3.15 ) 12/19/2011 0000000000000001 ffff880232533bf0 ffffffff813a5ee6 0000000000000006 ffff880232530090 ffff880232533c20 ffffffff81076b94 0000000000000081 0000000000000000 ffff8802085ac000 ffff88007fc8ea00 ffff880232533c50 Call Trace: [<ffffffff813a5ee6>] dump_stack+0x4e/0x68 [<ffffffff81076b94>] lockdep_rcu_suspicious+0xfa/0x103 [<ffffffff813978a6>] __vlan_find_dev_deep+0x54/0x94 [<ffffffffa04a1938>] cdc_mbim_rx_fixup+0x379/0x66a [cdc_mbim] [<ffffffff813ab76f>] ? _raw_spin_unlock_irqrestore+0x3a/0x49 [<ffffffff81079671>] ? trace_hardirqs_on_caller+0x192/0x1a1 [<ffffffffa059bd10>] usbnet_bh+0x59/0x287 [usbnet] [<ffffffff8104067d>] tasklet_action+0xbb/0xcd [<ffffffff81040057>] __do_softirq+0x14c/0x30d [<ffffffff81040237>] run_ksoftirqd+0x1f/0x50 [<ffffffff8105f13e>] smpboot_thread_fn+0x172/0x18e [<ffffffff8105efcc>] ? SyS_setgroups+0xdf/0xdf [<ffffffff810594b0>] kthread+0xb5/0xbd [<ffffffff813a84b1>] ? __wait_for_common+0x13b/0x170 [<ffffffff810593fb>] ? __kthread_parkme+0x5c/0x5c [<ffffffff813b147c>] ret_from_fork+0x7c/0xb0 [<ffffffff810593fb>] ? __kthread_parkme+0x5c/0x5c Fixes: 5b8f15f78e6f ("net: cdc_mbim: handle IPv6 Neigbor Solicitations") Signed-off-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/usb/cdc_mbim.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
index c9f3281506af..13f7705fd679 100644
--- a/drivers/net/usb/cdc_mbim.c
+++ b/drivers/net/usb/cdc_mbim.c
@@ -204,17 +204,23 @@ static void do_neigh_solicit(struct usbnet *dev, u8 *buf, u16 tci)
204 return; 204 return;
205 205
206 /* need to send the NA on the VLAN dev, if any */ 206 /* need to send the NA on the VLAN dev, if any */
207 if (tci) 207 rcu_read_lock();
208 if (tci) {
208 netdev = __vlan_find_dev_deep(dev->net, htons(ETH_P_8021Q), 209 netdev = __vlan_find_dev_deep(dev->net, htons(ETH_P_8021Q),
209 tci); 210 tci);
210 else 211 if (!netdev) {
212 rcu_read_unlock();
213 return;
214 }
215 } else {
211 netdev = dev->net; 216 netdev = dev->net;
212 if (!netdev) 217 }
213 return; 218 dev_hold(netdev);
219 rcu_read_unlock();
214 220
215 in6_dev = in6_dev_get(netdev); 221 in6_dev = in6_dev_get(netdev);
216 if (!in6_dev) 222 if (!in6_dev)
217 return; 223 goto out;
218 is_router = !!in6_dev->cnf.forwarding; 224 is_router = !!in6_dev->cnf.forwarding;
219 in6_dev_put(in6_dev); 225 in6_dev_put(in6_dev);
220 226
@@ -224,6 +230,8 @@ static void do_neigh_solicit(struct usbnet *dev, u8 *buf, u16 tci)
224 true /* solicited */, 230 true /* solicited */,
225 false /* override */, 231 false /* override */,
226 true /* inc_opt */); 232 true /* inc_opt */);
233out:
234 dev_put(netdev);
227} 235}
228 236
229static bool is_neigh_solicit(u8 *buf, size_t len) 237static bool is_neigh_solicit(u8 *buf, size_t len)