0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #undef TRACE_SYSTEM
0018 #define TRACE_SYSTEM iomap
0019
0020 #if !defined(_IOMAP_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
0021 #define _IOMAP_TRACE_H
0022
0023 #include <linux/tracepoint.h>
0024
0025 struct inode;
0026
0027 DECLARE_EVENT_CLASS(iomap_readpage_class,
0028 TP_PROTO(struct inode *inode, int nr_pages),
0029 TP_ARGS(inode, nr_pages),
0030 TP_STRUCT__entry(
0031 __field(dev_t, dev)
0032 __field(u64, ino)
0033 __field(int, nr_pages)
0034 ),
0035 TP_fast_assign(
0036 __entry->dev = inode->i_sb->s_dev;
0037 __entry->ino = inode->i_ino;
0038 __entry->nr_pages = nr_pages;
0039 ),
0040 TP_printk("dev %d:%d ino 0x%llx nr_pages %d",
0041 MAJOR(__entry->dev), MINOR(__entry->dev),
0042 __entry->ino,
0043 __entry->nr_pages)
0044 )
0045
0046 #define DEFINE_READPAGE_EVENT(name) \
0047 DEFINE_EVENT(iomap_readpage_class, name, \
0048 TP_PROTO(struct inode *inode, int nr_pages), \
0049 TP_ARGS(inode, nr_pages))
0050 DEFINE_READPAGE_EVENT(iomap_readpage);
0051 DEFINE_READPAGE_EVENT(iomap_readahead);
0052
0053 DECLARE_EVENT_CLASS(iomap_range_class,
0054 TP_PROTO(struct inode *inode, loff_t off, u64 len),
0055 TP_ARGS(inode, off, len),
0056 TP_STRUCT__entry(
0057 __field(dev_t, dev)
0058 __field(u64, ino)
0059 __field(loff_t, size)
0060 __field(loff_t, offset)
0061 __field(u64, length)
0062 ),
0063 TP_fast_assign(
0064 __entry->dev = inode->i_sb->s_dev;
0065 __entry->ino = inode->i_ino;
0066 __entry->size = i_size_read(inode);
0067 __entry->offset = off;
0068 __entry->length = len;
0069 ),
0070 TP_printk("dev %d:%d ino 0x%llx size 0x%llx offset 0x%llx length 0x%llx",
0071 MAJOR(__entry->dev), MINOR(__entry->dev),
0072 __entry->ino,
0073 __entry->size,
0074 __entry->offset,
0075 __entry->length)
0076 )
0077
0078 #define DEFINE_RANGE_EVENT(name) \
0079 DEFINE_EVENT(iomap_range_class, name, \
0080 TP_PROTO(struct inode *inode, loff_t off, u64 len),\
0081 TP_ARGS(inode, off, len))
0082 DEFINE_RANGE_EVENT(iomap_writepage);
0083 DEFINE_RANGE_EVENT(iomap_release_folio);
0084 DEFINE_RANGE_EVENT(iomap_invalidate_folio);
0085 DEFINE_RANGE_EVENT(iomap_dio_invalidate_fail);
0086
0087 #define IOMAP_TYPE_STRINGS \
0088 { IOMAP_HOLE, "HOLE" }, \
0089 { IOMAP_DELALLOC, "DELALLOC" }, \
0090 { IOMAP_MAPPED, "MAPPED" }, \
0091 { IOMAP_UNWRITTEN, "UNWRITTEN" }, \
0092 { IOMAP_INLINE, "INLINE" }
0093
0094 #define IOMAP_FLAGS_STRINGS \
0095 { IOMAP_WRITE, "WRITE" }, \
0096 { IOMAP_ZERO, "ZERO" }, \
0097 { IOMAP_REPORT, "REPORT" }, \
0098 { IOMAP_FAULT, "FAULT" }, \
0099 { IOMAP_DIRECT, "DIRECT" }, \
0100 { IOMAP_NOWAIT, "NOWAIT" }
0101
0102 #define IOMAP_F_FLAGS_STRINGS \
0103 { IOMAP_F_NEW, "NEW" }, \
0104 { IOMAP_F_DIRTY, "DIRTY" }, \
0105 { IOMAP_F_SHARED, "SHARED" }, \
0106 { IOMAP_F_MERGED, "MERGED" }, \
0107 { IOMAP_F_BUFFER_HEAD, "BH" }, \
0108 { IOMAP_F_SIZE_CHANGED, "SIZE_CHANGED" }
0109
0110 DECLARE_EVENT_CLASS(iomap_class,
0111 TP_PROTO(struct inode *inode, struct iomap *iomap),
0112 TP_ARGS(inode, iomap),
0113 TP_STRUCT__entry(
0114 __field(dev_t, dev)
0115 __field(u64, ino)
0116 __field(u64, addr)
0117 __field(loff_t, offset)
0118 __field(u64, length)
0119 __field(u16, type)
0120 __field(u16, flags)
0121 __field(dev_t, bdev)
0122 ),
0123 TP_fast_assign(
0124 __entry->dev = inode->i_sb->s_dev;
0125 __entry->ino = inode->i_ino;
0126 __entry->addr = iomap->addr;
0127 __entry->offset = iomap->offset;
0128 __entry->length = iomap->length;
0129 __entry->type = iomap->type;
0130 __entry->flags = iomap->flags;
0131 __entry->bdev = iomap->bdev ? iomap->bdev->bd_dev : 0;
0132 ),
0133 TP_printk("dev %d:%d ino 0x%llx bdev %d:%d addr 0x%llx offset 0x%llx "
0134 "length 0x%llx type %s flags %s",
0135 MAJOR(__entry->dev), MINOR(__entry->dev),
0136 __entry->ino,
0137 MAJOR(__entry->bdev), MINOR(__entry->bdev),
0138 __entry->addr,
0139 __entry->offset,
0140 __entry->length,
0141 __print_symbolic(__entry->type, IOMAP_TYPE_STRINGS),
0142 __print_flags(__entry->flags, "|", IOMAP_F_FLAGS_STRINGS))
0143 )
0144
0145 #define DEFINE_IOMAP_EVENT(name) \
0146 DEFINE_EVENT(iomap_class, name, \
0147 TP_PROTO(struct inode *inode, struct iomap *iomap), \
0148 TP_ARGS(inode, iomap))
0149 DEFINE_IOMAP_EVENT(iomap_iter_dstmap);
0150 DEFINE_IOMAP_EVENT(iomap_iter_srcmap);
0151
0152 TRACE_EVENT(iomap_iter,
0153 TP_PROTO(struct iomap_iter *iter, const void *ops,
0154 unsigned long caller),
0155 TP_ARGS(iter, ops, caller),
0156 TP_STRUCT__entry(
0157 __field(dev_t, dev)
0158 __field(u64, ino)
0159 __field(loff_t, pos)
0160 __field(u64, length)
0161 __field(unsigned int, flags)
0162 __field(const void *, ops)
0163 __field(unsigned long, caller)
0164 ),
0165 TP_fast_assign(
0166 __entry->dev = iter->inode->i_sb->s_dev;
0167 __entry->ino = iter->inode->i_ino;
0168 __entry->pos = iter->pos;
0169 __entry->length = iomap_length(iter);
0170 __entry->flags = iter->flags;
0171 __entry->ops = ops;
0172 __entry->caller = caller;
0173 ),
0174 TP_printk("dev %d:%d ino 0x%llx pos 0x%llx length 0x%llx flags %s (0x%x) ops %ps caller %pS",
0175 MAJOR(__entry->dev), MINOR(__entry->dev),
0176 __entry->ino,
0177 __entry->pos,
0178 __entry->length,
0179 __print_flags(__entry->flags, "|", IOMAP_FLAGS_STRINGS),
0180 __entry->flags,
0181 __entry->ops,
0182 (void *)__entry->caller)
0183 );
0184
0185 #endif
0186
0187 #undef TRACE_INCLUDE_PATH
0188 #define TRACE_INCLUDE_PATH .
0189 #define TRACE_INCLUDE_FILE trace
0190 #include <trace/define_trace.h>