bcachefs: trace_io_move_pred
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 27 May 2025 03:00:21 +0000 (23:00 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 30 May 2025 05:21:12 +0000 (01:21 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/move.c
fs/bcachefs/trace.h

index 79f4722621d599388f1183f9fe1d98c12e57600a..f67656fbd849acd63d4c879b05a6f10aa3a1a953 100644 (file)
@@ -38,30 +38,61 @@ const char * const bch2_data_ops_strs[] = {
        NULL
 };
 
-static void trace_io_move2(struct bch_fs *c, struct bkey_s_c k,
-                              struct bch_io_opts *io_opts,
-                              struct data_update_opts *data_opts)
+struct evacuate_bucket_arg {
+       struct bpos             bucket;
+       int                     gen;
+       struct data_update_opts data_opts;
+};
+
+static bool evacuate_bucket_pred(struct bch_fs *, void *,
+                                enum btree_id, struct bkey_s_c,
+                                struct bch_io_opts *,
+                                struct data_update_opts *);
+
+static noinline void
+trace_io_move2(struct bch_fs *c, struct bkey_s_c k,
+              struct bch_io_opts *io_opts,
+              struct data_update_opts *data_opts)
 {
-       if (trace_io_move_enabled()) {
-               struct printbuf buf = PRINTBUF;
+       struct printbuf buf = PRINTBUF;
 
-               bch2_bkey_val_to_text(&buf, c, k);
-               prt_newline(&buf);
-               bch2_data_update_opts_to_text(&buf, c, io_opts, data_opts);
-               trace_io_move(c, buf.buf);
-               printbuf_exit(&buf);
-       }
+       bch2_bkey_val_to_text(&buf, c, k);
+       prt_newline(&buf);
+       bch2_data_update_opts_to_text(&buf, c, io_opts, data_opts);
+       trace_io_move(c, buf.buf);
+       printbuf_exit(&buf);
 }
 
-static void trace_io_move_read2(struct bch_fs *c, struct bkey_s_c k)
+static noinline void trace_io_move_read2(struct bch_fs *c, struct bkey_s_c k)
 {
-       if (trace_io_move_read_enabled()) {
-               struct printbuf buf = PRINTBUF;
+       struct printbuf buf = PRINTBUF;
 
-               bch2_bkey_val_to_text(&buf, c, k);
-               trace_io_move_read(c, buf.buf);
-               printbuf_exit(&buf);
+       bch2_bkey_val_to_text(&buf, c, k);
+       trace_io_move_read(c, buf.buf);
+       printbuf_exit(&buf);
+}
+
+static noinline void
+trace_io_move_pred2(struct bch_fs *c, struct bkey_s_c k,
+                   struct bch_io_opts *io_opts,
+                   struct data_update_opts *data_opts,
+                   move_pred_fn pred, void *_arg, bool p)
+{
+       struct printbuf buf = PRINTBUF;
+
+       prt_printf(&buf, "%ps: %u", pred, p);
+
+       if (pred == evacuate_bucket_pred) {
+               struct evacuate_bucket_arg *arg = _arg;
+               prt_printf(&buf, " gen=%u", arg->gen);
        }
+
+       prt_newline(&buf);
+       bch2_bkey_val_to_text(&buf, c, k);
+       prt_newline(&buf);
+       bch2_data_update_opts_to_text(&buf, c, io_opts, data_opts);
+       trace_io_move_pred(c, buf.buf);
+       printbuf_exit(&buf);
 }
 
 struct moving_io {
@@ -298,7 +329,8 @@ int bch2_move_extent(struct moving_context *ctxt,
        struct bch_fs *c = trans->c;
        int ret = -ENOMEM;
 
-       trace_io_move2(c, k, &io_opts, &data_opts);
+       if (trace_io_move_enabled())
+               trace_io_move2(c, k, &io_opts, &data_opts);
        this_cpu_add(c->counters[BCH_COUNTER_io_move], k.k->size);
 
        if (ctxt->stats)
@@ -364,7 +396,8 @@ int bch2_move_extent(struct moving_context *ctxt,
                atomic_inc(&io->b->count);
        }
 
-       trace_io_move_read2(c, k);
+       if (trace_io_move_read_enabled())
+               trace_io_move_read2(c, k);
 
        mutex_lock(&ctxt->lock);
        atomic_add(io->read_sectors, &ctxt->read_sectors);
@@ -496,6 +529,7 @@ int bch2_move_get_io_opts_one(struct btree_trans *trans,
                bch2_inode_opts_get(io_opts, c, &inode);
        }
        bch2_trans_iter_exit(trans, &inode_iter);
+       /* seem to be spinning here? */
 out:
        return bch2_get_update_rebalance_opts(trans, io_opts, extent_iter, extent_k);
 }
@@ -910,7 +944,13 @@ static int __bch2_move_data_phys(struct moving_context *ctxt,
                }
 
                struct data_update_opts data_opts = {};
-               if (!pred(c, arg, bp.v->btree_id, k, &io_opts, &data_opts)) {
+               bool p = pred(c, arg, bp.v->btree_id, k, &io_opts, &data_opts);
+
+               if (trace_io_move_pred_enabled())
+                       trace_io_move_pred2(c, k, &io_opts, &data_opts,
+                                           pred, arg, p);
+
+               if (!p) {
                        bch2_trans_iter_exit(trans, &iter);
                        goto next;
                }
@@ -993,12 +1033,6 @@ int bch2_move_data_phys(struct bch_fs *c,
        return ret;
 }
 
-struct evacuate_bucket_arg {
-       struct bpos             bucket;
-       int                     gen;
-       struct data_update_opts data_opts;
-};
-
 static bool evacuate_bucket_pred(struct bch_fs *c, void *_arg,
                                 enum btree_id btree, struct bkey_s_c k,
                                 struct bch_io_opts *io_opts,
index 8cb5b40704fd0c17b5b2b12222d47c5b221033a9..8f942913cec36915a8b7bfd582ac929a5280ae8c 100644 (file)
@@ -1431,6 +1431,11 @@ DEFINE_EVENT(fs_str, data_update,
        TP_ARGS(c, str)
 );
 
+DEFINE_EVENT(fs_str, io_move_pred,
+       TP_PROTO(struct bch_fs *c, const char *str),
+       TP_ARGS(c, str)
+);
+
 DEFINE_EVENT(fs_str, io_move_created_rebalance,
        TP_PROTO(struct bch_fs *c, const char *str),
        TP_ARGS(c, str)