bcachefs: Fix evacuate_bucket tracepoint
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Dec 2024 11:18:49 +0000 (06:18 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:18 +0000 (01:36 -0500)
86a494c8eef9 ("bcachefs: Kill bch2_get_next_backpointer()") dropped some
things the tracepoint emitted because bch2_evacuate_bucket() no longer
looks at the alloc key - but we did want at least some of that.

We still no longer look at the alloc key so we can't report on the
fragmentation number, but that's a direct function of dirty_sectors and
a copygc concern anyways - copygc should get its own tracepoint that
includes information from the fragmentation LRU.

But we can report on the number of sectors we moved and the bucket size.

Co-developed-by: Piotr Zalewski <pZ010001011111@proton.me>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/move.c
fs/bcachefs/trace.h

index 88ab9d7e1a1b035643bc092191f9a57e6b8a2d7c..74839268d6ab98497edcbfb26efc91f1f1bb0948 100644 (file)
@@ -674,8 +674,7 @@ int bch2_evacuate_bucket(struct moving_context *ctxt,
        struct bkey_buf sk;
        struct bkey_s_c k;
        struct data_update_opts data_opts;
-       unsigned dirty_sectors, bucket_size;
-       u64 fragmentation;
+       unsigned sectors_moved = 0;
        int ret = 0;
 
        struct bch_dev *ca = bch2_dev_tryget(c, bucket.inode);
@@ -748,14 +747,18 @@ int bch2_evacuate_bucket(struct moving_context *ctxt,
                        data_opts.target        = io_opts.background_target;
                        data_opts.rewrite_ptrs = 0;
 
+                       unsigned sectors = bp.v->bucket_len; /* move_extent will drop locks */
                        unsigned i = 0;
-                       bkey_for_each_ptr(bch2_bkey_ptrs_c(k), ptr) {
-                               if (ptr->dev == bucket.inode) {
-                                       data_opts.rewrite_ptrs |= 1U << i;
-                                       if (ptr->cached) {
+                       const union bch_extent_entry *entry;
+                       struct extent_ptr_decoded p;
+                       bkey_for_each_ptr_decode(k.k, bch2_bkey_ptrs_c(k), p, entry) {
+                               if (p.ptr.dev == bucket.inode) {
+                                       if (p.ptr.cached) {
                                                bch2_trans_iter_exit(trans, &iter);
                                                goto next;
                                        }
+                                       data_opts.rewrite_ptrs |= 1U << i;
+                                       break;
                                }
                                i++;
                        }
@@ -775,7 +778,8 @@ int bch2_evacuate_bucket(struct moving_context *ctxt,
                                goto err;
 
                        if (ctxt->stats)
-                               atomic64_add(k.k->size, &ctxt->stats->sectors_seen);
+                               atomic64_add(sectors, &ctxt->stats->sectors_seen);
+                       sectors_moved += sectors;
                } else {
                        struct btree *b;
 
@@ -806,12 +810,13 @@ int bch2_evacuate_bucket(struct moving_context *ctxt,
                                atomic64_add(sectors, &ctxt->stats->sectors_seen);
                                atomic64_add(sectors, &ctxt->stats->sectors_moved);
                        }
+                       sectors_moved += btree_sectors(c);
                }
 next:
                bch2_btree_iter_advance(&bp_iter);
        }
 
-       trace_evacuate_bucket(c, &bucket, dirty_sectors, bucket_size, fragmentation, ret);
+       trace_evacuate_bucket(c, &bucket, sectors_moved, ca->mi.bucket_size, ret);
 err:
        bch2_trans_iter_exit(trans, &bp_iter);
        bch2_dev_put(ca);
index 5597b9d6297f1b330af647c6eeb125ad083fe43a..2d5932d2881e7da068387c2aae7726be57fcea73 100644 (file)
@@ -848,8 +848,8 @@ TRACE_EVENT(move_data,
 TRACE_EVENT(evacuate_bucket,
        TP_PROTO(struct bch_fs *c, struct bpos *bucket,
                 unsigned sectors, unsigned bucket_size,
-                u64 fragmentation, int ret),
-       TP_ARGS(c, bucket, sectors, bucket_size, fragmentation, ret),
+                int ret),
+       TP_ARGS(c, bucket, sectors, bucket_size, ret),
 
        TP_STRUCT__entry(
                __field(dev_t,          dev             )
@@ -857,7 +857,6 @@ TRACE_EVENT(evacuate_bucket,
                __field(u64,            bucket          )
                __field(u32,            sectors         )
                __field(u32,            bucket_size     )
-               __field(u64,            fragmentation   )
                __field(int,            ret             )
        ),
 
@@ -867,15 +866,14 @@ TRACE_EVENT(evacuate_bucket,
                __entry->bucket                 = bucket->offset;
                __entry->sectors                = sectors;
                __entry->bucket_size            = bucket_size;
-               __entry->fragmentation          = fragmentation;
                __entry->ret                    = ret;
        ),
 
-       TP_printk("%d,%d %llu:%llu sectors %u/%u fragmentation %llu ret %i",
+       TP_printk("%d,%d %llu:%llu sectors %u/%u ret %i",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
                  __entry->member, __entry->bucket,
                  __entry->sectors, __entry->bucket_size,
-                 __entry->fragmentation, __entry->ret)
+                 __entry->ret)
 );
 
 TRACE_EVENT(copygc,