|
@@ -561,20 +561,24 @@ static void print_lock(struct held_lock *hlock)
|
|
|
printk(KERN_CONT ", at: %pS\n", (void *)hlock->acquire_ip);
|
|
|
}
|
|
|
|
|
|
-static void lockdep_print_held_locks(struct task_struct *curr)
|
|
|
+static void lockdep_print_held_locks(struct task_struct *p)
|
|
|
{
|
|
|
- int i, depth = curr->lockdep_depth;
|
|
|
+ int i, depth = READ_ONCE(p->lockdep_depth);
|
|
|
|
|
|
- if (!depth) {
|
|
|
- printk("no locks held by %s/%d.\n", curr->comm, task_pid_nr(curr));
|
|
|
+ if (!depth)
|
|
|
+ printk("no locks held by %s/%d.\n", p->comm, task_pid_nr(p));
|
|
|
+ else
|
|
|
+ printk("%d lock%s held by %s/%d:\n", depth,
|
|
|
+ depth > 1 ? "s" : "", p->comm, task_pid_nr(p));
|
|
|
+ /*
|
|
|
+ * It's not reliable to print a task's held locks if it's not sleeping
|
|
|
+ * and it's not the current task.
|
|
|
+ */
|
|
|
+ if (p->state == TASK_RUNNING && p != current)
|
|
|
return;
|
|
|
- }
|
|
|
- printk("%d lock%s held by %s/%d:\n",
|
|
|
- depth, depth > 1 ? "s" : "", curr->comm, task_pid_nr(curr));
|
|
|
-
|
|
|
for (i = 0; i < depth; i++) {
|
|
|
printk(" #%d: ", i);
|
|
|
- print_lock(curr->held_locks + i);
|
|
|
+ print_lock(p->held_locks + i);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4460,13 +4464,6 @@ void debug_show_all_locks(void)
|
|
|
|
|
|
rcu_read_lock();
|
|
|
for_each_process_thread(g, p) {
|
|
|
- /*
|
|
|
- * It's not reliable to print a task's held locks
|
|
|
- * if it's not sleeping (or if it's not the current
|
|
|
- * task):
|
|
|
- */
|
|
|
- if (p->state == TASK_RUNNING && p != current)
|
|
|
- continue;
|
|
|
if (!p->lockdep_depth)
|
|
|
continue;
|
|
|
lockdep_print_held_locks(p);
|