diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-10-09 04:29:04 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:42 -0400 |
commit | 1148a97f1fb9b80ef5355021f0c2dfc7b8f003a2 (patch) | |
tree | 6acb14dfff4d86d895e01b67aca7428b6abb7723 /fs/bcachefs/debug.c | |
parent | 1be887979bc12a6c88b33b0d53dfdc369bfa9d49 (diff) | |
download | linux-1148a97f1fb9b80ef5355021f0c2dfc7b8f003a2.tar.gz linux-1148a97f1fb9b80ef5355021f0c2dfc7b8f003a2.tar.bz2 linux-1148a97f1fb9b80ef5355021f0c2dfc7b8f003a2.zip |
bcachefs: Print cycle on unrecoverable deadlock
Some lock operations can't fail; a cycle of nofail locks is impossible
to recover from. So we want to get rid of these nofail locking
operations, but as this is tricky it'll be done incrementally.
If such a cycle happens, this patch prints out which codepaths are
involved so we know what to work on next.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/debug.c')
-rw-r--r-- | fs/bcachefs/debug.c | 22 |
1 files changed, 1 insertions, 21 deletions
diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c index c7d558381388..7abc707d2f38 100644 --- a/fs/bcachefs/debug.c +++ b/fs/bcachefs/debug.c @@ -501,26 +501,6 @@ static const struct file_operations cached_btree_nodes_ops = { }; #ifdef CONFIG_BCACHEFS_DEBUG_TRANSACTIONS -static int prt_backtrace(struct printbuf *out, struct task_struct *task) -{ - unsigned long entries[32]; - unsigned i, nr_entries; - int ret; - - ret = down_read_killable(&task->signal->exec_update_lock); - if (ret) - return ret; - - nr_entries = stack_trace_save_tsk(task, entries, ARRAY_SIZE(entries), 0); - for (i = 0; i < nr_entries; i++) { - prt_printf(out, "[<0>] %pB", (void *)entries[i]); - prt_newline(out); - } - - up_read(&task->signal->exec_update_lock); - return 0; -} - static ssize_t bch2_btree_transactions_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { @@ -547,7 +527,7 @@ static ssize_t bch2_btree_transactions_read(struct file *file, char __user *buf, prt_printf(&i->buf, "backtrace:"); prt_newline(&i->buf); printbuf_indent_add(&i->buf, 2); - prt_backtrace(&i->buf, trans->locking_wait.task); + bch2_prt_backtrace(&i->buf, trans->locking_wait.task); printbuf_indent_sub(&i->buf, 2); prt_newline(&i->buf); |