2642 lines · 65.4 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#undef TRACE_SYSTEM#define TRACE_SYSTEM f2fs #if !defined(_TRACE_F2FS_H) || defined(TRACE_HEADER_MULTI_READ)#define _TRACE_F2FS_H #include <linux/tracepoint.h>#include <uapi/linux/f2fs.h> #define show_dev(dev)		MAJOR(dev), MINOR(dev)#define show_dev_ino(entry)	show_dev(entry->dev), (unsigned long long)entry->ino TRACE_DEFINE_ENUM(NODE);TRACE_DEFINE_ENUM(DATA);TRACE_DEFINE_ENUM(META);TRACE_DEFINE_ENUM(META_FLUSH);TRACE_DEFINE_ENUM(IPU);TRACE_DEFINE_ENUM(OPU);TRACE_DEFINE_ENUM(HOT);TRACE_DEFINE_ENUM(WARM);TRACE_DEFINE_ENUM(COLD);TRACE_DEFINE_ENUM(CURSEG_HOT_DATA);TRACE_DEFINE_ENUM(CURSEG_WARM_DATA);TRACE_DEFINE_ENUM(CURSEG_COLD_DATA);TRACE_DEFINE_ENUM(CURSEG_HOT_NODE);TRACE_DEFINE_ENUM(CURSEG_WARM_NODE);TRACE_DEFINE_ENUM(CURSEG_COLD_NODE);TRACE_DEFINE_ENUM(NO_CHECK_TYPE);TRACE_DEFINE_ENUM(GC_GREEDY);TRACE_DEFINE_ENUM(GC_CB);TRACE_DEFINE_ENUM(FG_GC);TRACE_DEFINE_ENUM(BG_GC);TRACE_DEFINE_ENUM(LFS);TRACE_DEFINE_ENUM(SSR);TRACE_DEFINE_ENUM(__REQ_RAHEAD);TRACE_DEFINE_ENUM(__REQ_SYNC);TRACE_DEFINE_ENUM(__REQ_IDLE);TRACE_DEFINE_ENUM(__REQ_PREFLUSH);TRACE_DEFINE_ENUM(__REQ_FUA);TRACE_DEFINE_ENUM(__REQ_PRIO);TRACE_DEFINE_ENUM(__REQ_META);TRACE_DEFINE_ENUM(CP_UMOUNT);TRACE_DEFINE_ENUM(CP_FASTBOOT);TRACE_DEFINE_ENUM(CP_SYNC);TRACE_DEFINE_ENUM(CP_RECOVERY);TRACE_DEFINE_ENUM(CP_DISCARD);TRACE_DEFINE_ENUM(CP_TRIMMED);TRACE_DEFINE_ENUM(CP_PAUSE);TRACE_DEFINE_ENUM(CP_RESIZE);TRACE_DEFINE_ENUM(EX_READ);TRACE_DEFINE_ENUM(EX_BLOCK_AGE);TRACE_DEFINE_ENUM(CP_PHASE_START_BLOCK_OPS);TRACE_DEFINE_ENUM(CP_PHASE_FINISH_BLOCK_OPS);TRACE_DEFINE_ENUM(CP_PHASE_FINISH_CHECKPOINT); #define show_block_type(type)						\	__print_symbolic(type,						\		{ NODE,		"NODE" },				\		{ DATA,		"DATA" },				\		{ META,		"META" },				\		{ META_FLUSH,	"META_FLUSH" },				\		{ IPU,		"IN-PLACE" },				\		{ OPU,		"OUT-OF-PLACE" }) #define show_block_temp(temp)						\	__print_symbolic(temp,						\		{ HOT,		"HOT" },				\		{ WARM,		"WARM" },				\		{ COLD,		"COLD" }) #define F2FS_OP_FLAGS (REQ_RAHEAD | REQ_SYNC | REQ_META | REQ_PRIO |	\			REQ_PREFLUSH | REQ_FUA)#define F2FS_BIO_FLAG_MASK(t) (__force u32)((t) & F2FS_OP_FLAGS) #define show_bio_type(op,op_flags)	show_bio_op(op),		\						show_bio_op_flags(op_flags) #define show_bio_op(op)		blk_op_str(op) #define show_bio_op_flags(flags)					\	__print_flags(F2FS_BIO_FLAG_MASK(flags), "|",			\		{ (__force u32)REQ_RAHEAD,	"R" },			\		{ (__force u32)REQ_SYNC,	"S" },			\		{ (__force u32)REQ_META,	"M" },			\		{ (__force u32)REQ_PRIO,	"P" },			\		{ (__force u32)REQ_PREFLUSH,	"PF" },			\		{ (__force u32)REQ_FUA,		"FUA" }) #define show_data_type(type)						\	__print_symbolic(type,						\		{ CURSEG_HOT_DATA, 	"Hot DATA" },			\		{ CURSEG_WARM_DATA, 	"Warm DATA" },			\		{ CURSEG_COLD_DATA, 	"Cold DATA" },			\		{ CURSEG_HOT_NODE, 	"Hot NODE" },			\		{ CURSEG_WARM_NODE, 	"Warm NODE" },			\		{ CURSEG_COLD_NODE, 	"Cold NODE" },			\		{ NO_CHECK_TYPE, 	"No TYPE" }) #define show_file_type(type)						\	__print_symbolic(type,						\		{ 0,		"FILE" },				\		{ 1,		"DIR" }) #define show_gc_type(type)						\	__print_symbolic(type,						\		{ FG_GC,	"Foreground GC" },			\		{ BG_GC,	"Background GC" }) #define show_alloc_mode(type)						\	__print_symbolic(type,						\		{ LFS,		"LFS-mode" },				\		{ SSR,		"SSR-mode" },				\		{ AT_SSR,	"AT_SSR-mode" }) #define show_victim_policy(type)					\	__print_symbolic(type,						\		{ GC_GREEDY,	"Greedy" },				\		{ GC_CB,	"Cost-Benefit" },			\		{ GC_AT,	"Age-threshold" }) #define show_cpreason(type)						\	__print_flags(type, "|",					\		{ CP_UMOUNT,	"Umount" },				\		{ CP_FASTBOOT,	"Fastboot" },				\		{ CP_SYNC,	"Sync" },				\		{ CP_RECOVERY,	"Recovery" },				\		{ CP_DISCARD,	"Discard" },				\		{ CP_PAUSE,	"Pause" },				\		{ CP_TRIMMED,	"Trimmed" },				\		{ CP_RESIZE,	"Resize" }) #define show_fsync_cpreason(type)					\	__print_symbolic(type,						\		{ CP_NO_NEEDED,		"no needed" },			\		{ CP_NON_REGULAR,	"non regular" },		\		{ CP_COMPRESSED,	"compressed" },			\		{ CP_HARDLINK,		"hardlink" },			\		{ CP_SB_NEED_CP,	"sb needs cp" },		\		{ CP_WRONG_PINO,	"wrong pino" },			\		{ CP_NO_SPC_ROLL,	"no space roll forward" },	\		{ CP_NODE_NEED_CP,	"node needs cp" },		\		{ CP_FASTBOOT_MODE,	"fastboot mode" },		\		{ CP_SPEC_LOG_NUM,	"log type is 2" },		\		{ CP_RECOVER_DIR,	"dir needs recovery" },		\		{ CP_XATTR_DIR,		"dir's xattr updated" }) #define show_shutdown_mode(type)					\	__print_symbolic(type,						\		{ F2FS_GOING_DOWN_FULLSYNC,	"full sync" },		\		{ F2FS_GOING_DOWN_METASYNC,	"meta sync" },		\		{ F2FS_GOING_DOWN_NOSYNC,	"no sync" },		\		{ F2FS_GOING_DOWN_METAFLUSH,	"meta flush" },		\		{ F2FS_GOING_DOWN_NEED_FSCK,	"need fsck" }) #define show_compress_algorithm(type)					\	__print_symbolic(type,						\		{ COMPRESS_LZO,		"LZO" },			\		{ COMPRESS_LZ4,		"LZ4" },			\		{ COMPRESS_ZSTD,	"ZSTD" },			\		{ COMPRESS_LZORLE,	"LZO-RLE" }) #define show_extent_type(type)						\	__print_symbolic(type,						\		{ EX_READ,	"Read" },				\		{ EX_BLOCK_AGE,	"Block Age" }) #define show_inode_type(x) \	__print_symbolic(x, \		{ S_IFLNK,		"symbolic" }, \		{ S_IFREG,		"regular" }, \		{ S_IFDIR,		"directory" }, \		{ S_IFCHR,		"character" }, \		{ S_IFBLK,		"block" }, \		{ S_IFIFO,		"fifo" }, \		{ S_IFSOCK,		"sock" }) #define S_ALL_PERM	(S_ISUID | S_ISGID | S_ISVTX |	\			S_IRWXU | S_IRWXG | S_IRWXO) #define show_cp_phase(phase)					\	__print_symbolic(phase,						\		{ CP_PHASE_START_BLOCK_OPS,		"start block_ops" },			\		{ CP_PHASE_FINISH_BLOCK_OPS,	"finish block_ops" },			\		{ CP_PHASE_FINISH_CHECKPOINT,	"finish checkpoint" }) #define show_lock_name(lock)						\	__print_symbolic(lock,						\		{ LOCK_NAME_CP_RWSEM,		"cp_rwsem" },		\		{ LOCK_NAME_NODE_CHANGE,	"node_change" },	\		{ LOCK_NAME_NODE_WRITE,		"node_write" },		\		{ LOCK_NAME_GC_LOCK,		"gc_lock" },		\		{ LOCK_NAME_CP_GLOBAL,		"cp_global" },		\		{ LOCK_NAME_IO_RWSEM,		"io_rwsem" },		\		{ LOCK_NAME_NAT_TREE_LOCK,	"nat_tree_lock" }) struct f2fs_sb_info;struct f2fs_io_info;struct extent_info;struct victim_sel_policy;struct f2fs_map_blocks; DECLARE_EVENT_CLASS(f2fs__inode, 	TP_PROTO(struct inode *inode), 	TP_ARGS(inode), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(u64,	pino)		__field(loff_t,	size)		__field(blkcnt_t, blocks)		__field(dev_t,	dev)		__field(umode_t, mode)		__field(unsigned int, nlink)		__field(__u8,	advise)	), 	TP_fast_assign(		__entry->dev	= inode->i_sb->s_dev;		__entry->ino	= inode->i_ino;		__entry->pino	= F2FS_I(inode)->i_pino;		__entry->mode	= inode->i_mode;		__entry->nlink	= inode->i_nlink;		__entry->size	= i_size_read(inode);		__entry->blocks	= inode->i_blocks;		__entry->advise	= F2FS_I(inode)->i_advise;	), 	TP_printk("dev = (%d,%d), ino = %llu, pino = %llu, i_mode = 0x%hx, "		"i_size = %lld, i_nlink = %u, i_blocks = %llu, i_advise = 0x%x",		show_dev_ino(__entry),		__entry->pino,		__entry->mode,		__entry->size,		(unsigned int)__entry->nlink,		(unsigned long long)__entry->blocks,		(unsigned char)__entry->advise)); DECLARE_EVENT_CLASS(f2fs__inode_exit, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(dev_t,	dev)		__field(umode_t, mode)		__field(int,	ret)	), 	TP_fast_assign(		__entry->dev	= inode->i_sb->s_dev;		__entry->ino	= inode->i_ino;		__entry->mode	= inode->i_mode;		__entry->ret	= ret;	), 	TP_printk("dev = (%d,%d), ino = %llu, type: %s, mode = 0%o, ret = %d",		show_dev_ino(__entry),		show_inode_type(__entry->mode & S_IFMT),		__entry->mode & S_ALL_PERM,		__entry->ret)); DEFINE_EVENT(f2fs__inode, f2fs_sync_file_enter, 	TP_PROTO(struct inode *inode), 	TP_ARGS(inode)); TRACE_EVENT(f2fs_sync_file_exit, 	TP_PROTO(struct inode *inode, int cp_reason, int datasync, int ret), 	TP_ARGS(inode, cp_reason, datasync, ret), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(dev_t,	dev)		__field(int,	cp_reason)		__field(int,	datasync)		__field(int,	ret)	), 	TP_fast_assign(		__entry->dev		= inode->i_sb->s_dev;		__entry->ino		= inode->i_ino;		__entry->cp_reason	= cp_reason;		__entry->datasync	= datasync;		__entry->ret		= ret;	), 	TP_printk("dev = (%d,%d), ino = %llu, cp_reason: %s, "		"datasync = %d, ret = %d",		show_dev_ino(__entry),		show_fsync_cpreason(__entry->cp_reason),		__entry->datasync,		__entry->ret)); TRACE_EVENT(f2fs_sync_fs, 	TP_PROTO(struct super_block *sb, int wait), 	TP_ARGS(sb, wait), 	TP_STRUCT__entry(		__field(dev_t,	dev)		__field(int,	dirty)		__field(int,	wait)	), 	TP_fast_assign(		__entry->dev	= sb->s_dev;		__entry->dirty	= is_sbi_flag_set(F2FS_SB(sb), SBI_IS_DIRTY);		__entry->wait	= wait;	), 	TP_printk("dev = (%d,%d), superblock is %s, wait = %d",		show_dev(__entry->dev),		__entry->dirty ? "dirty" : "not dirty",		__entry->wait)); DEFINE_EVENT(f2fs__inode, f2fs_iget, 	TP_PROTO(struct inode *inode), 	TP_ARGS(inode)); DEFINE_EVENT(f2fs__inode_exit, f2fs_iget_exit, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); DEFINE_EVENT(f2fs__inode, f2fs_evict_inode, 	TP_PROTO(struct inode *inode), 	TP_ARGS(inode)); DEFINE_EVENT(f2fs__inode_exit, f2fs_new_inode, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); TRACE_EVENT(f2fs_unlink_enter, 	TP_PROTO(struct inode *dir, struct dentry *dentry), 	TP_ARGS(dir, dentry), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(loff_t,	size)		__field(blkcnt_t, blocks)		__field(dev_t,	dev)		__string(name,  dentry->d_name.name)	), 	TP_fast_assign(		__entry->dev	= dir->i_sb->s_dev;		__entry->ino	= dir->i_ino;		__entry->size	= i_size_read(dir);		__entry->blocks	= dir->i_blocks;		__assign_str(name);	), 	TP_printk("dev = (%d,%d), dir ino = %llu, i_size = %lld, "		"i_blocks = %llu, name = %s",		show_dev_ino(__entry),		__entry->size,		(unsigned long long)__entry->blocks,		__get_str(name))); DEFINE_EVENT(f2fs__inode_exit, f2fs_unlink_exit, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); DEFINE_EVENT(f2fs__inode_exit, f2fs_drop_inode, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); DEFINE_EVENT(f2fs__inode, f2fs_truncate, 	TP_PROTO(struct inode *inode), 	TP_ARGS(inode)); TRACE_EVENT(f2fs_truncate_data_blocks_range, 	TP_PROTO(struct inode *inode, nid_t nid, unsigned int ofs, int free), 	TP_ARGS(inode, nid,  ofs, free), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(dev_t,	dev)		__field(nid_t,	nid)		__field(unsigned int,	ofs)		__field(int,	free)	), 	TP_fast_assign(		__entry->dev	= inode->i_sb->s_dev;		__entry->ino	= inode->i_ino;		__entry->nid	= nid;		__entry->ofs	= ofs;		__entry->free	= free;	), 	TP_printk("dev = (%d,%d), ino = %llu, nid = %u, offset = %u, freed = %d",		show_dev_ino(__entry),		(unsigned int)__entry->nid,		__entry->ofs,		__entry->free)); DECLARE_EVENT_CLASS(f2fs__truncate_op, 	TP_PROTO(struct inode *inode, u64 from), 	TP_ARGS(inode, from), 	TP_STRUCT__entry(		__field(u64,	ino)		__field(loff_t,	size)		__field(blkcnt_t, blocks)		__field(u64,	from)		__field(dev_t,	dev)	), 	TP_fast_assign(		__entry->dev	= inode->i_sb->s_dev;		__entry->ino	= inode->i_ino;		__entry->size	= i_size_read(inode);		__entry->blocks	= inode->i_blocks;		__entry->from	= from;	), 	TP_printk("dev = (%d,%d), ino = %llu, i_size = %lld, i_blocks = %llu, "		"start file offset = %llu",		show_dev_ino(__entry),		__entry->size,		(unsigned long long)__entry->blocks,		(unsigned long long)__entry->from)); DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_blocks_enter, 	TP_PROTO(struct inode *inode, u64 from), 	TP_ARGS(inode, from)); DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_blocks_exit, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_inode_blocks_enter, 	TP_PROTO(struct inode *inode, u64 from), 	TP_ARGS(inode, from)); DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_inode_blocks_exit, 	TP_PROTO(struct inode *inode, int ret), 	TP_ARGS(inode, ret)); DECLARE_EVENT_CLASS(f2fs__truncate_node, 	TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr), 	TP_ARGS(inode, nid, blk_addr),

Lines 1–500 of 2642.