diff options
author | Bjørn Mork <bjorn@mork.no> | 2014-05-03 10:12:47 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-07 15:09:52 -0400 |
commit | 4f4178f3bb1f470d7fb863ec531e08e20a0fd51c (patch) | |
tree | 5d98907dfaf90677d80c339bb3953300243a31a0 | |
parent | 2080cee435088a2390195c2424e494c50e37d6a1 (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.c | 18 |
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 */); |
233 | out: | ||
234 | dev_put(netdev); | ||
227 | } | 235 | } |
228 | 236 | ||
229 | static bool is_neigh_solicit(u8 *buf, size_t len) | 237 | static bool is_neigh_solicit(u8 *buf, size_t len) |