summaryrefslogtreecommitdiffstats
path: root/include/linux/can
diff options
context:
space:
mode:
authorSergei Miroshnichenko <sergeimir@emcraft.com>2016-09-07 09:51:12 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2016-09-22 04:01:21 -0400
commit9abefcb1aaa58b9d5aa40a8bb12c87d02415e4c8 (patch)
treeff081f6644b855d62aae2a48a8f6f4a8c00d7a78 /include/linux/can
parent7e32b44361abc77fbc01f2b97b045c405b2583e5 (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.h3
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 */
34struct can_priv { 34struct 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);