can: dev: fix deadlock reported after bus-off
authorSergei Miroshnichenko <sergeimir@emcraft.com>
Wed, 7 Sep 2016 13:51:12 +0000 (16:51 +0300)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 22 Sep 2016 08:01:21 +0000 (10:01 +0200)
commit9abefcb1aaa58b9d5aa40a8bb12c87d02415e4c8
treeff081f6644b855d62aae2a48a8f6f4a8c00d7a78
parent7e32b44361abc77fbc01f2b97b045c405b2583e5
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>
drivers/net/can/dev.c
include/linux/can/dev.h