diff options
author | Sergei Miroshnichenko <sergeimir@emcraft.com> | 2016-09-07 09:51:12 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2016-09-22 04:01:21 -0400 |
commit | 9abefcb1aaa58b9d5aa40a8bb12c87d02415e4c8 (patch) | |
tree | ff081f6644b855d62aae2a48a8f6f4a8c00d7a78 /include/linux/can | |
parent | 7e32b44361abc77fbc01f2b97b045c405b2583e5 (diff) |
can: dev: fix deadlock reported after bus-off
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>
Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'include/linux/can')
-rw-r--r-- | include/linux/can/dev.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 5261751f6bd4..5f5270941ba0 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h | |||
@@ -32,6 +32,7 @@ enum can_mode { | |||
32 | * CAN common private data | 32 | * CAN common private data |
33 | */ | 33 | */ |
34 | struct can_priv { | 34 | struct can_priv { |
35 | struct net_device *dev; | ||
35 | struct can_device_stats can_stats; | 36 | struct can_device_stats can_stats; |
36 | 37 | ||
37 | struct can_bittiming bittiming, data_bittiming; | 38 | struct can_bittiming bittiming, data_bittiming; |
@@ -47,7 +48,7 @@ struct can_priv { | |||
47 | u32 ctrlmode_static; /* static enabled options for driver/hardware */ | 48 | u32 ctrlmode_static; /* static enabled options for driver/hardware */ |
48 | 49 | ||
49 | int restart_ms; | 50 | int restart_ms; |
50 | struct timer_list restart_timer; | 51 | struct delayed_work restart_work; |
51 | 52 | ||
52 | int (*do_set_bittiming)(struct net_device *dev); | 53 | int (*do_set_bittiming)(struct net_device *dev); |
53 | int (*do_set_data_bittiming)(struct net_device *dev); | 54 | int (*do_set_data_bittiming)(struct net_device *dev); |