summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorSergei Miroshnichenko <sergeimir@emcraft.com>2016-09-07 16:51:12 +0300
committerBen Hutchings <ben@decadent.org.uk>2016-11-20 01:17:34 +0000
commitca0e1ef2b995d04b3db638fd56c3b4e2223e8c8d (patch)
tree08d410d1fba848a673b15230783481ed0f8db2b7 /include
parentd1adfc596bc2de305bd9cd693d7d9fdb26449305 (diff)
can: dev: fix deadlock reported after bus-off
commit 9abefcb1aaa58b9d5aa40a8bb12c87d02415e4c8 upstream. A timer was used to restart after the bus-off state, leading to a relatively large can_restart() executed in an interrupt context, which in turn sets up pinctrl. When this happens during system boot, there is a high probability of grabbing the pinctrl_list_mutex, which is locked already by the probe() of other device, making the kernel suspect a deadlock condition [1]. To resolve this issue, the restart_timer is replaced by a delayed work. [1] https://github.com/victronenergy/venus/issues/24 Signed-off-by: Sergei Miroshnichenko <sergeimir@emcraft.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'include')
-rw-r--r--include/linux/can/dev.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 6992afc6ba7f..e90bdfc4d0b7 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -31,6 +31,7 @@ enum can_mode {
* CAN common private data
*/
struct can_priv {
+ struct net_device *dev;
struct can_device_stats can_stats;
struct can_bittiming bittiming, data_bittiming;
@@ -43,7 +44,7 @@ struct can_priv {
u32 ctrlmode_supported;
int restart_ms;
- struct timer_list restart_timer;
+ struct delayed_work restart_work;
int (*do_set_bittiming)(struct net_device *dev);
int (*do_set_data_bittiming)(struct net_device *dev);