diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-12-09 15:40:31 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-12-09 16:41:12 -0500 |
commit | 79479d4d35ad945192b5b6ff1457bfd7518cbe7a (patch) | |
tree | cb0ddf76e1f18ef10f388848f68d94a50a6b0aeb | |
parent | ed2a5f4260b65f3d613dcd76a97ac091bc88a126 (diff) |
bcachefs: Add a tracepoint for evacuate_bucket
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/move.c | 19 | ||||
-rw-r--r-- | include/trace/events/bcachefs.h | 31 |
2 files changed, 50 insertions, 0 deletions
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index 47b77b3c3e68..433a809566c7 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 #include "bcachefs.h" +#include "alloc_background.h" #include "alloc_foreground.h" #include "backpointers.h" #include "bkey_buf.h" @@ -661,13 +662,29 @@ int __bch2_evacuate_bucket(struct moving_context *ctxt, struct btree_iter iter; struct bkey_buf sk; struct bch_backpointer bp; + struct bch_alloc_v4 a_convert; + const struct bch_alloc_v4 *a; + struct bkey_s_c k; struct data_update_opts data_opts; + unsigned dirty_sectors, bucket_size; u64 bp_offset = 0, cur_inum = U64_MAX; int ret = 0; bch2_bkey_buf_init(&sk); bch2_trans_init(&trans, c, 0, 0); + bch2_trans_iter_init(&trans, &iter, BTREE_ID_alloc, + bucket, BTREE_ITER_CACHED); + ret = lockrestart_do(&trans, + bkey_err(k = bch2_btree_iter_peek_slot(&iter))); + bch2_trans_iter_exit(&trans, &iter); + + if (!ret) { + a = bch2_alloc_to_v4(k, &a_convert); + dirty_sectors = a->dirty_sectors; + bucket_size = bch_dev_bkey_exists(c, bucket.inode)->mi.bucket_size; + } + while (!(ret = move_ratelimit(&trans, ctxt))) { bch2_trans_begin(&trans); @@ -765,6 +782,8 @@ int __bch2_evacuate_bucket(struct moving_context *ctxt, bp_offset++; } + trace_evacuate_bucket(c, &bucket, dirty_sectors, bucket_size, ret); + if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG) && gen >= 0) { bch2_trans_unlock(&trans); move_ctxt_wait_event(ctxt, NULL, list_empty(&ctxt->reads)); diff --git a/include/trace/events/bcachefs.h b/include/trace/events/bcachefs.h index 47ba750d7937..c1b77a5bc717 100644 --- a/include/trace/events/bcachefs.h +++ b/include/trace/events/bcachefs.h @@ -702,6 +702,37 @@ TRACE_EVENT(move_data, __entry->sectors_moved, __entry->keys_moved) ); +TRACE_EVENT(evacuate_bucket, + TP_PROTO(struct bch_fs *c, struct bpos *bucket, + unsigned sectors, unsigned bucket_size, + int ret), + TP_ARGS(c, bucket, sectors, bucket_size, ret), + + TP_STRUCT__entry( + __field(dev_t, dev ) + __field(u64, member ) + __field(u64, bucket ) + __field(u32, sectors ) + __field(u32, bucket_size ) + __field(int, ret ) + ), + + TP_fast_assign( + __entry->dev = c->dev; + __entry->member = bucket->inode; + __entry->bucket = bucket->offset; + __entry->sectors = sectors; + __entry->bucket_size = bucket_size; + __entry->ret = ret; + ), + + 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->ret) +); + TRACE_EVENT(copygc, TP_PROTO(struct bch_fs *c, u64 sectors_moved, u64 sectors_not_moved, |