FROMLIST: thunderbolt: do not double dequeue a request
Some of our devices crash in tb_cfg_request_dequeue():
general protection fault, probably for non-canonical address 0xdead000000000122
CPU: 6 PID: 91007 Comm: kworker/6:2 Tainted: G U W 6.6.65
RIP: 0010:tb_cfg_request_dequeue+0x2d/0xa0
Call Trace:
<TASK>
? tb_cfg_request_dequeue+0x2d/0xa0
tb_cfg_request_work+0x33/0x80
worker_thread+0x386/0x8f0
kthread+0xed/0x110
ret_from_fork+0x38/0x50
ret_from_fork_asm+0x1b/0x30
The circumstances are unclear, however, the theory is that
tb_cfg_request_work() can be scheduled twice for a request:
first time via frame.callback from ring_work() and second
time from tb_cfg_request(). Both times kworkers will execute
tb_cfg_request_dequeue(), which results in double list_del()
from the ctl->request_queue (the list poison deference hints
at it: 0xdead000000000122).
Do not dequeue requests that don't have TB_CFG_REQUEST_ACTIVE
bit set.
Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: stable@vger.kernel.org
(am from https://lore.kernel.org/r/20250327150406.138736-1-senozhatsky@chromium.org)
UPSTREAM-TASK=b:406764158
BUG=b:382364377
TEST=build test
Change-Id: I1ab84c62b364b423a8a88d5cfeef8cd057c2fe0a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/6399736
Reviewed-by: Masami Hiramatsu <mhiramat@google.com>
Commit-Queue: Sergey Senozhatsky <senozhatsky@chromium.org>
Tested-by: Sergey Senozhatsky <senozhatsky@chromium.org>
(cherry picked from commit 2016cca2f8f6a41d8ffd124ef3924270340d747c)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/6406987
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
1 file changed