mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-08 04:42:04 -04:00
can: m_can: m_can_tx_work_queue(): fix tx_skb race condition
[ Upstream commit e04b2cfe61072c7966e1a5fb73dd1feb30c206ed ]
The m_can_start_xmit() function checks if the cdev->tx_skb is NULL and
returns with NETDEV_TX_BUSY in case tx_sbk is not NULL.
There is a race condition in the m_can_tx_work_queue(), where first
the skb is send to the driver and then the case tx_sbk is set to NULL.
A TX complete IRQ might come in between and wake the queue, which
results in tx_skb not being cleared yet.
Fixes: f524f829b7 ("can: m_can: Create a m_can platform framework")
Tested-by: Torin Cooper-Bennun <torin@maxiluxsystems.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
c8e3c76cc8
commit
51d3e462ea
1 changed files with 2 additions and 1 deletions
|
|
@ -1418,6 +1418,8 @@ static netdev_tx_t m_can_tx_handler(struct m_can_classdev *cdev)
|
|||
int i;
|
||||
int putidx;
|
||||
|
||||
cdev->tx_skb = NULL;
|
||||
|
||||
/* Generate ID field for TX buffer Element */
|
||||
/* Common to all supported M_CAN versions */
|
||||
if (cf->can_id & CAN_EFF_FLAG) {
|
||||
|
|
@ -1534,7 +1536,6 @@ static void m_can_tx_work_queue(struct work_struct *ws)
|
|||
tx_work);
|
||||
|
||||
m_can_tx_handler(cdev);
|
||||
cdev->tx_skb = NULL;
|
||||
}
|
||||
|
||||
static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
|
||||
|
|
|
|||
Loading…
Reference in a new issue