]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: hci_conn: use mod_delayed_work for active mode timeout
authorStefan Sørensen <ssorensen@roku.com>
Tue, 16 Dec 2025 09:20:09 +0000 (10:20 +0100)
committerSasha Levin <sashal@kernel.org>
Wed, 4 Mar 2026 12:20:30 +0000 (07:20 -0500)
[ Upstream commit 49d0901e260739de2fcc90c0c29f9e31e39a2d9b ]

hci_conn_enter_active_mode() uses queue_delayed_work() with the
intention that the work will run after the given timeout. However,
queue_delayed_work() does nothing if the work is already queued, so
depending on the link policy we may end up putting the connection
into idle mode every hdev->idle_timeout ms.

Use mod_delayed_work() instead so the work is queued if not already
queued, and the timeout is updated otherwise.

Signed-off-by: Stefan Sørensen <ssorensen@roku.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/bluetooth/hci_conn.c

index 98f0461b3dd7ddeca9dbdb9021eed342b0ce6097..dc085856f5e91293c3dd4ef406d5840088d7e32f 100644 (file)
@@ -2620,8 +2620,8 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
 
 timer:
        if (hdev->idle_timeout > 0)
-               queue_delayed_work(hdev->workqueue, &conn->idle_work,
-                                  msecs_to_jiffies(hdev->idle_timeout));
+               mod_delayed_work(hdev->workqueue, &conn->idle_work,
+                                msecs_to_jiffies(hdev->idle_timeout));
 }
 
 /* Drop all connection on the device */