linux/drivers/net
Ahmed S. Darwish ded5006667 can: kvaser_usb: Do not sleep in atomic context
Upon receiving a hardware event with the BUS_RESET flag set,
the driver kills all of its anchored URBs and resets all of
its transmit URB contexts.

Unfortunately it does so under the context of URB completion
handler `kvaser_usb_read_bulk_callback()', which is often
called in an atomic context.

While the device is flooded with many received error packets,
usb_kill_urb() typically sleeps/reschedules till the transfer
request of each killed URB in question completes, leading to
the sleep in atomic bug. [3]

In v2 submission of the original driver patch [1], it was
stated that the URBs kill and tx contexts reset was needed
since we don't receive any tx acknowledgments later and thus
such resources will be locked down forever. Fortunately this
is no longer needed since an earlier bugfix in this patch
series is now applied: all tx URB contexts are reset upon CAN
channel close. [2]

Moreover, a BUS_RESET is now treated _exactly_ like a BUS_OFF
event, which is the recommended handling method advised by
the device manufacturer.

[1] http://article.gmane.org/gmane.linux.network/239442
    http://www.webcitation.org/6Vr2yagAQ

[2] can: kvaser_usb: Reset all URB tx contexts upon channel close
    889b77f7fd

[3] Stacktrace:

 <IRQ>  [<ffffffff8158de87>] dump_stack+0x45/0x57
 [<ffffffff8158b60c>] __schedule_bug+0x41/0x4f
 [<ffffffff815904b1>] __schedule+0x5f1/0x700
 [<ffffffff8159360a>] ? _raw_spin_unlock_irqrestore+0xa/0x10
 [<ffffffff81590684>] schedule+0x24/0x70
 [<ffffffff8147d0a5>] usb_kill_urb+0x65/0xa0
 [<ffffffff81077970>] ? prepare_to_wait_event+0x110/0x110
 [<ffffffff8147d7d8>] usb_kill_anchored_urbs+0x48/0x80
 [<ffffffffa01f4028>] kvaser_usb_unlink_tx_urbs+0x18/0x50 [kvaser_usb]
 [<ffffffffa01f45d0>] kvaser_usb_rx_error+0xc0/0x400 [kvaser_usb]
 [<ffffffff8108b14a>] ? vprintk_default+0x1a/0x20
 [<ffffffffa01f5241>] kvaser_usb_read_bulk_callback+0x4c1/0x5f0 [kvaser_usb]
 [<ffffffff8147a73e>] __usb_hcd_giveback_urb+0x5e/0xc0
 [<ffffffff8147a8a1>] usb_hcd_giveback_urb+0x41/0x110
 [<ffffffffa0008748>] finish_urb+0x98/0x180 [ohci_hcd]
 [<ffffffff810cd1a7>] ? acct_account_cputime+0x17/0x20
 [<ffffffff81069f65>] ? local_clock+0x15/0x30
 [<ffffffffa000a36b>] ohci_work+0x1fb/0x5a0 [ohci_hcd]
 [<ffffffff814fbb31>] ? process_backlog+0xb1/0x130
 [<ffffffffa000cd5b>] ohci_irq+0xeb/0x270 [ohci_hcd]
 [<ffffffff81479fc1>] usb_hcd_irq+0x21/0x30
 [<ffffffff8108bfd3>] handle_irq_event_percpu+0x43/0x120
 [<ffffffff8108c0ed>] handle_irq_event+0x3d/0x60
 [<ffffffff8108ec84>] handle_fasteoi_irq+0x74/0x110
 [<ffffffff81004dfd>] handle_irq+0x1d/0x30
 [<ffffffff81004727>] do_IRQ+0x57/0x100
 [<ffffffff8159482a>] common_interrupt+0x6a/0x6a

Signed-off-by: Ahmed S. Darwish <ahmed.darwish@valeo.com>
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2015-01-27 08:55:08 +01:00
..
appletalk
arcnet
bonding bonding: change error message to debug message in __bond_release_one() 2014-12-27 02:20:55 -05:00
caif caif: Fix napi poll list corruption 2014-12-22 16:34:39 -05:00
can can: kvaser_usb: Do not sleep in atomic context 2015-01-27 08:55:08 +01:00
cris
dsa net: dsa: bcm_sf2: always select FIXED_PHY 2014-12-16 00:57:07 -05:00
ethernet net: mv643xx_eth: Fix highmem support in non-TSO egress path 2015-01-26 16:14:40 -08:00
fddi defxx: Clean up DEFEA resource management 2014-11-21 16:37:13 -05:00
hamradio
hippi
hyperv hyperv: Fix some variable name typos in send-buffer init/revoke 2014-12-22 16:11:11 -05:00
ieee802154 Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
ipvlan ipvlan: fix incorrect usage of IS_ERR() macro in IPv6 code path. 2015-01-25 00:24:19 -08:00
irda Driver core patches for 3.19-rc1 2014-12-14 16:10:09 -08:00
phy net: phy: micrel: use generic config_init for KSZ8021/KSZ8031 2014-12-26 16:19:50 -05:00
plip
ppp ppp_read(): switch to skb_copy_datagram_iter() 2014-12-09 16:29:10 -05:00
slip
team team: avoid possible underflow of count_pending value for notify_peers and mcast_rejoin 2015-01-14 16:53:57 -05:00
usb r8152: remove sram_read 2015-01-19 16:16:32 -05:00
vmxnet3 ethtool: Support for configurable RSS hash function 2014-12-08 21:07:10 -05:00
wan
wimax
wireless ath9k: fix race condition in irq processing during hardware reset 2015-01-19 14:32:29 +02:00
xen-netback xen-netback: fixing the propagation of the transmit shaper timeout 2015-01-06 14:17:37 -05:00
dummy.c dummy: use MODULE_VERSION 2014-12-09 21:51:06 -05:00
eql.c
ifb.c
Kconfig ipvlan: ipvlan depends on INET and IPV6 2014-11-29 20:53:05 -08:00
LICENSE.SRC
loopback.c
macvlan.c macvlan: play well with ipvlan device 2014-12-09 16:10:06 -05:00
macvtap.c macvtap: drop broken IFF_VNET_LE 2014-12-16 11:19:42 -05:00
Makefile ipvlan: Initial check-in of the IPVLAN driver. 2014-11-24 15:29:18 -05:00
mdio.c
mii.c
netconsole.c
nlmon.c
ntb_netdev.c
rionet.c
sb1000.c
Space.c
sungem_phy.c
tun.c tun: drop broken IFF_VNET_LE 2014-12-16 11:19:41 -05:00
veth.c
virtio_net.c virtio_net: Fix napi poll list corruption 2014-12-22 16:10:12 -05:00
vxlan.c vxlan: Fix double free of skb. 2014-12-23 23:57:31 -05:00
xen-netfront.c xen-netfront: use different locks for Rx and Tx stats 2015-01-13 17:22:11 -05:00