diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-05 12:38:14 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-05 13:01:34 -0500 |
commit | 799439a88ab7afe99e5052894c20ea77133a1551 (patch) | |
tree | a9c5a0bd777e2e0d616bcbf44d8b1f3ef0d4ae1a /libbcachefs/btree_iter.c | |
parent | 605e2311d9cfbc1acc7ba9181a05b8976d42ea46 (diff) |
Update bcachefs sources to d267e10a43b2 bcachefs: __bch2_sb_field_to_text()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/btree_iter.c')
-rw-r--r-- | libbcachefs/btree_iter.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index 7e5c797c..6e8e9ba5 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -897,7 +897,8 @@ static noinline int btree_node_iter_and_journal_peek(struct btree_trans *trans, bch2_bkey_buf_reassemble(out, c, k); - if (flags & BTREE_ITER_PREFETCH) + if ((flags & BTREE_ITER_PREFETCH) && + c->opts.btree_node_prefetch) ret = btree_path_prefetch_j(trans, path, &jiter); bch2_btree_and_journal_iter_exit(&jiter); @@ -929,7 +930,8 @@ static __always_inline int btree_path_down(struct btree_trans *trans, bch2_bkey_buf_unpack(&tmp, c, l->b, bch2_btree_node_iter_peek(&l->iter, l->b)); - if (flags & BTREE_ITER_PREFETCH) { + if ((flags & BTREE_ITER_PREFETCH) && + c->opts.btree_node_prefetch) { ret = btree_path_prefetch(trans, path); if (ret) goto err; @@ -2816,11 +2818,34 @@ void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size) return p; } +#include "sb-members.h" + static inline void check_srcu_held_too_long(struct btree_trans *trans) { - WARN(trans->srcu_held && time_after(jiffies, trans->srcu_lock_time + HZ * 10), - "btree trans held srcu lock (delaying memory reclaim) for %lu seconds", - (jiffies - trans->srcu_lock_time) / HZ); + if (trans->srcu_held && time_after(jiffies, trans->srcu_lock_time + HZ * 10)) { + struct printbuf buf = PRINTBUF; + + prt_str(&buf, "btree node read time:\n"); + bch2_time_stats_to_text(&buf, &trans->c->times[BCH_TIME_btree_node_read]); + + prt_str(&buf, "btree node read_done time:\n"); + bch2_time_stats_to_text(&buf, &trans->c->times[BCH_TIME_btree_node_read_done]); + + for_each_member_device(trans->c, ca) { + prt_printf(&buf, "device %u read time:\n", ca->dev_idx); + bch2_time_stats_to_text(&buf, &ca->io_latency[READ]); + } + + struct btree_transaction_stats *s = btree_trans_stats(trans); + prt_str(&buf, "transaction duration:\n"); + bch2_time_stats_to_text(&buf, &s->duration); + + WARN(trans->srcu_held && time_after(jiffies, trans->srcu_lock_time + HZ * 10), + "btree trans held srcu lock (delaying memory reclaim) for %lu seconds", + (jiffies - trans->srcu_lock_time) / HZ); + bch2_print_string_as_lines(KERN_ERR, buf.buf); + printbuf_exit(&buf); + } } void bch2_trans_srcu_unlock(struct btree_trans *trans) |