summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_iter.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-01-05 12:38:14 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-05 13:01:34 -0500
commit799439a88ab7afe99e5052894c20ea77133a1551 (patch)
treea9c5a0bd777e2e0d616bcbf44d8b1f3ef0d4ae1a /libbcachefs/btree_iter.c
parent605e2311d9cfbc1acc7ba9181a05b8976d42ea46 (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.c35
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)