can: dev: fix deadlock reported after bus-off
authorSergei Miroshnichenko <sergeimir@emcraft.com>
Wed, 7 Sep 2016 13:51:12 +0000 (16:51 +0300)
committerWilly Tarreau <w@1wt.eu>
Fri, 10 Feb 2017 10:04:06 +0000 (11:04 +0100)
commitebee2e2f308f75e2bba58f6194fa39fce4ef9529
treef280183653d55ef212b0de0f6a29206e15a37313
parent3419dc516ec27ae51ca8b55a1436b3d1c484d877
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: Willy Tarreau <w@1wt.eu>
drivers/net/can/dev.c
include/linux/can/dev.h