1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00
linux/drivers/net/can
Duoming Zhou 47f070a63e can: grcan: grcan_close(): fix deadlock
There are deadlocks caused by del_timer_sync(&priv->hang_timer) and
del_timer_sync(&priv->rr_timer) in grcan_close(), one of the deadlocks
are shown below:

   (Thread 1)              |      (Thread 2)
                           | grcan_reset_timer()
grcan_close()              |  mod_timer()
 spin_lock_irqsave() //(1) |  (wait a time)
 ...                       | grcan_initiate_running_reset()
 del_timer_sync()          |  spin_lock_irqsave() //(2)
 (wait timer to stop)      |  ...

We hold priv->lock in position (1) of thread 1 and use
del_timer_sync() to wait timer to stop, but timer handler also need
priv->lock in position (2) of thread 2. As a result, grcan_close()
will block forever.

This patch extracts del_timer_sync() from the protection of
spin_lock_irqsave(), which could let timer handler to obtain the
needed lock.

Link: https://lore.kernel.org/all/20220425042400.66517-1-duoming@zju.edu.cn
Fixes: 6cec9b07fe ("can: grcan: Add device driver for GRCAN and GRHCAN cores")
Cc: stable@vger.kernel.org
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
Reviewed-by: Andreas Larsson <andreas@gaisler.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
2022-04-29 12:09:19 +02:00
..
c_can can: c_can: ethtool: use default drvinfo 2022-02-24 08:26:04 +01:00
cc770 can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
dev can: Use netif_rx(). 2022-03-06 11:05:31 +00:00
flexcan can: flexcan: mark RX via mailboxes as supported on MCF5441X 2022-01-24 18:27:43 +01:00
ifi_canfd can: do not increase rx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
m_can can: m_can: m_can_tx_handler(): fix use after free of skb 2022-03-31 09:55:27 +02:00
mscan can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
peak_canfd can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
rcar can: rcar_canfd: Add support for r8a779a0 SoC 2022-03-10 09:49:13 +01:00
sja1000 can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
softing can: softing: softing_netdev_open(): remove redundant ret variable 2022-02-24 08:26:04 +01:00
spi can: mcp251xfd: mcp251xfd_register_get_dev_id(): fix return of error value 2022-03-31 09:55:11 +02:00
usb can: gs_usb: gs_make_candev(): fix memory leak for devices with extended bit timing configuration 2022-03-31 09:55:27 +02:00
at91_can.c can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
grcan.c can: grcan: grcan_close(): fix deadlock 2022-04-29 12:09:19 +02:00
janz-ican3.c can: janz-ican3: initialize dlc variable 2022-01-08 20:17:41 +01:00
Kconfig can: flexcan: update Kconfig to enable coldfire 2021-07-25 11:36:29 +02:00
kvaser_pciefd.c can: do not increase rx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
led.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
Makefile can: flexcan: move driver into separate sub directory 2022-01-08 20:17:42 +01:00
pch_can.c can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
slcan.c can: Use netif_rx(). 2022-03-06 11:05:31 +00:00
sun4i_can.c can: do not increase tx_bytes statistics for RTR frames 2022-01-05 12:09:05 +01:00
ti_hecc.c can: ti_hecc: ti_hecc_probe(): use platform_get_irq() to get the interrupt 2022-01-05 12:08:19 +01:00
vcan.c can: Use netif_rx(). 2022-03-06 11:05:31 +00:00
vxcan.c can: vxcan: vxcan_xmit(): use kfree_skb() instead of kfree() to free skb 2022-03-13 09:45:35 +01:00
xilinx_can.c can: xilinx_can: Add check for NAPI Poll function 2022-02-24 08:26:04 +01:00