162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2009-2021 Christoph Hellwig 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * NOTE: none of these tracepoints shall be considered a stable kernel ABI 662306a36Sopenharmony_ci * as they can change at any time. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Current conventions for printing numbers measuring specific units: 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * offset: byte offset into a subcomponent of a file operation 1162306a36Sopenharmony_ci * pos: file offset, in bytes 1262306a36Sopenharmony_ci * length: length of a file operation, in bytes 1362306a36Sopenharmony_ci * ino: inode number 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * Numbers describing space allocations should be formatted in hexadecimal. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci#undef TRACE_SYSTEM 1862306a36Sopenharmony_ci#define TRACE_SYSTEM iomap 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#if !defined(_IOMAP_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 2162306a36Sopenharmony_ci#define _IOMAP_TRACE_H 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <linux/tracepoint.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct inode; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciDECLARE_EVENT_CLASS(iomap_readpage_class, 2862306a36Sopenharmony_ci TP_PROTO(struct inode *inode, int nr_pages), 2962306a36Sopenharmony_ci TP_ARGS(inode, nr_pages), 3062306a36Sopenharmony_ci TP_STRUCT__entry( 3162306a36Sopenharmony_ci __field(dev_t, dev) 3262306a36Sopenharmony_ci __field(u64, ino) 3362306a36Sopenharmony_ci __field(int, nr_pages) 3462306a36Sopenharmony_ci ), 3562306a36Sopenharmony_ci TP_fast_assign( 3662306a36Sopenharmony_ci __entry->dev = inode->i_sb->s_dev; 3762306a36Sopenharmony_ci __entry->ino = inode->i_ino; 3862306a36Sopenharmony_ci __entry->nr_pages = nr_pages; 3962306a36Sopenharmony_ci ), 4062306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%llx nr_pages %d", 4162306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 4262306a36Sopenharmony_ci __entry->ino, 4362306a36Sopenharmony_ci __entry->nr_pages) 4462306a36Sopenharmony_ci) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define DEFINE_READPAGE_EVENT(name) \ 4762306a36Sopenharmony_ciDEFINE_EVENT(iomap_readpage_class, name, \ 4862306a36Sopenharmony_ci TP_PROTO(struct inode *inode, int nr_pages), \ 4962306a36Sopenharmony_ci TP_ARGS(inode, nr_pages)) 5062306a36Sopenharmony_ciDEFINE_READPAGE_EVENT(iomap_readpage); 5162306a36Sopenharmony_ciDEFINE_READPAGE_EVENT(iomap_readahead); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciDECLARE_EVENT_CLASS(iomap_range_class, 5462306a36Sopenharmony_ci TP_PROTO(struct inode *inode, loff_t off, u64 len), 5562306a36Sopenharmony_ci TP_ARGS(inode, off, len), 5662306a36Sopenharmony_ci TP_STRUCT__entry( 5762306a36Sopenharmony_ci __field(dev_t, dev) 5862306a36Sopenharmony_ci __field(u64, ino) 5962306a36Sopenharmony_ci __field(loff_t, size) 6062306a36Sopenharmony_ci __field(loff_t, offset) 6162306a36Sopenharmony_ci __field(u64, length) 6262306a36Sopenharmony_ci ), 6362306a36Sopenharmony_ci TP_fast_assign( 6462306a36Sopenharmony_ci __entry->dev = inode->i_sb->s_dev; 6562306a36Sopenharmony_ci __entry->ino = inode->i_ino; 6662306a36Sopenharmony_ci __entry->size = i_size_read(inode); 6762306a36Sopenharmony_ci __entry->offset = off; 6862306a36Sopenharmony_ci __entry->length = len; 6962306a36Sopenharmony_ci ), 7062306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%llx size 0x%llx offset 0x%llx length 0x%llx", 7162306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 7262306a36Sopenharmony_ci __entry->ino, 7362306a36Sopenharmony_ci __entry->size, 7462306a36Sopenharmony_ci __entry->offset, 7562306a36Sopenharmony_ci __entry->length) 7662306a36Sopenharmony_ci) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define DEFINE_RANGE_EVENT(name) \ 7962306a36Sopenharmony_ciDEFINE_EVENT(iomap_range_class, name, \ 8062306a36Sopenharmony_ci TP_PROTO(struct inode *inode, loff_t off, u64 len),\ 8162306a36Sopenharmony_ci TP_ARGS(inode, off, len)) 8262306a36Sopenharmony_ciDEFINE_RANGE_EVENT(iomap_writepage); 8362306a36Sopenharmony_ciDEFINE_RANGE_EVENT(iomap_release_folio); 8462306a36Sopenharmony_ciDEFINE_RANGE_EVENT(iomap_invalidate_folio); 8562306a36Sopenharmony_ciDEFINE_RANGE_EVENT(iomap_dio_invalidate_fail); 8662306a36Sopenharmony_ciDEFINE_RANGE_EVENT(iomap_dio_rw_queued); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define IOMAP_TYPE_STRINGS \ 8962306a36Sopenharmony_ci { IOMAP_HOLE, "HOLE" }, \ 9062306a36Sopenharmony_ci { IOMAP_DELALLOC, "DELALLOC" }, \ 9162306a36Sopenharmony_ci { IOMAP_MAPPED, "MAPPED" }, \ 9262306a36Sopenharmony_ci { IOMAP_UNWRITTEN, "UNWRITTEN" }, \ 9362306a36Sopenharmony_ci { IOMAP_INLINE, "INLINE" } 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define IOMAP_FLAGS_STRINGS \ 9662306a36Sopenharmony_ci { IOMAP_WRITE, "WRITE" }, \ 9762306a36Sopenharmony_ci { IOMAP_ZERO, "ZERO" }, \ 9862306a36Sopenharmony_ci { IOMAP_REPORT, "REPORT" }, \ 9962306a36Sopenharmony_ci { IOMAP_FAULT, "FAULT" }, \ 10062306a36Sopenharmony_ci { IOMAP_DIRECT, "DIRECT" }, \ 10162306a36Sopenharmony_ci { IOMAP_NOWAIT, "NOWAIT" } 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define IOMAP_F_FLAGS_STRINGS \ 10462306a36Sopenharmony_ci { IOMAP_F_NEW, "NEW" }, \ 10562306a36Sopenharmony_ci { IOMAP_F_DIRTY, "DIRTY" }, \ 10662306a36Sopenharmony_ci { IOMAP_F_SHARED, "SHARED" }, \ 10762306a36Sopenharmony_ci { IOMAP_F_MERGED, "MERGED" }, \ 10862306a36Sopenharmony_ci { IOMAP_F_BUFFER_HEAD, "BH" }, \ 10962306a36Sopenharmony_ci { IOMAP_F_SIZE_CHANGED, "SIZE_CHANGED" } 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define IOMAP_DIO_STRINGS \ 11262306a36Sopenharmony_ci {IOMAP_DIO_FORCE_WAIT, "DIO_FORCE_WAIT" }, \ 11362306a36Sopenharmony_ci {IOMAP_DIO_OVERWRITE_ONLY, "DIO_OVERWRITE_ONLY" }, \ 11462306a36Sopenharmony_ci {IOMAP_DIO_PARTIAL, "DIO_PARTIAL" } 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ciDECLARE_EVENT_CLASS(iomap_class, 11762306a36Sopenharmony_ci TP_PROTO(struct inode *inode, struct iomap *iomap), 11862306a36Sopenharmony_ci TP_ARGS(inode, iomap), 11962306a36Sopenharmony_ci TP_STRUCT__entry( 12062306a36Sopenharmony_ci __field(dev_t, dev) 12162306a36Sopenharmony_ci __field(u64, ino) 12262306a36Sopenharmony_ci __field(u64, addr) 12362306a36Sopenharmony_ci __field(loff_t, offset) 12462306a36Sopenharmony_ci __field(u64, length) 12562306a36Sopenharmony_ci __field(u16, type) 12662306a36Sopenharmony_ci __field(u16, flags) 12762306a36Sopenharmony_ci __field(dev_t, bdev) 12862306a36Sopenharmony_ci ), 12962306a36Sopenharmony_ci TP_fast_assign( 13062306a36Sopenharmony_ci __entry->dev = inode->i_sb->s_dev; 13162306a36Sopenharmony_ci __entry->ino = inode->i_ino; 13262306a36Sopenharmony_ci __entry->addr = iomap->addr; 13362306a36Sopenharmony_ci __entry->offset = iomap->offset; 13462306a36Sopenharmony_ci __entry->length = iomap->length; 13562306a36Sopenharmony_ci __entry->type = iomap->type; 13662306a36Sopenharmony_ci __entry->flags = iomap->flags; 13762306a36Sopenharmony_ci __entry->bdev = iomap->bdev ? iomap->bdev->bd_dev : 0; 13862306a36Sopenharmony_ci ), 13962306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%llx bdev %d:%d addr 0x%llx offset 0x%llx " 14062306a36Sopenharmony_ci "length 0x%llx type %s flags %s", 14162306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 14262306a36Sopenharmony_ci __entry->ino, 14362306a36Sopenharmony_ci MAJOR(__entry->bdev), MINOR(__entry->bdev), 14462306a36Sopenharmony_ci __entry->addr, 14562306a36Sopenharmony_ci __entry->offset, 14662306a36Sopenharmony_ci __entry->length, 14762306a36Sopenharmony_ci __print_symbolic(__entry->type, IOMAP_TYPE_STRINGS), 14862306a36Sopenharmony_ci __print_flags(__entry->flags, "|", IOMAP_F_FLAGS_STRINGS)) 14962306a36Sopenharmony_ci) 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#define DEFINE_IOMAP_EVENT(name) \ 15262306a36Sopenharmony_ciDEFINE_EVENT(iomap_class, name, \ 15362306a36Sopenharmony_ci TP_PROTO(struct inode *inode, struct iomap *iomap), \ 15462306a36Sopenharmony_ci TP_ARGS(inode, iomap)) 15562306a36Sopenharmony_ciDEFINE_IOMAP_EVENT(iomap_iter_dstmap); 15662306a36Sopenharmony_ciDEFINE_IOMAP_EVENT(iomap_iter_srcmap); 15762306a36Sopenharmony_ciDEFINE_IOMAP_EVENT(iomap_writepage_map); 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciTRACE_EVENT(iomap_iter, 16062306a36Sopenharmony_ci TP_PROTO(struct iomap_iter *iter, const void *ops, 16162306a36Sopenharmony_ci unsigned long caller), 16262306a36Sopenharmony_ci TP_ARGS(iter, ops, caller), 16362306a36Sopenharmony_ci TP_STRUCT__entry( 16462306a36Sopenharmony_ci __field(dev_t, dev) 16562306a36Sopenharmony_ci __field(u64, ino) 16662306a36Sopenharmony_ci __field(loff_t, pos) 16762306a36Sopenharmony_ci __field(u64, length) 16862306a36Sopenharmony_ci __field(unsigned int, flags) 16962306a36Sopenharmony_ci __field(const void *, ops) 17062306a36Sopenharmony_ci __field(unsigned long, caller) 17162306a36Sopenharmony_ci ), 17262306a36Sopenharmony_ci TP_fast_assign( 17362306a36Sopenharmony_ci __entry->dev = iter->inode->i_sb->s_dev; 17462306a36Sopenharmony_ci __entry->ino = iter->inode->i_ino; 17562306a36Sopenharmony_ci __entry->pos = iter->pos; 17662306a36Sopenharmony_ci __entry->length = iomap_length(iter); 17762306a36Sopenharmony_ci __entry->flags = iter->flags; 17862306a36Sopenharmony_ci __entry->ops = ops; 17962306a36Sopenharmony_ci __entry->caller = caller; 18062306a36Sopenharmony_ci ), 18162306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%llx pos 0x%llx length 0x%llx flags %s (0x%x) ops %ps caller %pS", 18262306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 18362306a36Sopenharmony_ci __entry->ino, 18462306a36Sopenharmony_ci __entry->pos, 18562306a36Sopenharmony_ci __entry->length, 18662306a36Sopenharmony_ci __print_flags(__entry->flags, "|", IOMAP_FLAGS_STRINGS), 18762306a36Sopenharmony_ci __entry->flags, 18862306a36Sopenharmony_ci __entry->ops, 18962306a36Sopenharmony_ci (void *)__entry->caller) 19062306a36Sopenharmony_ci); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ciTRACE_EVENT(iomap_dio_rw_begin, 19362306a36Sopenharmony_ci TP_PROTO(struct kiocb *iocb, struct iov_iter *iter, 19462306a36Sopenharmony_ci unsigned int dio_flags, size_t done_before), 19562306a36Sopenharmony_ci TP_ARGS(iocb, iter, dio_flags, done_before), 19662306a36Sopenharmony_ci TP_STRUCT__entry( 19762306a36Sopenharmony_ci __field(dev_t, dev) 19862306a36Sopenharmony_ci __field(ino_t, ino) 19962306a36Sopenharmony_ci __field(loff_t, isize) 20062306a36Sopenharmony_ci __field(loff_t, pos) 20162306a36Sopenharmony_ci __field(size_t, count) 20262306a36Sopenharmony_ci __field(size_t, done_before) 20362306a36Sopenharmony_ci __field(int, ki_flags) 20462306a36Sopenharmony_ci __field(unsigned int, dio_flags) 20562306a36Sopenharmony_ci __field(bool, aio) 20662306a36Sopenharmony_ci ), 20762306a36Sopenharmony_ci TP_fast_assign( 20862306a36Sopenharmony_ci __entry->dev = file_inode(iocb->ki_filp)->i_sb->s_dev; 20962306a36Sopenharmony_ci __entry->ino = file_inode(iocb->ki_filp)->i_ino; 21062306a36Sopenharmony_ci __entry->isize = file_inode(iocb->ki_filp)->i_size; 21162306a36Sopenharmony_ci __entry->pos = iocb->ki_pos; 21262306a36Sopenharmony_ci __entry->count = iov_iter_count(iter); 21362306a36Sopenharmony_ci __entry->done_before = done_before; 21462306a36Sopenharmony_ci __entry->ki_flags = iocb->ki_flags; 21562306a36Sopenharmony_ci __entry->dio_flags = dio_flags; 21662306a36Sopenharmony_ci __entry->aio = !is_sync_kiocb(iocb); 21762306a36Sopenharmony_ci ), 21862306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%lx size 0x%llx offset 0x%llx length 0x%zx done_before 0x%zx flags %s dio_flags %s aio %d", 21962306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 22062306a36Sopenharmony_ci __entry->ino, 22162306a36Sopenharmony_ci __entry->isize, 22262306a36Sopenharmony_ci __entry->pos, 22362306a36Sopenharmony_ci __entry->count, 22462306a36Sopenharmony_ci __entry->done_before, 22562306a36Sopenharmony_ci __print_flags(__entry->ki_flags, "|", TRACE_IOCB_STRINGS), 22662306a36Sopenharmony_ci __print_flags(__entry->dio_flags, "|", IOMAP_DIO_STRINGS), 22762306a36Sopenharmony_ci __entry->aio) 22862306a36Sopenharmony_ci); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ciTRACE_EVENT(iomap_dio_complete, 23162306a36Sopenharmony_ci TP_PROTO(struct kiocb *iocb, int error, ssize_t ret), 23262306a36Sopenharmony_ci TP_ARGS(iocb, error, ret), 23362306a36Sopenharmony_ci TP_STRUCT__entry( 23462306a36Sopenharmony_ci __field(dev_t, dev) 23562306a36Sopenharmony_ci __field(ino_t, ino) 23662306a36Sopenharmony_ci __field(loff_t, isize) 23762306a36Sopenharmony_ci __field(loff_t, pos) 23862306a36Sopenharmony_ci __field(int, ki_flags) 23962306a36Sopenharmony_ci __field(bool, aio) 24062306a36Sopenharmony_ci __field(int, error) 24162306a36Sopenharmony_ci __field(ssize_t, ret) 24262306a36Sopenharmony_ci ), 24362306a36Sopenharmony_ci TP_fast_assign( 24462306a36Sopenharmony_ci __entry->dev = file_inode(iocb->ki_filp)->i_sb->s_dev; 24562306a36Sopenharmony_ci __entry->ino = file_inode(iocb->ki_filp)->i_ino; 24662306a36Sopenharmony_ci __entry->isize = file_inode(iocb->ki_filp)->i_size; 24762306a36Sopenharmony_ci __entry->pos = iocb->ki_pos; 24862306a36Sopenharmony_ci __entry->ki_flags = iocb->ki_flags; 24962306a36Sopenharmony_ci __entry->aio = !is_sync_kiocb(iocb); 25062306a36Sopenharmony_ci __entry->error = error; 25162306a36Sopenharmony_ci __entry->ret = ret; 25262306a36Sopenharmony_ci ), 25362306a36Sopenharmony_ci TP_printk("dev %d:%d ino 0x%lx size 0x%llx offset 0x%llx flags %s aio %d error %d ret %zd", 25462306a36Sopenharmony_ci MAJOR(__entry->dev), MINOR(__entry->dev), 25562306a36Sopenharmony_ci __entry->ino, 25662306a36Sopenharmony_ci __entry->isize, 25762306a36Sopenharmony_ci __entry->pos, 25862306a36Sopenharmony_ci __print_flags(__entry->ki_flags, "|", TRACE_IOCB_STRINGS), 25962306a36Sopenharmony_ci __entry->aio, 26062306a36Sopenharmony_ci __entry->error, 26162306a36Sopenharmony_ci __entry->ret) 26262306a36Sopenharmony_ci); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#endif /* _IOMAP_TRACE_H */ 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH 26762306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH . 26862306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace 26962306a36Sopenharmony_ci#include <trace/define_trace.h> 270