diff options
-rw-r--r-- | fs/bcachefs/btree_cache.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_cache.h | 11 | ||||
-rw-r--r-- | fs/bcachefs/btree_io.c | 14 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 16 | ||||
-rw-r--r-- | fs/bcachefs/trace.h | 127 |
5 files changed, 63 insertions, 108 deletions
diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c index 91e0aa796e6b..c8708cba2e62 100644 --- a/fs/bcachefs/btree_cache.c +++ b/fs/bcachefs/btree_cache.c @@ -444,7 +444,8 @@ retry_unlocked: } if (b->hash_val && !ret) - trace_and_count(c, btree_cache_reap, c, b); + trace_btree_node(c, b, btree_cache_reap); + return 0; } diff --git a/fs/bcachefs/btree_cache.h b/fs/bcachefs/btree_cache.h index ca3c1b145330..3264801cbcbe 100644 --- a/fs/bcachefs/btree_cache.h +++ b/fs/bcachefs/btree_cache.h @@ -153,4 +153,15 @@ void bch2_btree_pos_to_text(struct printbuf *, struct bch_fs *, const struct btr void bch2_btree_node_to_text(struct printbuf *, struct bch_fs *, const struct btree *); void bch2_btree_cache_to_text(struct printbuf *, const struct btree_cache *); +#define trace_btree_node(_c, _b, event) \ +do { \ + if (trace_##event##_enabled()) { \ + CLASS(printbuf, buf)(); \ + printbuf_indent_add(&buf, 2); \ + bch2_btree_pos_to_text(&buf, c, b); \ + trace_##event(c, buf.buf); \ + } \ + count_event(c, event); \ +} while (0); + #endif /* _BCACHEFS_BTREE_CACHE_H */ diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index 08b22bddd747..19fd951495ac 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1771,7 +1771,7 @@ void bch2_btree_node_read(struct btree_trans *trans, struct btree *b, struct bio *bio; int ret; - trace_and_count(c, btree_node_read, trans, b); + trace_btree_node(c, b, btree_node_read); if (static_branch_unlikely(&bch2_verify_all_btree_replicas) && !btree_node_read_all_replicas(c, b, sync)) @@ -2505,7 +2505,17 @@ do_write: c->opts.nochanges) goto err; - trace_and_count(c, btree_node_write, b, bytes_to_write, sectors_to_write); + if (trace_btree_node_write_enabled()) { + CLASS(printbuf, buf)(); + printbuf_indent_add(&buf, 2); + prt_printf(&buf, "offset %u sectors %u bytes %u\n", + b->written, + sectors_to_write, + bytes_to_write); + bch2_btree_pos_to_text(&buf, c, b); + trace_btree_node_write(c, buf.buf); + } + count_event(c, btree_node_write); wbio = container_of(bio_alloc_bioset(NULL, buf_pages(data, sectors_to_write << 9), diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index a26911d4d3bf..8e3d3db2c53b 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -217,7 +217,7 @@ static void __btree_node_free(struct btree_trans *trans, struct btree *b) { struct bch_fs *c = trans->c; - trace_and_count(c, btree_node_free, trans, b); + trace_btree_node(c, b, btree_node_free); BUG_ON(btree_node_write_blocked(b)); BUG_ON(btree_node_dirty(b)); @@ -406,7 +406,7 @@ static struct btree *bch2_btree_node_alloc(struct btree_update *as, ret = bch2_btree_node_hash_insert(&c->btree_cache, b, level, as->btree_id); BUG_ON(ret); - trace_and_count(c, btree_node_alloc, trans, b); + trace_btree_node(c, b, btree_node_alloc); bch2_increment_clock(c, btree_sectors(c), WRITE); return b; } @@ -1331,7 +1331,7 @@ static int bch2_btree_set_root(struct btree_update *as, { struct bch_fs *c = as->c; - trace_and_count(c, btree_node_set_root, trans, b); + trace_btree_node(c, b, btree_node_set_root); struct btree *old = btree_node_root(c, b); @@ -1641,7 +1641,7 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans, if (b->nr.live_u64s > BTREE_SPLIT_THRESHOLD(c)) { struct btree *n[2]; - trace_and_count(c, btree_node_split, trans, b); + trace_btree_node(c, b, btree_node_split); n[0] = n1 = bch2_btree_node_alloc(as, trans, b->c.level); n[1] = n2 = bch2_btree_node_alloc(as, trans, b->c.level); @@ -1703,7 +1703,7 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans, goto err; } } else { - trace_and_count(c, btree_node_compact, trans, b); + trace_btree_node(c, b, btree_node_compact); n1 = bch2_btree_node_alloc_replacement(as, trans, b); @@ -2119,7 +2119,7 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans, as->node_start = prev->data->min_key; as->node_end = next->data->max_key; - trace_and_count(c, btree_node_merge, trans, b); + trace_btree_node(c, b, btree_node_merge); n = bch2_btree_node_alloc(as, trans, b->c.level); @@ -2251,8 +2251,6 @@ int bch2_btree_node_rewrite(struct btree_trans *trans, mark_btree_node_locked(trans, trans->paths + new_path, n->c.level, BTREE_NODE_INTENT_LOCKED); bch2_btree_path_level_init(trans, trans->paths + new_path, n); - trace_and_count(c, btree_node_rewrite, trans, b); - if (parent) { bch2_keylist_add(&as->parent_keys, &n->key); ret = bch2_btree_insert_node(as, trans, iter->path, parent, &as->parent_keys); @@ -2263,6 +2261,8 @@ int bch2_btree_node_rewrite(struct btree_trans *trans, if (ret) goto err; + trace_btree_node(c, b, btree_node_rewrite); + bch2_btree_interior_update_will_free_node(as, b); bch2_btree_update_get_open_buckets(as, n); diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h index 9c5a9c551f03..b5dae1145afa 100644 --- a/fs/bcachefs/trace.h +++ b/fs/bcachefs/trace.h @@ -92,58 +92,6 @@ DECLARE_EVENT_CLASS(trans_str_nocaller, __entry->trans_fn, __get_str(str)) ); -DECLARE_EVENT_CLASS(btree_node_nofs, - TP_PROTO(struct bch_fs *c, struct btree *b), - TP_ARGS(c, b), - - TP_STRUCT__entry( - __field(dev_t, dev ) - __field(u8, level ) - __field(u8, btree_id ) - TRACE_BPOS_entries(pos) - ), - - TP_fast_assign( - __entry->dev = c->dev; - __entry->level = b->c.level; - __entry->btree_id = b->c.btree_id; - TRACE_BPOS_assign(pos, b->key.k.p); - ), - - TP_printk("%d,%d %u %s %llu:%llu:%u", - MAJOR(__entry->dev), MINOR(__entry->dev), - __entry->level, - bch2_btree_id_str(__entry->btree_id), - __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot) -); - -DECLARE_EVENT_CLASS(btree_node, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b), - - TP_STRUCT__entry( - __field(dev_t, dev ) - __array(char, trans_fn, 32 ) - __field(u8, level ) - __field(u8, btree_id ) - TRACE_BPOS_entries(pos) - ), - - TP_fast_assign( - __entry->dev = trans->c->dev; - strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn)); - __entry->level = b->c.level; - __entry->btree_id = b->c.btree_id; - TRACE_BPOS_assign(pos, b->key.k.p); - ), - - TP_printk("%d,%d %s %u %s %llu:%llu:%u", - MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn, - __entry->level, - bch2_btree_id_str(__entry->btree_id), - __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot) -); - DECLARE_EVENT_CLASS(bch_fs, TP_PROTO(struct bch_fs *c), TP_ARGS(c), @@ -527,9 +475,9 @@ TRACE_EVENT(btree_cache_scan, __entry->nr_to_scan, __entry->can_free, __entry->ret) ); -DEFINE_EVENT(btree_node_nofs, btree_cache_reap, - TP_PROTO(struct bch_fs *c, struct btree *b), - TP_ARGS(c, b) +DEFINE_EVENT(fs_str, btree_cache_reap, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock_fail, @@ -554,39 +502,24 @@ DEFINE_EVENT(btree_trans, btree_cache_cannibalize_unlock, /* Btree */ -DEFINE_EVENT(btree_node, btree_node_read, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_read, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -TRACE_EVENT(btree_node_write, - TP_PROTO(struct btree *b, unsigned bytes, unsigned sectors), - TP_ARGS(b, bytes, sectors), - - TP_STRUCT__entry( - __field(enum btree_node_type, type) - __field(unsigned, bytes ) - __field(unsigned, sectors ) - ), - - TP_fast_assign( - __entry->type = btree_node_type(b); - __entry->bytes = bytes; - __entry->sectors = sectors; - ), - - TP_printk("bkey type %u bytes %u sectors %u", - __entry->type , __entry->bytes, __entry->sectors) +DEFINE_EVENT(fs_str, btree_node_write, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_alloc, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_alloc, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_free, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_free, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); TRACE_EVENT(btree_reserve_get_fail, @@ -617,29 +550,29 @@ TRACE_EVENT(btree_reserve_get_fail, __entry->ret) ); -DEFINE_EVENT(btree_node, btree_node_compact, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_set_root, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_merge, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_rewrite, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_split, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_merge, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_rewrite, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_compact, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); -DEFINE_EVENT(btree_node, btree_node_set_root, - TP_PROTO(struct btree_trans *trans, struct btree *b), - TP_ARGS(trans, b) +DEFINE_EVENT(fs_str, btree_node_split, + TP_PROTO(struct bch_fs *c, const char *str), + TP_ARGS(c, str) ); TRACE_EVENT(btree_path_relock_fail, |