Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (c) 2009-2021 Christoph Hellwig
0004  *
0005  * NOTE: none of these tracepoints shall be considered a stable kernel ABI
0006  * as they can change at any time.
0007  *
0008  * Current conventions for printing numbers measuring specific units:
0009  *
0010  * offset: byte offset into a subcomponent of a file operation
0011  * pos: file offset, in bytes
0012  * length: length of a file operation, in bytes
0013  * ino: inode number
0014  *
0015  * Numbers describing space allocations should be formatted in hexadecimal.
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 /* _IOMAP_TRACE_H */
0186 
0187 #undef TRACE_INCLUDE_PATH
0188 #define TRACE_INCLUDE_PATH .
0189 #define TRACE_INCLUDE_FILE trace
0190 #include <trace/define_trace.h>