|
Oliver Neukum |
945069 |
From 72ef98445aca568a81c2da050532500a8345ad3a Mon Sep 17 00:00:00 2001
|
|
Oliver Neukum |
945069 |
From: Steven Rostedt <rostedt@goodmis.org>
|
|
Oliver Neukum |
945069 |
Date: Tue, 5 Apr 2022 10:02:00 -0400
|
|
Oliver Neukum |
945069 |
Subject: [PATCH] Bluetooth: hci_qca: Use del_timer_sync() before freeing
|
|
Oliver Neukum |
945069 |
Git-commit: 72ef98445aca568a81c2da050532500a8345ad3a
|
|
Oliver Neukum |
945069 |
References: git-fixes
|
|
Oliver Neukum |
945069 |
Patch-mainline: v5.19-rc1
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
While looking at a crash report on a timer list being corrupted, which
|
|
Oliver Neukum |
945069 |
usually happens when a timer is freed while still active. This is
|
|
Oliver Neukum |
945069 |
commonly triggered by code calling del_timer() instead of
|
|
Oliver Neukum |
945069 |
del_timer_sync() just before freeing.
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
One possible culprit is the hci_qca driver, which does exactly that.
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
Eric mentioned that wake_retrans_timer could be rearmed via the work
|
|
Oliver Neukum |
945069 |
queue, so also move the destruction of the work queue before
|
|
Oliver Neukum |
945069 |
del_timer_sync().
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
Cc: Eric Dumazet <eric.dumazet@gmail.com>
|
|
Oliver Neukum |
945069 |
Cc: stable@vger.kernel.org
|
|
Oliver Neukum |
945069 |
Fixes: 0ff252c1976da ("Bluetooth: hciuart: Add support QCA chipset for UART")
|
|
Oliver Neukum |
945069 |
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
|
|
Oliver Neukum |
945069 |
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|
Oliver Neukum |
945069 |
Signed-off-by: Oliver Neukum <oneukum@suse.com>
|
|
Oliver Neukum |
945069 |
---
|
|
Oliver Neukum |
945069 |
drivers/bluetooth/hci_qca.c | 4 ++--
|
|
Oliver Neukum |
945069 |
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
--- a/drivers/bluetooth/hci_qca.c
|
|
Oliver Neukum |
945069 |
+++ b/drivers/bluetooth/hci_qca.c
|
|
Oliver Neukum |
945069 |
@@ -524,9 +524,9 @@ static int qca_close(struct hci_uart *hu
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
skb_queue_purge(&qca->tx_wait_q);
|
|
Oliver Neukum |
945069 |
skb_queue_purge(&qca->txq);
|
|
Oliver Neukum |
945069 |
- del_timer(&qca->tx_idle_timer);
|
|
Oliver Neukum |
945069 |
- del_timer(&qca->wake_retrans_timer);
|
|
Oliver Neukum |
945069 |
destroy_workqueue(qca->workqueue);
|
|
Oliver Neukum |
945069 |
+ del_timer_sync(&qca->tx_idle_timer);
|
|
Oliver Neukum |
945069 |
+ del_timer_sync(&qca->wake_retrans_timer);
|
|
Oliver Neukum |
945069 |
qca->hu = NULL;
|
|
Oliver Neukum |
945069 |
|
|
Oliver Neukum |
945069 |
kfree_skb(qca->rx_skb);
|