brintos

brintos / linux-shallow public Read only

0
0
Text · 49.3 KiB · 5597b9d Raw
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