Re: [PATCH v2 1/2] hung_task: Show the blocker task if the task is hung on mutex

From: Waiman Long
Date: Fri Feb 21 2025 - 15:30:20 EST



On 2/21/25 1:59 PM, Peter Zijlstra wrote:
On Fri, Feb 21, 2025 at 11:30:01PM +0900, Masami Hiramatsu (Google) wrote:
+static void debug_show_blocker(struct task_struct *task)
+{
+ struct task_struct *g, *t;
+ unsigned long owner;
+ struct mutex *lock;
+
+ lock = READ_ONCE(task->blocker_mutex);
+ if (!lock)
+ return;
+
+ owner = mutex_get_owner(lock);
+ if (likely(owner)) {
+ /* Ensure the owner information is correct. */
+ for_each_process_thread(g, t)
+ if ((unsigned long)t == owner) {
+ pr_err("INFO: task %s:%d is blocked on a mutex owned by task %s:%d.\n",
+ task->comm, task->pid, t->comm, t->pid);
+ sched_show_task(t);
+ return;
+ }
- that for_each_process_thread() scope needs { }

- that for_each_process_thread() loop needs RCU or tasklist_lock

The call chain should be

check_hung_uninterruptible_tasks()
  -> check_hung_task()
    -> debug_show_blocker()

check_hung_uninterruptible_tasks() takes rcu_read_lock() before calling check_hung_task(). Perhaps add a statement like

    RCU_LOCKDEP_WARN(!rcu_read_lock_held(), "no rcu lock held");


- there is no saying that the owner you read with mutex_get_owner() is
still the owner by the time you do the compare, there can have been
owner changes.

Maybe change "owned by" to "likely owned by" :-)

Cheers,
Longman