diff options
| author | Breno Leitao <leitao@debian.org> | 2026-07-01 04:05:00 -0700 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2026-07-01 07:54:06 -1000 |
| commit | e73c290bd75338ab514b0c0f0e1431005a8467d7 (patch) | |
| tree | a997a197dce3064ea6b1f4cdd5f789fbe1c41a2a /tools/perf/scripts/python/net_dropmonitor.py | |
| parent | f7dc93388946dacae5ddf6bdf55822f066798a40 (diff) | |
workqueue: dump the last woken worker for stalled pools
To identify the task most likely responsible for a stall, add
last_woken_worker (L: pool->lock) to worker_pool and record it in
kick_pool() just before wake_up_process(). This captures the idle
worker that was kicked to take over when the last running worker went to
sleep; if the pool is now stuck with no running worker, that task is the
prime suspect and its backtrace is dumped by show_pool_no_running_worker().
Using struct worker * rather than struct task_struct * avoids any
lifetime concern: workers are only destroyed via set_worker_dying()
which requires pool->lock, and set_worker_dying() clears
last_woken_worker when the dying worker matches.
show_cpu_pool_busy_workers() holds pool->lock while calling
sched_show_task(), so last_woken_worker is either NULL or points to a
live worker with a valid task. More precisely, set_worker_dying() clears
last_woken_worker before setting WORKER_DIE, so a non-NULL
last_woken_worker means the kthread has not yet exited and worker->task
is still alive.
Suggested-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'tools/perf/scripts/python/net_dropmonitor.py')
0 files changed, 0 insertions, 0 deletions
