1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2009-2019 Christoph Hellwig 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * NOTE: none of these tracepoints shall be consider a stable kernel ABI 6*4882a593Smuzhiyun * as they can change at any time. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #undef TRACE_SYSTEM 9*4882a593Smuzhiyun #define TRACE_SYSTEM iomap 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #if !defined(_IOMAP_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 12*4882a593Smuzhiyun #define _IOMAP_TRACE_H 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/tracepoint.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct inode; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun DECLARE_EVENT_CLASS(iomap_readpage_class, 19*4882a593Smuzhiyun TP_PROTO(struct inode *inode, int nr_pages), 20*4882a593Smuzhiyun TP_ARGS(inode, nr_pages), 21*4882a593Smuzhiyun TP_STRUCT__entry( 22*4882a593Smuzhiyun __field(dev_t, dev) 23*4882a593Smuzhiyun __field(u64, ino) 24*4882a593Smuzhiyun __field(int, nr_pages) 25*4882a593Smuzhiyun ), 26*4882a593Smuzhiyun TP_fast_assign( 27*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 28*4882a593Smuzhiyun __entry->ino = inode->i_ino; 29*4882a593Smuzhiyun __entry->nr_pages = nr_pages; 30*4882a593Smuzhiyun ), 31*4882a593Smuzhiyun TP_printk("dev %d:%d ino 0x%llx nr_pages %d", 32*4882a593Smuzhiyun MAJOR(__entry->dev), MINOR(__entry->dev), 33*4882a593Smuzhiyun __entry->ino, 34*4882a593Smuzhiyun __entry->nr_pages) 35*4882a593Smuzhiyun ) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define DEFINE_READPAGE_EVENT(name) \ 38*4882a593Smuzhiyun DEFINE_EVENT(iomap_readpage_class, name, \ 39*4882a593Smuzhiyun TP_PROTO(struct inode *inode, int nr_pages), \ 40*4882a593Smuzhiyun TP_ARGS(inode, nr_pages)) 41*4882a593Smuzhiyun DEFINE_READPAGE_EVENT(iomap_readpage); 42*4882a593Smuzhiyun DEFINE_READPAGE_EVENT(iomap_readahead); 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun DECLARE_EVENT_CLASS(iomap_range_class, 45*4882a593Smuzhiyun TP_PROTO(struct inode *inode, unsigned long off, unsigned int len), 46*4882a593Smuzhiyun TP_ARGS(inode, off, len), 47*4882a593Smuzhiyun TP_STRUCT__entry( 48*4882a593Smuzhiyun __field(dev_t, dev) 49*4882a593Smuzhiyun __field(u64, ino) 50*4882a593Smuzhiyun __field(loff_t, size) 51*4882a593Smuzhiyun __field(unsigned long, offset) 52*4882a593Smuzhiyun __field(unsigned int, length) 53*4882a593Smuzhiyun ), 54*4882a593Smuzhiyun TP_fast_assign( 55*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 56*4882a593Smuzhiyun __entry->ino = inode->i_ino; 57*4882a593Smuzhiyun __entry->size = i_size_read(inode); 58*4882a593Smuzhiyun __entry->offset = off; 59*4882a593Smuzhiyun __entry->length = len; 60*4882a593Smuzhiyun ), 61*4882a593Smuzhiyun TP_printk("dev %d:%d ino 0x%llx size 0x%llx offset %lx " 62*4882a593Smuzhiyun "length %x", 63*4882a593Smuzhiyun MAJOR(__entry->dev), MINOR(__entry->dev), 64*4882a593Smuzhiyun __entry->ino, 65*4882a593Smuzhiyun __entry->size, 66*4882a593Smuzhiyun __entry->offset, 67*4882a593Smuzhiyun __entry->length) 68*4882a593Smuzhiyun ) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define DEFINE_RANGE_EVENT(name) \ 71*4882a593Smuzhiyun DEFINE_EVENT(iomap_range_class, name, \ 72*4882a593Smuzhiyun TP_PROTO(struct inode *inode, unsigned long off, unsigned int len),\ 73*4882a593Smuzhiyun TP_ARGS(inode, off, len)) 74*4882a593Smuzhiyun DEFINE_RANGE_EVENT(iomap_writepage); 75*4882a593Smuzhiyun DEFINE_RANGE_EVENT(iomap_releasepage); 76*4882a593Smuzhiyun DEFINE_RANGE_EVENT(iomap_invalidatepage); 77*4882a593Smuzhiyun DEFINE_RANGE_EVENT(iomap_dio_invalidate_fail); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define IOMAP_TYPE_STRINGS \ 80*4882a593Smuzhiyun { IOMAP_HOLE, "HOLE" }, \ 81*4882a593Smuzhiyun { IOMAP_DELALLOC, "DELALLOC" }, \ 82*4882a593Smuzhiyun { IOMAP_MAPPED, "MAPPED" }, \ 83*4882a593Smuzhiyun { IOMAP_UNWRITTEN, "UNWRITTEN" }, \ 84*4882a593Smuzhiyun { IOMAP_INLINE, "INLINE" } 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define IOMAP_FLAGS_STRINGS \ 87*4882a593Smuzhiyun { IOMAP_WRITE, "WRITE" }, \ 88*4882a593Smuzhiyun { IOMAP_ZERO, "ZERO" }, \ 89*4882a593Smuzhiyun { IOMAP_REPORT, "REPORT" }, \ 90*4882a593Smuzhiyun { IOMAP_FAULT, "FAULT" }, \ 91*4882a593Smuzhiyun { IOMAP_DIRECT, "DIRECT" }, \ 92*4882a593Smuzhiyun { IOMAP_NOWAIT, "NOWAIT" } 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define IOMAP_F_FLAGS_STRINGS \ 95*4882a593Smuzhiyun { IOMAP_F_NEW, "NEW" }, \ 96*4882a593Smuzhiyun { IOMAP_F_DIRTY, "DIRTY" }, \ 97*4882a593Smuzhiyun { IOMAP_F_SHARED, "SHARED" }, \ 98*4882a593Smuzhiyun { IOMAP_F_MERGED, "MERGED" }, \ 99*4882a593Smuzhiyun { IOMAP_F_BUFFER_HEAD, "BH" }, \ 100*4882a593Smuzhiyun { IOMAP_F_SIZE_CHANGED, "SIZE_CHANGED" } 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun DECLARE_EVENT_CLASS(iomap_class, 103*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct iomap *iomap), 104*4882a593Smuzhiyun TP_ARGS(inode, iomap), 105*4882a593Smuzhiyun TP_STRUCT__entry( 106*4882a593Smuzhiyun __field(dev_t, dev) 107*4882a593Smuzhiyun __field(u64, ino) 108*4882a593Smuzhiyun __field(u64, addr) 109*4882a593Smuzhiyun __field(loff_t, offset) 110*4882a593Smuzhiyun __field(u64, length) 111*4882a593Smuzhiyun __field(u16, type) 112*4882a593Smuzhiyun __field(u16, flags) 113*4882a593Smuzhiyun __field(dev_t, bdev) 114*4882a593Smuzhiyun ), 115*4882a593Smuzhiyun TP_fast_assign( 116*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 117*4882a593Smuzhiyun __entry->ino = inode->i_ino; 118*4882a593Smuzhiyun __entry->addr = iomap->addr; 119*4882a593Smuzhiyun __entry->offset = iomap->offset; 120*4882a593Smuzhiyun __entry->length = iomap->length; 121*4882a593Smuzhiyun __entry->type = iomap->type; 122*4882a593Smuzhiyun __entry->flags = iomap->flags; 123*4882a593Smuzhiyun __entry->bdev = iomap->bdev ? iomap->bdev->bd_dev : 0; 124*4882a593Smuzhiyun ), 125*4882a593Smuzhiyun TP_printk("dev %d:%d ino 0x%llx bdev %d:%d addr %lld offset %lld " 126*4882a593Smuzhiyun "length %llu type %s flags %s", 127*4882a593Smuzhiyun MAJOR(__entry->dev), MINOR(__entry->dev), 128*4882a593Smuzhiyun __entry->ino, 129*4882a593Smuzhiyun MAJOR(__entry->bdev), MINOR(__entry->bdev), 130*4882a593Smuzhiyun __entry->addr, 131*4882a593Smuzhiyun __entry->offset, 132*4882a593Smuzhiyun __entry->length, 133*4882a593Smuzhiyun __print_symbolic(__entry->type, IOMAP_TYPE_STRINGS), 134*4882a593Smuzhiyun __print_flags(__entry->flags, "|", IOMAP_F_FLAGS_STRINGS)) 135*4882a593Smuzhiyun ) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define DEFINE_IOMAP_EVENT(name) \ 138*4882a593Smuzhiyun DEFINE_EVENT(iomap_class, name, \ 139*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct iomap *iomap), \ 140*4882a593Smuzhiyun TP_ARGS(inode, iomap)) 141*4882a593Smuzhiyun DEFINE_IOMAP_EVENT(iomap_apply_dstmap); 142*4882a593Smuzhiyun DEFINE_IOMAP_EVENT(iomap_apply_srcmap); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun TRACE_EVENT(iomap_apply, 145*4882a593Smuzhiyun TP_PROTO(struct inode *inode, loff_t pos, loff_t length, 146*4882a593Smuzhiyun unsigned int flags, const void *ops, void *actor, 147*4882a593Smuzhiyun unsigned long caller), 148*4882a593Smuzhiyun TP_ARGS(inode, pos, length, flags, ops, actor, caller), 149*4882a593Smuzhiyun TP_STRUCT__entry( 150*4882a593Smuzhiyun __field(dev_t, dev) 151*4882a593Smuzhiyun __field(u64, ino) 152*4882a593Smuzhiyun __field(loff_t, pos) 153*4882a593Smuzhiyun __field(loff_t, length) 154*4882a593Smuzhiyun __field(unsigned int, flags) 155*4882a593Smuzhiyun __field(const void *, ops) 156*4882a593Smuzhiyun __field(void *, actor) 157*4882a593Smuzhiyun __field(unsigned long, caller) 158*4882a593Smuzhiyun ), 159*4882a593Smuzhiyun TP_fast_assign( 160*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 161*4882a593Smuzhiyun __entry->ino = inode->i_ino; 162*4882a593Smuzhiyun __entry->pos = pos; 163*4882a593Smuzhiyun __entry->length = length; 164*4882a593Smuzhiyun __entry->flags = flags; 165*4882a593Smuzhiyun __entry->ops = ops; 166*4882a593Smuzhiyun __entry->actor = actor; 167*4882a593Smuzhiyun __entry->caller = caller; 168*4882a593Smuzhiyun ), 169*4882a593Smuzhiyun TP_printk("dev %d:%d ino 0x%llx pos %lld length %lld flags %s (0x%x) " 170*4882a593Smuzhiyun "ops %ps caller %pS actor %ps", 171*4882a593Smuzhiyun MAJOR(__entry->dev), MINOR(__entry->dev), 172*4882a593Smuzhiyun __entry->ino, 173*4882a593Smuzhiyun __entry->pos, 174*4882a593Smuzhiyun __entry->length, 175*4882a593Smuzhiyun __print_flags(__entry->flags, "|", IOMAP_FLAGS_STRINGS), 176*4882a593Smuzhiyun __entry->flags, 177*4882a593Smuzhiyun __entry->ops, 178*4882a593Smuzhiyun (void *)__entry->caller, 179*4882a593Smuzhiyun __entry->actor) 180*4882a593Smuzhiyun ); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #endif /* _IOMAP_TRACE_H */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 185*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 186*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace 187*4882a593Smuzhiyun #include <trace/define_trace.h> 188