bcachefs: Print lock counts in debugs btree_transactions
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 23 Aug 2022 05:20:24 +0000 (01:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:39 +0000 (17:09 -0400)
Improve our debugfs output, to help in debugging deadlocks: this shows,
for every btree node we print, the current number of readers/intent
locks/write locks held.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index ce9437916cf23a35403ab92aa9a5f9aad0c5d067..99422e29c704899377afc721f5c00db59bba89f7 100644 (file)
@@ -3024,9 +3024,21 @@ bch2_btree_path_node_to_text(struct printbuf *out,
                             struct btree_bkey_cached_common *b,
                             bool cached)
 {
+       struct six_lock_count c = six_lock_counts(&b->lock);
+       struct task_struct *owner;
+       pid_t pid;
+
+       rcu_read_lock();
+       owner = READ_ONCE(b->lock.owner);
+       pid = owner ? owner->pid : 0;;
+       rcu_read_unlock();
+
        prt_printf(out, "    l=%u %s:",
               b->level, bch2_btree_ids[b->btree_id]);
        bch2_bpos_to_text(out, btree_node_pos(b, cached));
+
+       prt_printf(out, "    locks %u:%u:%u held by pid %u",
+                  c.n[0], c.n[1], c.n[2], pid);
 }
 
 #ifdef CONFIG_BCACHEFS_DEBUG_TRANSACTIONS