]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_iter.c
Update bcachefs sources to d267e10a43b2 bcachefs: __bch2_sb_field_to_text()
[bcachefs-tools-debian] / libbcachefs / btree_iter.c
index 7e5c797cfaf240e0258259cddae26bdb8bb3fcef..6e8e9ba5805d2239ad74ddf6cdfb2359ff5be33d 100644 (file)
@@ -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)