1906 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#undef TRACE_SYSTEM3#define TRACE_SYSTEM bcachefs4 5#if !defined(_TRACE_BCACHEFS_H) || defined(TRACE_HEADER_MULTI_READ)6 7#include <linux/tracepoint.h>8 9#define TRACE_BPOS_entries(name) \10 __field(u64, name##_inode ) \11 __field(u64, name##_offset ) \12 __field(u32, name##_snapshot )13 14#define TRACE_BPOS_assign(dst, src) \15 __entry->dst##_inode = (src).inode; \16 __entry->dst##_offset = (src).offset; \17 __entry->dst##_snapshot = (src).snapshot18 19DECLARE_EVENT_CLASS(bpos,20 TP_PROTO(const struct bpos *p),21 TP_ARGS(p),22 23 TP_STRUCT__entry(24 TRACE_BPOS_entries(p)25 ),26 27 TP_fast_assign(28 TRACE_BPOS_assign(p, *p);29 ),30 31 TP_printk("%llu:%llu:%u", __entry->p_inode, __entry->p_offset, __entry->p_snapshot)32);33 34DECLARE_EVENT_CLASS(fs_str,35 TP_PROTO(struct bch_fs *c, const char *str),36 TP_ARGS(c, str),37 38 TP_STRUCT__entry(39 __field(dev_t, dev )40 __string(str, str )41 ),42 43 TP_fast_assign(44 __entry->dev = c->dev;45 __assign_str(str);46 ),47 48 TP_printk("%d,%d\n%s", MAJOR(__entry->dev), MINOR(__entry->dev), __get_str(str))49);50 51DECLARE_EVENT_CLASS(trans_str,52 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),53 TP_ARGS(trans, caller_ip, str),54 55 TP_STRUCT__entry(56 __field(dev_t, dev )57 __array(char, trans_fn, 32 )58 __field(unsigned long, caller_ip )59 __string(str, str )60 ),61 62 TP_fast_assign(63 __entry->dev = trans->c->dev;64 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));65 __entry->caller_ip = caller_ip;66 __assign_str(str);67 ),68 69 TP_printk("%d,%d %s %pS %s",70 MAJOR(__entry->dev), MINOR(__entry->dev),71 __entry->trans_fn, (void *) __entry->caller_ip, __get_str(str))72);73 74DECLARE_EVENT_CLASS(trans_str_nocaller,75 TP_PROTO(struct btree_trans *trans, const char *str),76 TP_ARGS(trans, str),77 78 TP_STRUCT__entry(79 __field(dev_t, dev )80 __array(char, trans_fn, 32 )81 __string(str, str )82 ),83 84 TP_fast_assign(85 __entry->dev = trans->c->dev;86 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));87 __assign_str(str);88 ),89 90 TP_printk("%d,%d %s %s",91 MAJOR(__entry->dev), MINOR(__entry->dev),92 __entry->trans_fn, __get_str(str))93);94 95DECLARE_EVENT_CLASS(btree_node_nofs,96 TP_PROTO(struct bch_fs *c, struct btree *b),97 TP_ARGS(c, b),98 99 TP_STRUCT__entry(100 __field(dev_t, dev )101 __field(u8, level )102 __field(u8, btree_id )103 TRACE_BPOS_entries(pos)104 ),105 106 TP_fast_assign(107 __entry->dev = c->dev;108 __entry->level = b->c.level;109 __entry->btree_id = b->c.btree_id;110 TRACE_BPOS_assign(pos, b->key.k.p);111 ),112 113 TP_printk("%d,%d %u %s %llu:%llu:%u",114 MAJOR(__entry->dev), MINOR(__entry->dev),115 __entry->level,116 bch2_btree_id_str(__entry->btree_id),117 __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot)118);119 120DECLARE_EVENT_CLASS(btree_node,121 TP_PROTO(struct btree_trans *trans, struct btree *b),122 TP_ARGS(trans, b),123 124 TP_STRUCT__entry(125 __field(dev_t, dev )126 __array(char, trans_fn, 32 )127 __field(u8, level )128 __field(u8, btree_id )129 TRACE_BPOS_entries(pos)130 ),131 132 TP_fast_assign(133 __entry->dev = trans->c->dev;134 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));135 __entry->level = b->c.level;136 __entry->btree_id = b->c.btree_id;137 TRACE_BPOS_assign(pos, b->key.k.p);138 ),139 140 TP_printk("%d,%d %s %u %s %llu:%llu:%u",141 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn,142 __entry->level,143 bch2_btree_id_str(__entry->btree_id),144 __entry->pos_inode, __entry->pos_offset, __entry->pos_snapshot)145);146 147DECLARE_EVENT_CLASS(bch_fs,148 TP_PROTO(struct bch_fs *c),149 TP_ARGS(c),150 151 TP_STRUCT__entry(152 __field(dev_t, dev )153 ),154 155 TP_fast_assign(156 __entry->dev = c->dev;157 ),158 159 TP_printk("%d,%d", MAJOR(__entry->dev), MINOR(__entry->dev))160);161 162DECLARE_EVENT_CLASS(btree_trans,163 TP_PROTO(struct btree_trans *trans),164 TP_ARGS(trans),165 166 TP_STRUCT__entry(167 __field(dev_t, dev )168 __array(char, trans_fn, 32 )169 ),170 171 TP_fast_assign(172 __entry->dev = trans->c->dev;173 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));174 ),175 176 TP_printk("%d,%d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->trans_fn)177);178 179DECLARE_EVENT_CLASS(bio,180 TP_PROTO(struct bio *bio),181 TP_ARGS(bio),182 183 TP_STRUCT__entry(184 __field(dev_t, dev )185 __field(sector_t, sector )186 __field(unsigned int, nr_sector )187 __array(char, rwbs, 6 )188 ),189 190 TP_fast_assign(191 __entry->dev = bio->bi_bdev ? bio_dev(bio) : 0;192 __entry->sector = bio->bi_iter.bi_sector;193 __entry->nr_sector = bio->bi_iter.bi_size >> 9;194 blk_fill_rwbs(__entry->rwbs, bio->bi_opf);195 ),196 197 TP_printk("%d,%d %s %llu + %u",198 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,199 (unsigned long long)__entry->sector, __entry->nr_sector)200);201 202/* fs.c: */203TRACE_EVENT(bch2_sync_fs,204 TP_PROTO(struct super_block *sb, int wait),205 206 TP_ARGS(sb, wait),207 208 TP_STRUCT__entry(209 __field( dev_t, dev )210 __field( int, wait )211 212 ),213 214 TP_fast_assign(215 __entry->dev = sb->s_dev;216 __entry->wait = wait;217 ),218 219 TP_printk("dev %d,%d wait %d",220 MAJOR(__entry->dev), MINOR(__entry->dev),221 __entry->wait)222);223 224/* fs-io.c: */225TRACE_EVENT(bch2_fsync,226 TP_PROTO(struct file *file, int datasync),227 228 TP_ARGS(file, datasync),229 230 TP_STRUCT__entry(231 __field( dev_t, dev )232 __field( ino_t, ino )233 __field( ino_t, parent )234 __field( int, datasync )235 ),236 237 TP_fast_assign(238 struct dentry *dentry = file->f_path.dentry;239 240 __entry->dev = dentry->d_sb->s_dev;241 __entry->ino = d_inode(dentry)->i_ino;242 __entry->parent = d_inode(dentry->d_parent)->i_ino;243 __entry->datasync = datasync;244 ),245 246 TP_printk("dev %d,%d ino %lu parent %lu datasync %d ",247 MAJOR(__entry->dev), MINOR(__entry->dev),248 (unsigned long) __entry->ino,249 (unsigned long) __entry->parent, __entry->datasync)250);251 252/* super-io.c: */253TRACE_EVENT(write_super,254 TP_PROTO(struct bch_fs *c, unsigned long ip),255 TP_ARGS(c, ip),256 257 TP_STRUCT__entry(258 __field(dev_t, dev )259 __field(unsigned long, ip )260 ),261 262 TP_fast_assign(263 __entry->dev = c->dev;264 __entry->ip = ip;265 ),266 267 TP_printk("%d,%d for %pS",268 MAJOR(__entry->dev), MINOR(__entry->dev),269 (void *) __entry->ip)270);271 272/* io.c: */273 274DEFINE_EVENT(bio, read_promote,275 TP_PROTO(struct bio *bio),276 TP_ARGS(bio)277);278 279TRACE_EVENT(read_nopromote,280 TP_PROTO(struct bch_fs *c, int ret),281 TP_ARGS(c, ret),282 283 TP_STRUCT__entry(284 __field(dev_t, dev )285 __array(char, ret, 32 )286 ),287 288 TP_fast_assign(289 __entry->dev = c->dev;290 strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret));291 ),292 293 TP_printk("%d,%d ret %s",294 MAJOR(__entry->dev), MINOR(__entry->dev),295 __entry->ret)296);297 298DEFINE_EVENT(bio, read_bounce,299 TP_PROTO(struct bio *bio),300 TP_ARGS(bio)301);302 303DEFINE_EVENT(bio, read_split,304 TP_PROTO(struct bio *bio),305 TP_ARGS(bio)306);307 308DEFINE_EVENT(bio, read_retry,309 TP_PROTO(struct bio *bio),310 TP_ARGS(bio)311);312 313DEFINE_EVENT(bio, read_reuse_race,314 TP_PROTO(struct bio *bio),315 TP_ARGS(bio)316);317 318/* Journal */319 320DEFINE_EVENT(bch_fs, journal_full,321 TP_PROTO(struct bch_fs *c),322 TP_ARGS(c)323);324 325DEFINE_EVENT(fs_str, journal_entry_full,326 TP_PROTO(struct bch_fs *c, const char *str),327 TP_ARGS(c, str)328);329 330DEFINE_EVENT(fs_str, journal_entry_close,331 TP_PROTO(struct bch_fs *c, const char *str),332 TP_ARGS(c, str)333);334 335DEFINE_EVENT(bio, journal_write,336 TP_PROTO(struct bio *bio),337 TP_ARGS(bio)338);339 340TRACE_EVENT(journal_reclaim_start,341 TP_PROTO(struct bch_fs *c, bool direct, bool kicked,342 u64 min_nr, u64 min_key_cache,343 u64 btree_cache_dirty, u64 btree_cache_total,344 u64 btree_key_cache_dirty, u64 btree_key_cache_total),345 TP_ARGS(c, direct, kicked, min_nr, min_key_cache,346 btree_cache_dirty, btree_cache_total,347 btree_key_cache_dirty, btree_key_cache_total),348 349 TP_STRUCT__entry(350 __field(dev_t, dev )351 __field(bool, direct )352 __field(bool, kicked )353 __field(u64, min_nr )354 __field(u64, min_key_cache )355 __field(u64, btree_cache_dirty )356 __field(u64, btree_cache_total )357 __field(u64, btree_key_cache_dirty )358 __field(u64, btree_key_cache_total )359 ),360 361 TP_fast_assign(362 __entry->dev = c->dev;363 __entry->direct = direct;364 __entry->kicked = kicked;365 __entry->min_nr = min_nr;366 __entry->min_key_cache = min_key_cache;367 __entry->btree_cache_dirty = btree_cache_dirty;368 __entry->btree_cache_total = btree_cache_total;369 __entry->btree_key_cache_dirty = btree_key_cache_dirty;370 __entry->btree_key_cache_total = btree_key_cache_total;371 ),372 373 TP_printk("%d,%d direct %u kicked %u min %llu key cache %llu btree cache %llu/%llu key cache %llu/%llu",374 MAJOR(__entry->dev), MINOR(__entry->dev),375 __entry->direct,376 __entry->kicked,377 __entry->min_nr,378 __entry->min_key_cache,379 __entry->btree_cache_dirty,380 __entry->btree_cache_total,381 __entry->btree_key_cache_dirty,382 __entry->btree_key_cache_total)383);384 385TRACE_EVENT(journal_reclaim_finish,386 TP_PROTO(struct bch_fs *c, u64 nr_flushed),387 TP_ARGS(c, nr_flushed),388 389 TP_STRUCT__entry(390 __field(dev_t, dev )391 __field(u64, nr_flushed )392 ),393 394 TP_fast_assign(395 __entry->dev = c->dev;396 __entry->nr_flushed = nr_flushed;397 ),398 399 TP_printk("%d,%d flushed %llu",400 MAJOR(__entry->dev), MINOR(__entry->dev),401 __entry->nr_flushed)402);403 404/* bset.c: */405 406DEFINE_EVENT(bpos, bkey_pack_pos_fail,407 TP_PROTO(const struct bpos *p),408 TP_ARGS(p)409);410 411/* Btree cache: */412 413TRACE_EVENT(btree_cache_scan,414 TP_PROTO(long nr_to_scan, long can_free, long ret),415 TP_ARGS(nr_to_scan, can_free, ret),416 417 TP_STRUCT__entry(418 __field(long, nr_to_scan )419 __field(long, can_free )420 __field(long, ret )421 ),422 423 TP_fast_assign(424 __entry->nr_to_scan = nr_to_scan;425 __entry->can_free = can_free;426 __entry->ret = ret;427 ),428 429 TP_printk("scanned for %li nodes, can free %li, ret %li",430 __entry->nr_to_scan, __entry->can_free, __entry->ret)431);432 433DEFINE_EVENT(btree_node_nofs, btree_cache_reap,434 TP_PROTO(struct bch_fs *c, struct btree *b),435 TP_ARGS(c, b)436);437 438DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock_fail,439 TP_PROTO(struct btree_trans *trans),440 TP_ARGS(trans)441);442 443DEFINE_EVENT(btree_trans, btree_cache_cannibalize_lock,444 TP_PROTO(struct btree_trans *trans),445 TP_ARGS(trans)446);447 448DEFINE_EVENT(btree_trans, btree_cache_cannibalize,449 TP_PROTO(struct btree_trans *trans),450 TP_ARGS(trans)451);452 453DEFINE_EVENT(btree_trans, btree_cache_cannibalize_unlock,454 TP_PROTO(struct btree_trans *trans),455 TP_ARGS(trans)456);457 458/* Btree */459 460DEFINE_EVENT(btree_node, btree_node_read,461 TP_PROTO(struct btree_trans *trans, struct btree *b),462 TP_ARGS(trans, b)463);464 465TRACE_EVENT(btree_node_write,466 TP_PROTO(struct btree *b, unsigned bytes, unsigned sectors),467 TP_ARGS(b, bytes, sectors),468 469 TP_STRUCT__entry(470 __field(enum btree_node_type, type)471 __field(unsigned, bytes )472 __field(unsigned, sectors )473 ),474 475 TP_fast_assign(476 __entry->type = btree_node_type(b);477 __entry->bytes = bytes;478 __entry->sectors = sectors;479 ),480 481 TP_printk("bkey type %u bytes %u sectors %u",482 __entry->type , __entry->bytes, __entry->sectors)483);484 485DEFINE_EVENT(btree_node, btree_node_alloc,486 TP_PROTO(struct btree_trans *trans, struct btree *b),487 TP_ARGS(trans, b)488);489 490DEFINE_EVENT(btree_node, btree_node_free,491 TP_PROTO(struct btree_trans *trans, struct btree *b),492 TP_ARGS(trans, b)493);494 495TRACE_EVENT(btree_reserve_get_fail,496 TP_PROTO(const char *trans_fn,497 unsigned long caller_ip,498 size_t required,499 int ret),500 TP_ARGS(trans_fn, caller_ip, required, ret),501 502 TP_STRUCT__entry(503 __array(char, trans_fn, 32 )504 __field(unsigned long, caller_ip )505 __field(size_t, required )506 __array(char, ret, 32 )507 ),508 509 TP_fast_assign(510 strscpy(__entry->trans_fn, trans_fn, sizeof(__entry->trans_fn));511 __entry->caller_ip = caller_ip;512 __entry->required = required;513 strscpy(__entry->ret, bch2_err_str(ret), sizeof(__entry->ret));514 ),515 516 TP_printk("%s %pS required %zu ret %s",517 __entry->trans_fn,518 (void *) __entry->caller_ip,519 __entry->required,520 __entry->ret)521);522 523DEFINE_EVENT(btree_node, btree_node_compact,524 TP_PROTO(struct btree_trans *trans, struct btree *b),525 TP_ARGS(trans, b)526);527 528DEFINE_EVENT(btree_node, btree_node_merge,529 TP_PROTO(struct btree_trans *trans, struct btree *b),530 TP_ARGS(trans, b)531);532 533DEFINE_EVENT(btree_node, btree_node_split,534 TP_PROTO(struct btree_trans *trans, struct btree *b),535 TP_ARGS(trans, b)536);537 538DEFINE_EVENT(btree_node, btree_node_rewrite,539 TP_PROTO(struct btree_trans *trans, struct btree *b),540 TP_ARGS(trans, b)541);542 543DEFINE_EVENT(btree_node, btree_node_set_root,544 TP_PROTO(struct btree_trans *trans, struct btree *b),545 TP_ARGS(trans, b)546);547 548TRACE_EVENT(btree_path_relock_fail,549 TP_PROTO(struct btree_trans *trans,550 unsigned long caller_ip,551 struct btree_path *path,552 unsigned level),553 TP_ARGS(trans, caller_ip, path, level),554 555 TP_STRUCT__entry(556 __array(char, trans_fn, 32 )557 __field(unsigned long, caller_ip )558 __field(u8, btree_id )559 __field(u8, level )560 __field(u8, path_idx)561 TRACE_BPOS_entries(pos)562 __array(char, node, 24 )563 __field(u8, self_read_count )564 __field(u8, self_intent_count)565 __field(u8, read_count )566 __field(u8, intent_count )567 __field(u32, iter_lock_seq )568 __field(u32, node_lock_seq )569 ),570 571 TP_fast_assign(572 struct btree *b = btree_path_node(path, level);573 struct six_lock_count c;574 575 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));576 __entry->caller_ip = caller_ip;577 __entry->btree_id = path->btree_id;578 __entry->level = level;579 __entry->path_idx = path - trans->paths;580 TRACE_BPOS_assign(pos, path->pos);581 582 c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level);583 __entry->self_read_count = c.n[SIX_LOCK_read];584 __entry->self_intent_count = c.n[SIX_LOCK_intent];585 586 if (IS_ERR(b)) {587 strscpy(__entry->node, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node));588 } else {589 c = six_lock_counts(&path->l[level].b->c.lock);590 __entry->read_count = c.n[SIX_LOCK_read];591 __entry->intent_count = c.n[SIX_LOCK_intent];592 scnprintf(__entry->node, sizeof(__entry->node), "%px", &b->c);593 }594 __entry->iter_lock_seq = path->l[level].lock_seq;595 __entry->node_lock_seq = is_btree_node(path, level)596 ? six_lock_seq(&path->l[level].b->c.lock)597 : 0;598 ),599 600 TP_printk("%s %pS\nidx %2u btree %s pos %llu:%llu:%u level %u node %s held %u:%u lock count %u:%u iter seq %u lock seq %u",601 __entry->trans_fn,602 (void *) __entry->caller_ip,603 __entry->path_idx,604 bch2_btree_id_str(__entry->btree_id),605 __entry->pos_inode,606 __entry->pos_offset,607 __entry->pos_snapshot,608 __entry->level,609 __entry->node,610 __entry->self_read_count,611 __entry->self_intent_count,612 __entry->read_count,613 __entry->intent_count,614 __entry->iter_lock_seq,615 __entry->node_lock_seq)616);617 618TRACE_EVENT(btree_path_upgrade_fail,619 TP_PROTO(struct btree_trans *trans,620 unsigned long caller_ip,621 struct btree_path *path,622 unsigned level),623 TP_ARGS(trans, caller_ip, path, level),624 625 TP_STRUCT__entry(626 __array(char, trans_fn, 32 )627 __field(unsigned long, caller_ip )628 __field(u8, btree_id )629 __field(u8, level )630 __field(u8, path_idx)631 TRACE_BPOS_entries(pos)632 __field(u8, locked )633 __field(u8, self_read_count )634 __field(u8, self_intent_count)635 __field(u8, read_count )636 __field(u8, intent_count )637 __field(u32, iter_lock_seq )638 __field(u32, node_lock_seq )639 ),640 641 TP_fast_assign(642 struct six_lock_count c;643 644 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));645 __entry->caller_ip = caller_ip;646 __entry->btree_id = path->btree_id;647 __entry->level = level;648 __entry->path_idx = path - trans->paths;649 TRACE_BPOS_assign(pos, path->pos);650 __entry->locked = btree_node_locked(path, level);651 652 c = bch2_btree_node_lock_counts(trans, NULL, &path->l[level].b->c, level),653 __entry->self_read_count = c.n[SIX_LOCK_read];654 __entry->self_intent_count = c.n[SIX_LOCK_intent];655 c = six_lock_counts(&path->l[level].b->c.lock);656 __entry->read_count = c.n[SIX_LOCK_read];657 __entry->intent_count = c.n[SIX_LOCK_intent];658 __entry->iter_lock_seq = path->l[level].lock_seq;659 __entry->node_lock_seq = is_btree_node(path, level)660 ? six_lock_seq(&path->l[level].b->c.lock)661 : 0;662 ),663 664 TP_printk("%s %pS\nidx %2u btree %s pos %llu:%llu:%u level %u locked %u held %u:%u lock count %u:%u iter seq %u lock seq %u",665 __entry->trans_fn,666 (void *) __entry->caller_ip,667 __entry->path_idx,668 bch2_btree_id_str(__entry->btree_id),669 __entry->pos_inode,670 __entry->pos_offset,671 __entry->pos_snapshot,672 __entry->level,673 __entry->locked,674 __entry->self_read_count,675 __entry->self_intent_count,676 __entry->read_count,677 __entry->intent_count,678 __entry->iter_lock_seq,679 __entry->node_lock_seq)680);681 682/* Garbage collection */683 684DEFINE_EVENT(bch_fs, gc_gens_start,685 TP_PROTO(struct bch_fs *c),686 TP_ARGS(c)687);688 689DEFINE_EVENT(bch_fs, gc_gens_end,690 TP_PROTO(struct bch_fs *c),691 TP_ARGS(c)692);693 694/* Allocator */695 696DEFINE_EVENT(fs_str, bucket_alloc,697 TP_PROTO(struct bch_fs *c, const char *str),698 TP_ARGS(c, str)699);700 701DEFINE_EVENT(fs_str, bucket_alloc_fail,702 TP_PROTO(struct bch_fs *c, const char *str),703 TP_ARGS(c, str)704);705 706TRACE_EVENT(discard_buckets,707 TP_PROTO(struct bch_fs *c, u64 seen, u64 open,708 u64 need_journal_commit, u64 discarded, const char *err),709 TP_ARGS(c, seen, open, need_journal_commit, discarded, err),710 711 TP_STRUCT__entry(712 __field(dev_t, dev )713 __field(u64, seen )714 __field(u64, open )715 __field(u64, need_journal_commit )716 __field(u64, discarded )717 __array(char, err, 16 )718 ),719 720 TP_fast_assign(721 __entry->dev = c->dev;722 __entry->seen = seen;723 __entry->open = open;724 __entry->need_journal_commit = need_journal_commit;725 __entry->discarded = discarded;726 strscpy(__entry->err, err, sizeof(__entry->err));727 ),728 729 TP_printk("%d%d seen %llu open %llu need_journal_commit %llu discarded %llu err %s",730 MAJOR(__entry->dev), MINOR(__entry->dev),731 __entry->seen,732 __entry->open,733 __entry->need_journal_commit,734 __entry->discarded,735 __entry->err)736);737 738TRACE_EVENT(bucket_invalidate,739 TP_PROTO(struct bch_fs *c, unsigned dev, u64 bucket, u32 sectors),740 TP_ARGS(c, dev, bucket, sectors),741 742 TP_STRUCT__entry(743 __field(dev_t, dev )744 __field(u32, dev_idx )745 __field(u32, sectors )746 __field(u64, bucket )747 ),748 749 TP_fast_assign(750 __entry->dev = c->dev;751 __entry->dev_idx = dev;752 __entry->sectors = sectors;753 __entry->bucket = bucket;754 ),755 756 TP_printk("%d:%d invalidated %u:%llu cached sectors %u",757 MAJOR(__entry->dev), MINOR(__entry->dev),758 __entry->dev_idx, __entry->bucket,759 __entry->sectors)760);761 762/* Moving IO */763 764TRACE_EVENT(bucket_evacuate,765 TP_PROTO(struct bch_fs *c, struct bpos *bucket),766 TP_ARGS(c, bucket),767 768 TP_STRUCT__entry(769 __field(dev_t, dev )770 __field(u32, dev_idx )771 __field(u64, bucket )772 ),773 774 TP_fast_assign(775 __entry->dev = c->dev;776 __entry->dev_idx = bucket->inode;777 __entry->bucket = bucket->offset;778 ),779 780 TP_printk("%d:%d %u:%llu",781 MAJOR(__entry->dev), MINOR(__entry->dev),782 __entry->dev_idx, __entry->bucket)783);784 785DEFINE_EVENT(fs_str, move_extent,786 TP_PROTO(struct bch_fs *c, const char *str),787 TP_ARGS(c, str)788);789 790DEFINE_EVENT(fs_str, move_extent_read,791 TP_PROTO(struct bch_fs *c, const char *str),792 TP_ARGS(c, str)793);794 795DEFINE_EVENT(fs_str, move_extent_write,796 TP_PROTO(struct bch_fs *c, const char *str),797 TP_ARGS(c, str)798);799 800DEFINE_EVENT(fs_str, move_extent_finish,801 TP_PROTO(struct bch_fs *c, const char *str),802 TP_ARGS(c, str)803);804 805DEFINE_EVENT(fs_str, move_extent_fail,806 TP_PROTO(struct bch_fs *c, const char *str),807 TP_ARGS(c, str)808);809 810DEFINE_EVENT(fs_str, move_extent_start_fail,811 TP_PROTO(struct bch_fs *c, const char *str),812 TP_ARGS(c, str)813);814 815TRACE_EVENT(move_data,816 TP_PROTO(struct bch_fs *c,817 struct bch_move_stats *stats),818 TP_ARGS(c, stats),819 820 TP_STRUCT__entry(821 __field(dev_t, dev )822 __field(u64, keys_moved )823 __field(u64, keys_raced )824 __field(u64, sectors_seen )825 __field(u64, sectors_moved )826 __field(u64, sectors_raced )827 ),828 829 TP_fast_assign(830 __entry->dev = c->dev;831 __entry->keys_moved = atomic64_read(&stats->keys_moved);832 __entry->keys_raced = atomic64_read(&stats->keys_raced);833 __entry->sectors_seen = atomic64_read(&stats->sectors_seen);834 __entry->sectors_moved = atomic64_read(&stats->sectors_moved);835 __entry->sectors_raced = atomic64_read(&stats->sectors_raced);836 ),837 838 TP_printk("%d,%d keys moved %llu raced %llu"839 "sectors seen %llu moved %llu raced %llu",840 MAJOR(__entry->dev), MINOR(__entry->dev),841 __entry->keys_moved,842 __entry->keys_raced,843 __entry->sectors_seen,844 __entry->sectors_moved,845 __entry->sectors_raced)846);847 848TRACE_EVENT(evacuate_bucket,849 TP_PROTO(struct bch_fs *c, struct bpos *bucket,850 unsigned sectors, unsigned bucket_size,851 u64 fragmentation, int ret),852 TP_ARGS(c, bucket, sectors, bucket_size, fragmentation, ret),853 854 TP_STRUCT__entry(855 __field(dev_t, dev )856 __field(u64, member )857 __field(u64, bucket )858 __field(u32, sectors )859 __field(u32, bucket_size )860 __field(u64, fragmentation )861 __field(int, ret )862 ),863 864 TP_fast_assign(865 __entry->dev = c->dev;866 __entry->member = bucket->inode;867 __entry->bucket = bucket->offset;868 __entry->sectors = sectors;869 __entry->bucket_size = bucket_size;870 __entry->fragmentation = fragmentation;871 __entry->ret = ret;872 ),873 874 TP_printk("%d,%d %llu:%llu sectors %u/%u fragmentation %llu ret %i",875 MAJOR(__entry->dev), MINOR(__entry->dev),876 __entry->member, __entry->bucket,877 __entry->sectors, __entry->bucket_size,878 __entry->fragmentation, __entry->ret)879);880 881TRACE_EVENT(copygc,882 TP_PROTO(struct bch_fs *c,883 u64 sectors_moved, u64 sectors_not_moved,884 u64 buckets_moved, u64 buckets_not_moved),885 TP_ARGS(c,886 sectors_moved, sectors_not_moved,887 buckets_moved, buckets_not_moved),888 889 TP_STRUCT__entry(890 __field(dev_t, dev )891 __field(u64, sectors_moved )892 __field(u64, sectors_not_moved )893 __field(u64, buckets_moved )894 __field(u64, buckets_not_moved )895 ),896 897 TP_fast_assign(898 __entry->dev = c->dev;899 __entry->sectors_moved = sectors_moved;900 __entry->sectors_not_moved = sectors_not_moved;901 __entry->buckets_moved = buckets_moved;902 __entry->buckets_not_moved = buckets_moved;903 ),904 905 TP_printk("%d,%d sectors moved %llu remain %llu buckets moved %llu remain %llu",906 MAJOR(__entry->dev), MINOR(__entry->dev),907 __entry->sectors_moved, __entry->sectors_not_moved,908 __entry->buckets_moved, __entry->buckets_not_moved)909);910 911TRACE_EVENT(copygc_wait,912 TP_PROTO(struct bch_fs *c,913 u64 wait_amount, u64 until),914 TP_ARGS(c, wait_amount, until),915 916 TP_STRUCT__entry(917 __field(dev_t, dev )918 __field(u64, wait_amount )919 __field(u64, until )920 ),921 922 TP_fast_assign(923 __entry->dev = c->dev;924 __entry->wait_amount = wait_amount;925 __entry->until = until;926 ),927 928 TP_printk("%d,%u waiting for %llu sectors until %llu",929 MAJOR(__entry->dev), MINOR(__entry->dev),930 __entry->wait_amount, __entry->until)931);932 933/* btree transactions: */934 935DECLARE_EVENT_CLASS(transaction_event,936 TP_PROTO(struct btree_trans *trans,937 unsigned long caller_ip),938 TP_ARGS(trans, caller_ip),939 940 TP_STRUCT__entry(941 __array(char, trans_fn, 32 )942 __field(unsigned long, caller_ip )943 ),944 945 TP_fast_assign(946 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));947 __entry->caller_ip = caller_ip;948 ),949 950 TP_printk("%s %pS", __entry->trans_fn, (void *) __entry->caller_ip)951);952 953DEFINE_EVENT(transaction_event, transaction_commit,954 TP_PROTO(struct btree_trans *trans,955 unsigned long caller_ip),956 TP_ARGS(trans, caller_ip)957);958 959DEFINE_EVENT(transaction_event, trans_restart_injected,960 TP_PROTO(struct btree_trans *trans,961 unsigned long caller_ip),962 TP_ARGS(trans, caller_ip)963);964 965TRACE_EVENT(trans_restart_split_race,966 TP_PROTO(struct btree_trans *trans,967 unsigned long caller_ip,968 struct btree *b),969 TP_ARGS(trans, caller_ip, b),970 971 TP_STRUCT__entry(972 __array(char, trans_fn, 32 )973 __field(unsigned long, caller_ip )974 __field(u8, level )975 __field(u16, written )976 __field(u16, blocks )977 __field(u16, u64s_remaining )978 ),979 980 TP_fast_assign(981 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));982 __entry->caller_ip = caller_ip;983 __entry->level = b->c.level;984 __entry->written = b->written;985 __entry->blocks = btree_blocks(trans->c);986 __entry->u64s_remaining = bch2_btree_keys_u64s_remaining(b);987 ),988 989 TP_printk("%s %pS l=%u written %u/%u u64s remaining %u",990 __entry->trans_fn, (void *) __entry->caller_ip,991 __entry->level,992 __entry->written, __entry->blocks,993 __entry->u64s_remaining)994);995 996TRACE_EVENT(trans_blocked_journal_reclaim,997 TP_PROTO(struct btree_trans *trans,998 unsigned long caller_ip),999 TP_ARGS(trans, caller_ip),1000 1001 TP_STRUCT__entry(1002 __array(char, trans_fn, 32 )1003 __field(unsigned long, caller_ip )1004 1005 __field(unsigned long, key_cache_nr_keys )1006 __field(unsigned long, key_cache_nr_dirty )1007 __field(long, must_wait )1008 ),1009 1010 TP_fast_assign(1011 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1012 __entry->caller_ip = caller_ip;1013 __entry->key_cache_nr_keys = atomic_long_read(&trans->c->btree_key_cache.nr_keys);1014 __entry->key_cache_nr_dirty = atomic_long_read(&trans->c->btree_key_cache.nr_dirty);1015 __entry->must_wait = __bch2_btree_key_cache_must_wait(trans->c);1016 ),1017 1018 TP_printk("%s %pS key cache keys %lu dirty %lu must_wait %li",1019 __entry->trans_fn, (void *) __entry->caller_ip,1020 __entry->key_cache_nr_keys,1021 __entry->key_cache_nr_dirty,1022 __entry->must_wait)1023);1024 1025TRACE_EVENT(trans_restart_journal_preres_get,1026 TP_PROTO(struct btree_trans *trans,1027 unsigned long caller_ip,1028 unsigned flags),1029 TP_ARGS(trans, caller_ip, flags),1030 1031 TP_STRUCT__entry(1032 __array(char, trans_fn, 32 )1033 __field(unsigned long, caller_ip )1034 __field(unsigned, flags )1035 ),1036 1037 TP_fast_assign(1038 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1039 __entry->caller_ip = caller_ip;1040 __entry->flags = flags;1041 ),1042 1043 TP_printk("%s %pS %x", __entry->trans_fn,1044 (void *) __entry->caller_ip,1045 __entry->flags)1046);1047 1048DEFINE_EVENT(transaction_event, trans_restart_fault_inject,1049 TP_PROTO(struct btree_trans *trans,1050 unsigned long caller_ip),1051 TP_ARGS(trans, caller_ip)1052);1053 1054DEFINE_EVENT(transaction_event, trans_traverse_all,1055 TP_PROTO(struct btree_trans *trans,1056 unsigned long caller_ip),1057 TP_ARGS(trans, caller_ip)1058);1059 1060DEFINE_EVENT(transaction_event, trans_restart_key_cache_raced,1061 TP_PROTO(struct btree_trans *trans,1062 unsigned long caller_ip),1063 TP_ARGS(trans, caller_ip)1064);1065 1066DEFINE_EVENT(trans_str, trans_restart_too_many_iters,1067 TP_PROTO(struct btree_trans *trans,1068 unsigned long caller_ip,1069 const char *paths),1070 TP_ARGS(trans, caller_ip, paths)1071);1072 1073DECLARE_EVENT_CLASS(transaction_restart_iter,1074 TP_PROTO(struct btree_trans *trans,1075 unsigned long caller_ip,1076 struct btree_path *path),1077 TP_ARGS(trans, caller_ip, path),1078 1079 TP_STRUCT__entry(1080 __array(char, trans_fn, 32 )1081 __field(unsigned long, caller_ip )1082 __field(u8, btree_id )1083 TRACE_BPOS_entries(pos)1084 ),1085 1086 TP_fast_assign(1087 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1088 __entry->caller_ip = caller_ip;1089 __entry->btree_id = path->btree_id;1090 TRACE_BPOS_assign(pos, path->pos)1091 ),1092 1093 TP_printk("%s %pS btree %s pos %llu:%llu:%u",1094 __entry->trans_fn,1095 (void *) __entry->caller_ip,1096 bch2_btree_id_str(__entry->btree_id),1097 __entry->pos_inode,1098 __entry->pos_offset,1099 __entry->pos_snapshot)1100);1101 1102DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_reused,1103 TP_PROTO(struct btree_trans *trans,1104 unsigned long caller_ip,1105 struct btree_path *path),1106 TP_ARGS(trans, caller_ip, path)1107);1108 1109DEFINE_EVENT(transaction_restart_iter, trans_restart_btree_node_split,1110 TP_PROTO(struct btree_trans *trans,1111 unsigned long caller_ip,1112 struct btree_path *path),1113 TP_ARGS(trans, caller_ip, path)1114);1115 1116TRACE_EVENT(trans_restart_upgrade,1117 TP_PROTO(struct btree_trans *trans,1118 unsigned long caller_ip,1119 struct btree_path *path,1120 unsigned old_locks_want,1121 unsigned new_locks_want,1122 struct get_locks_fail *f),1123 TP_ARGS(trans, caller_ip, path, old_locks_want, new_locks_want, f),1124 1125 TP_STRUCT__entry(1126 __array(char, trans_fn, 32 )1127 __field(unsigned long, caller_ip )1128 __field(u8, btree_id )1129 __field(u8, old_locks_want )1130 __field(u8, new_locks_want )1131 __field(u8, level )1132 __field(u32, path_seq )1133 __field(u32, node_seq )1134 TRACE_BPOS_entries(pos)1135 ),1136 1137 TP_fast_assign(1138 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1139 __entry->caller_ip = caller_ip;1140 __entry->btree_id = path->btree_id;1141 __entry->old_locks_want = old_locks_want;1142 __entry->new_locks_want = new_locks_want;1143 __entry->level = f->l;1144 __entry->path_seq = path->l[f->l].lock_seq;1145 __entry->node_seq = IS_ERR_OR_NULL(f->b) ? 0 : f->b->c.lock.seq;1146 TRACE_BPOS_assign(pos, path->pos)1147 ),1148 1149 TP_printk("%s %pS btree %s pos %llu:%llu:%u locks_want %u -> %u level %u path seq %u node seq %u",1150 __entry->trans_fn,1151 (void *) __entry->caller_ip,1152 bch2_btree_id_str(__entry->btree_id),1153 __entry->pos_inode,1154 __entry->pos_offset,1155 __entry->pos_snapshot,1156 __entry->old_locks_want,1157 __entry->new_locks_want,1158 __entry->level,1159 __entry->path_seq,1160 __entry->node_seq)1161);1162 1163DEFINE_EVENT(trans_str, trans_restart_relock,1164 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip, const char *str),1165 TP_ARGS(trans, caller_ip, str)1166);1167 1168DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_next_node,1169 TP_PROTO(struct btree_trans *trans,1170 unsigned long caller_ip,1171 struct btree_path *path),1172 TP_ARGS(trans, caller_ip, path)1173);1174 1175DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_parent_for_fill,1176 TP_PROTO(struct btree_trans *trans,1177 unsigned long caller_ip,1178 struct btree_path *path),1179 TP_ARGS(trans, caller_ip, path)1180);1181 1182DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_after_fill,1183 TP_PROTO(struct btree_trans *trans,1184 unsigned long caller_ip,1185 struct btree_path *path),1186 TP_ARGS(trans, caller_ip, path)1187);1188 1189DEFINE_EVENT(transaction_event, trans_restart_key_cache_upgrade,1190 TP_PROTO(struct btree_trans *trans,1191 unsigned long caller_ip),1192 TP_ARGS(trans, caller_ip)1193);1194 1195DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_key_cache_fill,1196 TP_PROTO(struct btree_trans *trans,1197 unsigned long caller_ip,1198 struct btree_path *path),1199 TP_ARGS(trans, caller_ip, path)1200);1201 1202DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path,1203 TP_PROTO(struct btree_trans *trans,1204 unsigned long caller_ip,1205 struct btree_path *path),1206 TP_ARGS(trans, caller_ip, path)1207);1208 1209DEFINE_EVENT(transaction_restart_iter, trans_restart_relock_path_intent,1210 TP_PROTO(struct btree_trans *trans,1211 unsigned long caller_ip,1212 struct btree_path *path),1213 TP_ARGS(trans, caller_ip, path)1214);1215 1216DEFINE_EVENT(transaction_restart_iter, trans_restart_traverse,1217 TP_PROTO(struct btree_trans *trans,1218 unsigned long caller_ip,1219 struct btree_path *path),1220 TP_ARGS(trans, caller_ip, path)1221);1222 1223DEFINE_EVENT(transaction_restart_iter, trans_restart_memory_allocation_failure,1224 TP_PROTO(struct btree_trans *trans,1225 unsigned long caller_ip,1226 struct btree_path *path),1227 TP_ARGS(trans, caller_ip, path)1228);1229 1230DEFINE_EVENT(trans_str_nocaller, trans_restart_would_deadlock,1231 TP_PROTO(struct btree_trans *trans,1232 const char *cycle),1233 TP_ARGS(trans, cycle)1234);1235 1236DEFINE_EVENT(transaction_event, trans_restart_would_deadlock_recursion_limit,1237 TP_PROTO(struct btree_trans *trans,1238 unsigned long caller_ip),1239 TP_ARGS(trans, caller_ip)1240);1241 1242TRACE_EVENT(trans_restart_would_deadlock_write,1243 TP_PROTO(struct btree_trans *trans),1244 TP_ARGS(trans),1245 1246 TP_STRUCT__entry(1247 __array(char, trans_fn, 32 )1248 ),1249 1250 TP_fast_assign(1251 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1252 ),1253 1254 TP_printk("%s", __entry->trans_fn)1255);1256 1257TRACE_EVENT(trans_restart_mem_realloced,1258 TP_PROTO(struct btree_trans *trans,1259 unsigned long caller_ip,1260 unsigned long bytes),1261 TP_ARGS(trans, caller_ip, bytes),1262 1263 TP_STRUCT__entry(1264 __array(char, trans_fn, 32 )1265 __field(unsigned long, caller_ip )1266 __field(unsigned long, bytes )1267 ),1268 1269 TP_fast_assign(1270 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1271 __entry->caller_ip = caller_ip;1272 __entry->bytes = bytes;1273 ),1274 1275 TP_printk("%s %pS bytes %lu",1276 __entry->trans_fn,1277 (void *) __entry->caller_ip,1278 __entry->bytes)1279);1280 1281TRACE_EVENT(trans_restart_key_cache_key_realloced,1282 TP_PROTO(struct btree_trans *trans,1283 unsigned long caller_ip,1284 struct btree_path *path,1285 unsigned old_u64s,1286 unsigned new_u64s),1287 TP_ARGS(trans, caller_ip, path, old_u64s, new_u64s),1288 1289 TP_STRUCT__entry(1290 __array(char, trans_fn, 32 )1291 __field(unsigned long, caller_ip )1292 __field(enum btree_id, btree_id )1293 TRACE_BPOS_entries(pos)1294 __field(u32, old_u64s )1295 __field(u32, new_u64s )1296 ),1297 1298 TP_fast_assign(1299 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1300 __entry->caller_ip = caller_ip;1301 1302 __entry->btree_id = path->btree_id;1303 TRACE_BPOS_assign(pos, path->pos);1304 __entry->old_u64s = old_u64s;1305 __entry->new_u64s = new_u64s;1306 ),1307 1308 TP_printk("%s %pS btree %s pos %llu:%llu:%u old_u64s %u new_u64s %u",1309 __entry->trans_fn,1310 (void *) __entry->caller_ip,1311 bch2_btree_id_str(__entry->btree_id),1312 __entry->pos_inode,1313 __entry->pos_offset,1314 __entry->pos_snapshot,1315 __entry->old_u64s,1316 __entry->new_u64s)1317);1318 1319TRACE_EVENT(path_downgrade,1320 TP_PROTO(struct btree_trans *trans,1321 unsigned long caller_ip,1322 struct btree_path *path,1323 unsigned old_locks_want),1324 TP_ARGS(trans, caller_ip, path, old_locks_want),1325 1326 TP_STRUCT__entry(1327 __array(char, trans_fn, 32 )1328 __field(unsigned long, caller_ip )1329 __field(unsigned, old_locks_want )1330 __field(unsigned, new_locks_want )1331 __field(unsigned, btree )1332 TRACE_BPOS_entries(pos)1333 ),1334 1335 TP_fast_assign(1336 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1337 __entry->caller_ip = caller_ip;1338 __entry->old_locks_want = old_locks_want;1339 __entry->new_locks_want = path->locks_want;1340 __entry->btree = path->btree_id;1341 TRACE_BPOS_assign(pos, path->pos);1342 ),1343 1344 TP_printk("%s %pS locks_want %u -> %u %s %llu:%llu:%u",1345 __entry->trans_fn,1346 (void *) __entry->caller_ip,1347 __entry->old_locks_want,1348 __entry->new_locks_want,1349 bch2_btree_id_str(__entry->btree),1350 __entry->pos_inode,1351 __entry->pos_offset,1352 __entry->pos_snapshot)1353);1354 1355DEFINE_EVENT(transaction_event, trans_restart_write_buffer_flush,1356 TP_PROTO(struct btree_trans *trans,1357 unsigned long caller_ip),1358 TP_ARGS(trans, caller_ip)1359);1360 1361TRACE_EVENT(write_buffer_flush,1362 TP_PROTO(struct btree_trans *trans, size_t nr, size_t skipped, size_t fast, size_t size),1363 TP_ARGS(trans, nr, skipped, fast, size),1364 1365 TP_STRUCT__entry(1366 __field(size_t, nr )1367 __field(size_t, skipped )1368 __field(size_t, fast )1369 __field(size_t, size )1370 ),1371 1372 TP_fast_assign(1373 __entry->nr = nr;1374 __entry->skipped = skipped;1375 __entry->fast = fast;1376 __entry->size = size;1377 ),1378 1379 TP_printk("%zu/%zu skipped %zu fast %zu",1380 __entry->nr, __entry->size, __entry->skipped, __entry->fast)1381);1382 1383TRACE_EVENT(write_buffer_flush_sync,1384 TP_PROTO(struct btree_trans *trans, unsigned long caller_ip),1385 TP_ARGS(trans, caller_ip),1386 1387 TP_STRUCT__entry(1388 __array(char, trans_fn, 32 )1389 __field(unsigned long, caller_ip )1390 ),1391 1392 TP_fast_assign(1393 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1394 __entry->caller_ip = caller_ip;1395 ),1396 1397 TP_printk("%s %pS", __entry->trans_fn, (void *) __entry->caller_ip)1398);1399 1400TRACE_EVENT(write_buffer_flush_slowpath,1401 TP_PROTO(struct btree_trans *trans, size_t slowpath, size_t total),1402 TP_ARGS(trans, slowpath, total),1403 1404 TP_STRUCT__entry(1405 __field(size_t, slowpath )1406 __field(size_t, total )1407 ),1408 1409 TP_fast_assign(1410 __entry->slowpath = slowpath;1411 __entry->total = total;1412 ),1413 1414 TP_printk("%zu/%zu", __entry->slowpath, __entry->total)1415);1416 1417DEFINE_EVENT(fs_str, rebalance_extent,1418 TP_PROTO(struct bch_fs *c, const char *str),1419 TP_ARGS(c, str)1420);1421 1422DEFINE_EVENT(fs_str, data_update,1423 TP_PROTO(struct bch_fs *c, const char *str),1424 TP_ARGS(c, str)1425);1426 1427TRACE_EVENT(error_downcast,1428 TP_PROTO(int bch_err, int std_err, unsigned long ip),1429 TP_ARGS(bch_err, std_err, ip),1430 1431 TP_STRUCT__entry(1432 __array(char, bch_err, 32 )1433 __array(char, std_err, 32 )1434 __array(char, ip, 32 )1435 ),1436 1437 TP_fast_assign(1438 strscpy(__entry->bch_err, bch2_err_str(bch_err), sizeof(__entry->bch_err));1439 strscpy(__entry->std_err, bch2_err_str(std_err), sizeof(__entry->std_err));1440 snprintf(__entry->ip, sizeof(__entry->ip), "%ps", (void *) ip);1441 ),1442 1443 TP_printk("%s -> %s %s", __entry->bch_err, __entry->std_err, __entry->ip)1444);1445 1446#ifdef CONFIG_BCACHEFS_PATH_TRACEPOINTS1447 1448TRACE_EVENT(update_by_path,1449 TP_PROTO(struct btree_trans *trans, struct btree_path *path,1450 struct btree_insert_entry *i, bool overwrite),1451 TP_ARGS(trans, path, i, overwrite),1452 1453 TP_STRUCT__entry(1454 __array(char, trans_fn, 32 )1455 __field(btree_path_idx_t, path_idx )1456 __field(u8, btree_id )1457 TRACE_BPOS_entries(pos)1458 __field(u8, overwrite )1459 __field(btree_path_idx_t, update_idx )1460 __field(btree_path_idx_t, nr_updates )1461 ),1462 1463 TP_fast_assign(1464 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1465 __entry->path_idx = path - trans->paths;1466 __entry->btree_id = path->btree_id;1467 TRACE_BPOS_assign(pos, path->pos);1468 __entry->overwrite = overwrite;1469 __entry->update_idx = i - trans->updates;1470 __entry->nr_updates = trans->nr_updates;1471 ),1472 1473 TP_printk("%s path %3u btree %s pos %llu:%llu:%u overwrite %u update %u/%u",1474 __entry->trans_fn,1475 __entry->path_idx,1476 bch2_btree_id_str(__entry->btree_id),1477 __entry->pos_inode,1478 __entry->pos_offset,1479 __entry->pos_snapshot,1480 __entry->overwrite,1481 __entry->update_idx,1482 __entry->nr_updates)1483);1484 1485TRACE_EVENT(btree_path_lock,1486 TP_PROTO(struct btree_trans *trans,1487 unsigned long caller_ip,1488 struct btree_bkey_cached_common *b),1489 TP_ARGS(trans, caller_ip, b),1490 1491 TP_STRUCT__entry(1492 __array(char, trans_fn, 32 )1493 __field(unsigned long, caller_ip )1494 __field(u8, btree_id )1495 __field(u8, level )1496 __array(char, node, 24 )1497 __field(u32, lock_seq )1498 ),1499 1500 TP_fast_assign(1501 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1502 __entry->caller_ip = caller_ip;1503 __entry->btree_id = b->btree_id;1504 __entry->level = b->level;1505 1506 scnprintf(__entry->node, sizeof(__entry->node), "%px", b);1507 __entry->lock_seq = six_lock_seq(&b->lock);1508 ),1509 1510 TP_printk("%s %pS\nbtree %s level %u node %s lock seq %u",1511 __entry->trans_fn,1512 (void *) __entry->caller_ip,1513 bch2_btree_id_str(__entry->btree_id),1514 __entry->level,1515 __entry->node,1516 __entry->lock_seq)1517);1518 1519DECLARE_EVENT_CLASS(btree_path_ev,1520 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1521 TP_ARGS(trans, path),1522 1523 TP_STRUCT__entry(1524 __field(u16, idx )1525 __field(u8, ref )1526 __field(u8, btree_id )1527 TRACE_BPOS_entries(pos)1528 ),1529 1530 TP_fast_assign(1531 __entry->idx = path - trans->paths;1532 __entry->ref = path->ref;1533 __entry->btree_id = path->btree_id;1534 TRACE_BPOS_assign(pos, path->pos);1535 ),1536 1537 TP_printk("path %3u ref %u btree %s pos %llu:%llu:%u",1538 __entry->idx, __entry->ref,1539 bch2_btree_id_str(__entry->btree_id),1540 __entry->pos_inode,1541 __entry->pos_offset,1542 __entry->pos_snapshot)1543);1544 1545DEFINE_EVENT(btree_path_ev, btree_path_get_ll,1546 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1547 TP_ARGS(trans, path)1548);1549 1550DEFINE_EVENT(btree_path_ev, btree_path_put_ll,1551 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1552 TP_ARGS(trans, path)1553);1554 1555DEFINE_EVENT(btree_path_ev, btree_path_should_be_locked,1556 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1557 TP_ARGS(trans, path)1558);1559 1560TRACE_EVENT(btree_path_alloc,1561 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1562 TP_ARGS(trans, path),1563 1564 TP_STRUCT__entry(1565 __field(btree_path_idx_t, idx )1566 __field(u8, locks_want )1567 __field(u8, btree_id )1568 TRACE_BPOS_entries(pos)1569 ),1570 1571 TP_fast_assign(1572 __entry->idx = path - trans->paths;1573 __entry->locks_want = path->locks_want;1574 __entry->btree_id = path->btree_id;1575 TRACE_BPOS_assign(pos, path->pos);1576 ),1577 1578 TP_printk("path %3u btree %s locks_want %u pos %llu:%llu:%u",1579 __entry->idx,1580 bch2_btree_id_str(__entry->btree_id),1581 __entry->locks_want,1582 __entry->pos_inode,1583 __entry->pos_offset,1584 __entry->pos_snapshot)1585);1586 1587TRACE_EVENT(btree_path_get,1588 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos),1589 TP_ARGS(trans, path, new_pos),1590 1591 TP_STRUCT__entry(1592 __field(btree_path_idx_t, idx )1593 __field(u8, ref )1594 __field(u8, preserve )1595 __field(u8, locks_want )1596 __field(u8, btree_id )1597 TRACE_BPOS_entries(old_pos)1598 TRACE_BPOS_entries(new_pos)1599 ),1600 1601 TP_fast_assign(1602 __entry->idx = path - trans->paths;1603 __entry->ref = path->ref;1604 __entry->preserve = path->preserve;1605 __entry->locks_want = path->locks_want;1606 __entry->btree_id = path->btree_id;1607 TRACE_BPOS_assign(old_pos, path->pos);1608 TRACE_BPOS_assign(new_pos, *new_pos);1609 ),1610 1611 TP_printk(" path %3u ref %u preserve %u btree %s locks_want %u pos %llu:%llu:%u -> %llu:%llu:%u",1612 __entry->idx,1613 __entry->ref,1614 __entry->preserve,1615 bch2_btree_id_str(__entry->btree_id),1616 __entry->locks_want,1617 __entry->old_pos_inode,1618 __entry->old_pos_offset,1619 __entry->old_pos_snapshot,1620 __entry->new_pos_inode,1621 __entry->new_pos_offset,1622 __entry->new_pos_snapshot)1623);1624 1625DECLARE_EVENT_CLASS(btree_path_clone,1626 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),1627 TP_ARGS(trans, path, new),1628 1629 TP_STRUCT__entry(1630 __field(btree_path_idx_t, idx )1631 __field(u8, new_idx )1632 __field(u8, btree_id )1633 __field(u8, ref )1634 __field(u8, preserve )1635 TRACE_BPOS_entries(pos)1636 ),1637 1638 TP_fast_assign(1639 __entry->idx = path - trans->paths;1640 __entry->new_idx = new - trans->paths;1641 __entry->btree_id = path->btree_id;1642 __entry->ref = path->ref;1643 __entry->preserve = path->preserve;1644 TRACE_BPOS_assign(pos, path->pos);1645 ),1646 1647 TP_printk(" path %3u ref %u preserve %u btree %s %llu:%llu:%u -> %u",1648 __entry->idx,1649 __entry->ref,1650 __entry->preserve,1651 bch2_btree_id_str(__entry->btree_id),1652 __entry->pos_inode,1653 __entry->pos_offset,1654 __entry->pos_snapshot,1655 __entry->new_idx)1656);1657 1658DEFINE_EVENT(btree_path_clone, btree_path_clone,1659 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),1660 TP_ARGS(trans, path, new)1661);1662 1663DEFINE_EVENT(btree_path_clone, btree_path_save_pos,1664 TP_PROTO(struct btree_trans *trans, struct btree_path *path, struct btree_path *new),1665 TP_ARGS(trans, path, new)1666);1667 1668DECLARE_EVENT_CLASS(btree_path_traverse,1669 TP_PROTO(struct btree_trans *trans,1670 struct btree_path *path),1671 TP_ARGS(trans, path),1672 1673 TP_STRUCT__entry(1674 __array(char, trans_fn, 32 )1675 __field(btree_path_idx_t, idx )1676 __field(u8, ref )1677 __field(u8, preserve )1678 __field(u8, should_be_locked )1679 __field(u8, btree_id )1680 __field(u8, level )1681 TRACE_BPOS_entries(pos)1682 __field(u8, locks_want )1683 __field(u8, nodes_locked )1684 __array(char, node0, 24 )1685 __array(char, node1, 24 )1686 __array(char, node2, 24 )1687 __array(char, node3, 24 )1688 ),1689 1690 TP_fast_assign(1691 strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));1692 1693 __entry->idx = path - trans->paths;1694 __entry->ref = path->ref;1695 __entry->preserve = path->preserve;1696 __entry->btree_id = path->btree_id;1697 __entry->level = path->level;1698 TRACE_BPOS_assign(pos, path->pos);1699 1700 __entry->locks_want = path->locks_want;1701 __entry->nodes_locked = path->nodes_locked;1702 struct btree *b = path->l[0].b;1703 if (IS_ERR(b))1704 strscpy(__entry->node0, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1705 else1706 scnprintf(__entry->node0, sizeof(__entry->node0), "%px", &b->c);1707 b = path->l[1].b;1708 if (IS_ERR(b))1709 strscpy(__entry->node1, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1710 else1711 scnprintf(__entry->node1, sizeof(__entry->node0), "%px", &b->c);1712 b = path->l[2].b;1713 if (IS_ERR(b))1714 strscpy(__entry->node2, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1715 else1716 scnprintf(__entry->node2, sizeof(__entry->node0), "%px", &b->c);1717 b = path->l[3].b;1718 if (IS_ERR(b))1719 strscpy(__entry->node3, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1720 else1721 scnprintf(__entry->node3, sizeof(__entry->node0), "%px", &b->c);1722 ),1723 1724 TP_printk("%s\npath %3u ref %u preserve %u btree %s %llu:%llu:%u level %u locks_want %u\n"1725 "locks %u %u %u %u node %s %s %s %s",1726 __entry->trans_fn,1727 __entry->idx,1728 __entry->ref,1729 __entry->preserve,1730 bch2_btree_id_str(__entry->btree_id),1731 __entry->pos_inode,1732 __entry->pos_offset,1733 __entry->pos_snapshot,1734 __entry->level,1735 __entry->locks_want,1736 (__entry->nodes_locked >> 6) & 3,1737 (__entry->nodes_locked >> 4) & 3,1738 (__entry->nodes_locked >> 2) & 3,1739 (__entry->nodes_locked >> 0) & 3,1740 __entry->node3,1741 __entry->node2,1742 __entry->node1,1743 __entry->node0)1744);1745 1746DEFINE_EVENT(btree_path_traverse, btree_path_traverse_start,1747 TP_PROTO(struct btree_trans *trans,1748 struct btree_path *path),1749 TP_ARGS(trans, path)1750);1751 1752DEFINE_EVENT(btree_path_traverse, btree_path_traverse_end,1753 TP_PROTO(struct btree_trans *trans, struct btree_path *path),1754 TP_ARGS(trans, path)1755);1756 1757TRACE_EVENT(btree_path_set_pos,1758 TP_PROTO(struct btree_trans *trans,1759 struct btree_path *path,1760 struct bpos *new_pos),1761 TP_ARGS(trans, path, new_pos),1762 1763 TP_STRUCT__entry(1764 __field(btree_path_idx_t, idx )1765 __field(u8, ref )1766 __field(u8, preserve )1767 __field(u8, btree_id )1768 TRACE_BPOS_entries(old_pos)1769 TRACE_BPOS_entries(new_pos)1770 __field(u8, locks_want )1771 __field(u8, nodes_locked )1772 __array(char, node0, 24 )1773 __array(char, node1, 24 )1774 __array(char, node2, 24 )1775 __array(char, node3, 24 )1776 ),1777 1778 TP_fast_assign(1779 __entry->idx = path - trans->paths;1780 __entry->ref = path->ref;1781 __entry->preserve = path->preserve;1782 __entry->btree_id = path->btree_id;1783 TRACE_BPOS_assign(old_pos, path->pos);1784 TRACE_BPOS_assign(new_pos, *new_pos);1785 1786 __entry->nodes_locked = path->nodes_locked;1787 struct btree *b = path->l[0].b;1788 if (IS_ERR(b))1789 strscpy(__entry->node0, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1790 else1791 scnprintf(__entry->node0, sizeof(__entry->node0), "%px", &b->c);1792 b = path->l[1].b;1793 if (IS_ERR(b))1794 strscpy(__entry->node1, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1795 else1796 scnprintf(__entry->node1, sizeof(__entry->node0), "%px", &b->c);1797 b = path->l[2].b;1798 if (IS_ERR(b))1799 strscpy(__entry->node2, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1800 else1801 scnprintf(__entry->node2, sizeof(__entry->node0), "%px", &b->c);1802 b = path->l[3].b;1803 if (IS_ERR(b))1804 strscpy(__entry->node3, bch2_err_str(PTR_ERR(b)), sizeof(__entry->node0));1805 else1806 scnprintf(__entry->node3, sizeof(__entry->node0), "%px", &b->c);1807 ),1808 1809 TP_printk("\npath %3u ref %u preserve %u btree %s %llu:%llu:%u -> %llu:%llu:%u\n"1810 "locks %u %u %u %u node %s %s %s %s",1811 __entry->idx,1812 __entry->ref,1813 __entry->preserve,1814 bch2_btree_id_str(__entry->btree_id),1815 __entry->old_pos_inode,1816 __entry->old_pos_offset,1817 __entry->old_pos_snapshot,1818 __entry->new_pos_inode,1819 __entry->new_pos_offset,1820 __entry->new_pos_snapshot,1821 (__entry->nodes_locked >> 6) & 3,1822 (__entry->nodes_locked >> 4) & 3,1823 (__entry->nodes_locked >> 2) & 3,1824 (__entry->nodes_locked >> 0) & 3,1825 __entry->node3,1826 __entry->node2,1827 __entry->node1,1828 __entry->node0)1829);1830 1831TRACE_EVENT(btree_path_free,1832 TP_PROTO(struct btree_trans *trans, btree_path_idx_t path, struct btree_path *dup),1833 TP_ARGS(trans, path, dup),1834 1835 TP_STRUCT__entry(1836 __field(btree_path_idx_t, idx )1837 __field(u8, preserve )1838 __field(u8, should_be_locked)1839 __field(s8, dup )1840 __field(u8, dup_locked )1841 ),1842 1843 TP_fast_assign(1844 __entry->idx = path;1845 __entry->preserve = trans->paths[path].preserve;1846 __entry->should_be_locked = trans->paths[path].should_be_locked;1847 __entry->dup = dup ? dup - trans->paths : -1;1848 __entry->dup_locked = dup ? btree_node_locked(dup, dup->level) : 0;1849 ),1850 1851 TP_printk(" path %3u %c %c dup %2i locked %u", __entry->idx,1852 __entry->preserve ? 'P' : ' ',1853 __entry->should_be_locked ? 'S' : ' ',1854 __entry->dup,1855 __entry->dup_locked)1856);1857 1858TRACE_EVENT(btree_path_free_trans_begin,1859 TP_PROTO(btree_path_idx_t path),1860 TP_ARGS(path),1861 1862 TP_STRUCT__entry(1863 __field(btree_path_idx_t, idx )1864 ),1865 1866 TP_fast_assign(1867 __entry->idx = path;1868 ),1869 1870 TP_printk(" path %3u", __entry->idx)1871);1872 1873#else /* CONFIG_BCACHEFS_PATH_TRACEPOINTS */1874#ifndef _TRACE_BCACHEFS_H1875 1876static inline void trace_update_by_path(struct btree_trans *trans, struct btree_path *path,1877 struct btree_insert_entry *i, bool overwrite) {}1878static inline void trace_btree_path_lock(struct btree_trans *trans, unsigned long caller_ip, struct btree_bkey_cached_common *b) {}1879static inline void trace_btree_path_get_ll(struct btree_trans *trans, struct btree_path *path) {}1880static inline void trace_btree_path_put_ll(struct btree_trans *trans, struct btree_path *path) {}1881static inline void trace_btree_path_should_be_locked(struct btree_trans *trans, struct btree_path *path) {}1882static inline void trace_btree_path_alloc(struct btree_trans *trans, struct btree_path *path) {}1883static inline void trace_btree_path_get(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos) {}1884static inline void trace_btree_path_clone(struct btree_trans *trans, struct btree_path *path, struct btree_path *new) {}1885static inline void trace_btree_path_save_pos(struct btree_trans *trans, struct btree_path *path, struct btree_path *new) {}1886static inline void trace_btree_path_traverse_start(struct btree_trans *trans, struct btree_path *path) {}1887static inline void trace_btree_path_traverse_end(struct btree_trans *trans, struct btree_path *path) {}1888static inline void trace_btree_path_set_pos(struct btree_trans *trans, struct btree_path *path, struct bpos *new_pos) {}1889static inline void trace_btree_path_free(struct btree_trans *trans, btree_path_idx_t path, struct btree_path *dup) {}1890static inline void trace_btree_path_free_trans_begin(btree_path_idx_t path) {}1891 1892#endif1893#endif /* CONFIG_BCACHEFS_PATH_TRACEPOINTS */1894 1895#define _TRACE_BCACHEFS_H1896#endif /* _TRACE_BCACHEFS_H */1897 1898/* This part must be outside protection */1899#undef TRACE_INCLUDE_PATH1900#define TRACE_INCLUDE_PATH ../../fs/bcachefs1901 1902#undef TRACE_INCLUDE_FILE1903#define TRACE_INCLUDE_FILE trace1904 1905#include <trace/define_trace.h>1906