bcachefs: Improve move path tracepoints
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 20 Apr 2023 19:24:07 +0000 (15:24 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:00 +0000 (17:10 -0400)
Move path tracepoints now include the key being moved. Also, add new
tracepoints for the start of move_extent, and evacuate_bucket.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c
fs/bcachefs/move.c
fs/bcachefs/trace.h

index 7a5850679f166ad0fcb9126d01d9a5d1b5733dd7..cffb3c14d539bf4a04236e47d769149a32e9c6c9 100644 (file)
@@ -92,6 +92,17 @@ static int insert_snapshot_whiteouts(struct btree_trans *trans,
        return ret;
 }
 
+static void trace_move_extent_finish2(struct bch_fs *c, struct bkey_s_c k)
+{
+       if (trace_move_extent_finish_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bkey_val_to_text(&buf, c, k);
+               trace_move_extent_finish(c, buf.buf);
+               printbuf_exit(&buf);
+       }
+}
+
 static void trace_move_extent_fail2(struct data_update *m,
                         struct bkey_s_c new,
                         struct bkey_s_c wrote,
@@ -342,7 +353,7 @@ restart_drop_extra_replicas:
                        bch2_btree_iter_set_pos(&iter, next_pos);
 
                        this_cpu_add(c->counters[BCH_COUNTER_move_extent_finish], new->k.size);
-                       trace_move_extent_finish(&new->k);
+                       trace_move_extent_finish2(c, bkey_i_to_s_c(&new->k_i));
                }
 err:
                if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
index 9c8af0872b29b4f6a59770f7a3dbdc452c3c60d9..498b3f9778de368531b0278040c13085a559cc81 100644 (file)
 #include <linux/ioprio.h>
 #include <linux/kthread.h>
 
+static void trace_move_extent2(struct bch_fs *c, struct bkey_s_c k)
+{
+       if (trace_move_extent_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bkey_val_to_text(&buf, c, k);
+               trace_move_extent(c, buf.buf);
+               printbuf_exit(&buf);
+       }
+}
+
+static void trace_move_extent_read2(struct bch_fs *c, struct bkey_s_c k)
+{
+       if (trace_move_extent_read_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bkey_val_to_text(&buf, c, k);
+               trace_move_extent_read(c, buf.buf);
+               printbuf_exit(&buf);
+       }
+}
+
+static void trace_move_extent_alloc_mem_fail2(struct bch_fs *c, struct bkey_s_c k)
+{
+       if (trace_move_extent_alloc_mem_fail_enabled()) {
+               struct printbuf buf = PRINTBUF;
+
+               bch2_bkey_val_to_text(&buf, c, k);
+               trace_move_extent_alloc_mem_fail(c, buf.buf);
+               printbuf_exit(&buf);
+       }
+}
+
 static void progress_list_add(struct bch_fs *c, struct bch_move_stats *stats)
 {
        mutex_lock(&c->data_progress_lock);
@@ -269,6 +302,8 @@ static int bch2_move_extent(struct btree_trans *trans,
        unsigned sectors = k.k->size, pages;
        int ret = -ENOMEM;
 
+       trace_move_extent2(c, k);
+
        bch2_data_update_opts_normalize(k, &data_opts);
 
        if (!data_opts.rewrite_ptrs &&
@@ -346,8 +381,7 @@ static int bch2_move_extent(struct btree_trans *trans,
 
        this_cpu_add(c->counters[BCH_COUNTER_io_move], k.k->size);
        this_cpu_add(c->counters[BCH_COUNTER_move_extent_read], k.k->size);
-       trace_move_extent_read(k.k);
-
+       trace_move_extent_read2(c, k);
 
        mutex_lock(&ctxt->lock);
        atomic_add(io->read_sectors, &ctxt->read_sectors);
@@ -373,7 +407,8 @@ err_free_pages:
 err_free:
        kfree(io);
 err:
-       trace_and_count(c, move_extent_alloc_mem_fail, k.k);
+       this_cpu_inc(c->counters[BCH_COUNTER_move_extent_alloc_mem_fail]);
+       trace_move_extent_alloc_mem_fail2(c, k);
        return ret;
 }
 
@@ -719,6 +754,8 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
        struct bpos bp_pos = POS_MIN;
        int ret = 0;
 
+       trace_bucket_evacuate(c, &bucket);
+
        bch2_bkey_buf_init(&sk);
 
        /*
index bbe8eb7a29ebed7e7c8e574f5e699e1504900362..8027c2a14199bc02db05fc73cd8b379b6cf2d330 100644 (file)
@@ -33,23 +33,18 @@ DECLARE_EVENT_CLASS(bpos,
 );
 
 DECLARE_EVENT_CLASS(bkey,
-       TP_PROTO(const struct bkey *k),
-       TP_ARGS(k),
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k),
 
        TP_STRUCT__entry(
-               __field(u64,    inode                           )
-               __field(u64,    offset                          )
-               __field(u32,    size                            )
+               __string(k,     k                               )
        ),
 
        TP_fast_assign(
-               __entry->inode  = k->p.inode;
-               __entry->offset = k->p.offset;
-               __entry->size   = k->size;
+               __assign_str(k, k);
        ),
 
-       TP_printk("%llu:%llu len %u", __entry->inode,
-                 __entry->offset, __entry->size)
+       TP_printk("%s", __get_str(k))
 );
 
 DECLARE_EVENT_CLASS(btree_node,
@@ -667,19 +662,45 @@ TRACE_EVENT(bucket_invalidate,
 
 /* Moving IO */
 
+TRACE_EVENT(bucket_evacuate,
+       TP_PROTO(struct bch_fs *c, struct bpos *bucket),
+       TP_ARGS(c, bucket),
+
+       TP_STRUCT__entry(
+               __field(dev_t,          dev                     )
+               __field(u32,            dev_idx                 )
+               __field(u64,            bucket                  )
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = c->dev;
+               __entry->dev_idx        = bucket->inode;
+               __entry->bucket         = bucket->offset;
+       ),
+
+       TP_printk("%d:%d %u:%llu",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 __entry->dev_idx, __entry->bucket)
+);
+
+DEFINE_EVENT(bkey, move_extent,
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k)
+);
+
 DEFINE_EVENT(bkey, move_extent_read,
-       TP_PROTO(const struct bkey *k),
-       TP_ARGS(k)
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k)
 );
 
 DEFINE_EVENT(bkey, move_extent_write,
-       TP_PROTO(const struct bkey *k),
-       TP_ARGS(k)
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k)
 );
 
 DEFINE_EVENT(bkey, move_extent_finish,
-       TP_PROTO(const struct bkey *k),
-       TP_ARGS(k)
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k)
 );
 
 TRACE_EVENT(move_extent_fail,
@@ -700,8 +721,8 @@ TRACE_EVENT(move_extent_fail,
 );
 
 DEFINE_EVENT(bkey, move_extent_alloc_mem_fail,
-       TP_PROTO(const struct bkey *k),
-       TP_ARGS(k)
+       TP_PROTO(struct bch_fs *c, const char *k),
+       TP_ARGS(c, k)
 );
 
 TRACE_EVENT(move_data,