0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM fs_dax
0004
0005 #if !defined(_TRACE_FS_DAX_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_FS_DAX_H
0007
0008 #include <linux/tracepoint.h>
0009
0010 DECLARE_EVENT_CLASS(dax_pmd_fault_class,
0011 TP_PROTO(struct inode *inode, struct vm_fault *vmf,
0012 pgoff_t max_pgoff, int result),
0013 TP_ARGS(inode, vmf, max_pgoff, result),
0014 TP_STRUCT__entry(
0015 __field(unsigned long, ino)
0016 __field(unsigned long, vm_start)
0017 __field(unsigned long, vm_end)
0018 __field(unsigned long, vm_flags)
0019 __field(unsigned long, address)
0020 __field(pgoff_t, pgoff)
0021 __field(pgoff_t, max_pgoff)
0022 __field(dev_t, dev)
0023 __field(unsigned int, flags)
0024 __field(int, result)
0025 ),
0026 TP_fast_assign(
0027 __entry->dev = inode->i_sb->s_dev;
0028 __entry->ino = inode->i_ino;
0029 __entry->vm_start = vmf->vma->vm_start;
0030 __entry->vm_end = vmf->vma->vm_end;
0031 __entry->vm_flags = vmf->vma->vm_flags;
0032 __entry->address = vmf->address;
0033 __entry->flags = vmf->flags;
0034 __entry->pgoff = vmf->pgoff;
0035 __entry->max_pgoff = max_pgoff;
0036 __entry->result = result;
0037 ),
0038 TP_printk("dev %d:%d ino %#lx %s %s address %#lx vm_start "
0039 "%#lx vm_end %#lx pgoff %#lx max_pgoff %#lx %s",
0040 MAJOR(__entry->dev),
0041 MINOR(__entry->dev),
0042 __entry->ino,
0043 __entry->vm_flags & VM_SHARED ? "shared" : "private",
0044 __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE),
0045 __entry->address,
0046 __entry->vm_start,
0047 __entry->vm_end,
0048 __entry->pgoff,
0049 __entry->max_pgoff,
0050 __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE)
0051 )
0052 )
0053
0054 #define DEFINE_PMD_FAULT_EVENT(name) \
0055 DEFINE_EVENT(dax_pmd_fault_class, name, \
0056 TP_PROTO(struct inode *inode, struct vm_fault *vmf, \
0057 pgoff_t max_pgoff, int result), \
0058 TP_ARGS(inode, vmf, max_pgoff, result))
0059
0060 DEFINE_PMD_FAULT_EVENT(dax_pmd_fault);
0061 DEFINE_PMD_FAULT_EVENT(dax_pmd_fault_done);
0062
0063 DECLARE_EVENT_CLASS(dax_pmd_load_hole_class,
0064 TP_PROTO(struct inode *inode, struct vm_fault *vmf,
0065 struct page *zero_page,
0066 void *radix_entry),
0067 TP_ARGS(inode, vmf, zero_page, radix_entry),
0068 TP_STRUCT__entry(
0069 __field(unsigned long, ino)
0070 __field(unsigned long, vm_flags)
0071 __field(unsigned long, address)
0072 __field(struct page *, zero_page)
0073 __field(void *, radix_entry)
0074 __field(dev_t, dev)
0075 ),
0076 TP_fast_assign(
0077 __entry->dev = inode->i_sb->s_dev;
0078 __entry->ino = inode->i_ino;
0079 __entry->vm_flags = vmf->vma->vm_flags;
0080 __entry->address = vmf->address;
0081 __entry->zero_page = zero_page;
0082 __entry->radix_entry = radix_entry;
0083 ),
0084 TP_printk("dev %d:%d ino %#lx %s address %#lx zero_page %p "
0085 "radix_entry %#lx",
0086 MAJOR(__entry->dev),
0087 MINOR(__entry->dev),
0088 __entry->ino,
0089 __entry->vm_flags & VM_SHARED ? "shared" : "private",
0090 __entry->address,
0091 __entry->zero_page,
0092 (unsigned long)__entry->radix_entry
0093 )
0094 )
0095
0096 #define DEFINE_PMD_LOAD_HOLE_EVENT(name) \
0097 DEFINE_EVENT(dax_pmd_load_hole_class, name, \
0098 TP_PROTO(struct inode *inode, struct vm_fault *vmf, \
0099 struct page *zero_page, void *radix_entry), \
0100 TP_ARGS(inode, vmf, zero_page, radix_entry))
0101
0102 DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole);
0103 DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback);
0104
0105 DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class,
0106 TP_PROTO(struct inode *inode, struct vm_fault *vmf,
0107 long length, pfn_t pfn, void *radix_entry),
0108 TP_ARGS(inode, vmf, length, pfn, radix_entry),
0109 TP_STRUCT__entry(
0110 __field(unsigned long, ino)
0111 __field(unsigned long, vm_flags)
0112 __field(unsigned long, address)
0113 __field(long, length)
0114 __field(u64, pfn_val)
0115 __field(void *, radix_entry)
0116 __field(dev_t, dev)
0117 __field(int, write)
0118 ),
0119 TP_fast_assign(
0120 __entry->dev = inode->i_sb->s_dev;
0121 __entry->ino = inode->i_ino;
0122 __entry->vm_flags = vmf->vma->vm_flags;
0123 __entry->address = vmf->address;
0124 __entry->write = vmf->flags & FAULT_FLAG_WRITE;
0125 __entry->length = length;
0126 __entry->pfn_val = pfn.val;
0127 __entry->radix_entry = radix_entry;
0128 ),
0129 TP_printk("dev %d:%d ino %#lx %s %s address %#lx length %#lx "
0130 "pfn %#llx %s radix_entry %#lx",
0131 MAJOR(__entry->dev),
0132 MINOR(__entry->dev),
0133 __entry->ino,
0134 __entry->vm_flags & VM_SHARED ? "shared" : "private",
0135 __entry->write ? "write" : "read",
0136 __entry->address,
0137 __entry->length,
0138 __entry->pfn_val & ~PFN_FLAGS_MASK,
0139 __print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|",
0140 PFN_FLAGS_TRACE),
0141 (unsigned long)__entry->radix_entry
0142 )
0143 )
0144
0145 #define DEFINE_PMD_INSERT_MAPPING_EVENT(name) \
0146 DEFINE_EVENT(dax_pmd_insert_mapping_class, name, \
0147 TP_PROTO(struct inode *inode, struct vm_fault *vmf, \
0148 long length, pfn_t pfn, void *radix_entry), \
0149 TP_ARGS(inode, vmf, length, pfn, radix_entry))
0150
0151 DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping);
0152
0153 DECLARE_EVENT_CLASS(dax_pte_fault_class,
0154 TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result),
0155 TP_ARGS(inode, vmf, result),
0156 TP_STRUCT__entry(
0157 __field(unsigned long, ino)
0158 __field(unsigned long, vm_flags)
0159 __field(unsigned long, address)
0160 __field(pgoff_t, pgoff)
0161 __field(dev_t, dev)
0162 __field(unsigned int, flags)
0163 __field(int, result)
0164 ),
0165 TP_fast_assign(
0166 __entry->dev = inode->i_sb->s_dev;
0167 __entry->ino = inode->i_ino;
0168 __entry->vm_flags = vmf->vma->vm_flags;
0169 __entry->address = vmf->address;
0170 __entry->flags = vmf->flags;
0171 __entry->pgoff = vmf->pgoff;
0172 __entry->result = result;
0173 ),
0174 TP_printk("dev %d:%d ino %#lx %s %s address %#lx pgoff %#lx %s",
0175 MAJOR(__entry->dev),
0176 MINOR(__entry->dev),
0177 __entry->ino,
0178 __entry->vm_flags & VM_SHARED ? "shared" : "private",
0179 __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE),
0180 __entry->address,
0181 __entry->pgoff,
0182 __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE)
0183 )
0184 )
0185
0186 #define DEFINE_PTE_FAULT_EVENT(name) \
0187 DEFINE_EVENT(dax_pte_fault_class, name, \
0188 TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result), \
0189 TP_ARGS(inode, vmf, result))
0190
0191 DEFINE_PTE_FAULT_EVENT(dax_pte_fault);
0192 DEFINE_PTE_FAULT_EVENT(dax_pte_fault_done);
0193 DEFINE_PTE_FAULT_EVENT(dax_load_hole);
0194 DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite_no_entry);
0195 DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite);
0196
0197 TRACE_EVENT(dax_insert_mapping,
0198 TP_PROTO(struct inode *inode, struct vm_fault *vmf, void *radix_entry),
0199 TP_ARGS(inode, vmf, radix_entry),
0200 TP_STRUCT__entry(
0201 __field(unsigned long, ino)
0202 __field(unsigned long, vm_flags)
0203 __field(unsigned long, address)
0204 __field(void *, radix_entry)
0205 __field(dev_t, dev)
0206 __field(int, write)
0207 ),
0208 TP_fast_assign(
0209 __entry->dev = inode->i_sb->s_dev;
0210 __entry->ino = inode->i_ino;
0211 __entry->vm_flags = vmf->vma->vm_flags;
0212 __entry->address = vmf->address;
0213 __entry->write = vmf->flags & FAULT_FLAG_WRITE;
0214 __entry->radix_entry = radix_entry;
0215 ),
0216 TP_printk("dev %d:%d ino %#lx %s %s address %#lx radix_entry %#lx",
0217 MAJOR(__entry->dev),
0218 MINOR(__entry->dev),
0219 __entry->ino,
0220 __entry->vm_flags & VM_SHARED ? "shared" : "private",
0221 __entry->write ? "write" : "read",
0222 __entry->address,
0223 (unsigned long)__entry->radix_entry
0224 )
0225 )
0226
0227 DECLARE_EVENT_CLASS(dax_writeback_range_class,
0228 TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),
0229 TP_ARGS(inode, start_index, end_index),
0230 TP_STRUCT__entry(
0231 __field(unsigned long, ino)
0232 __field(pgoff_t, start_index)
0233 __field(pgoff_t, end_index)
0234 __field(dev_t, dev)
0235 ),
0236 TP_fast_assign(
0237 __entry->dev = inode->i_sb->s_dev;
0238 __entry->ino = inode->i_ino;
0239 __entry->start_index = start_index;
0240 __entry->end_index = end_index;
0241 ),
0242 TP_printk("dev %d:%d ino %#lx pgoff %#lx-%#lx",
0243 MAJOR(__entry->dev),
0244 MINOR(__entry->dev),
0245 __entry->ino,
0246 __entry->start_index,
0247 __entry->end_index
0248 )
0249 )
0250
0251 #define DEFINE_WRITEBACK_RANGE_EVENT(name) \
0252 DEFINE_EVENT(dax_writeback_range_class, name, \
0253 TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),\
0254 TP_ARGS(inode, start_index, end_index))
0255
0256 DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range);
0257 DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range_done);
0258
0259 TRACE_EVENT(dax_writeback_one,
0260 TP_PROTO(struct inode *inode, pgoff_t pgoff, pgoff_t pglen),
0261 TP_ARGS(inode, pgoff, pglen),
0262 TP_STRUCT__entry(
0263 __field(unsigned long, ino)
0264 __field(pgoff_t, pgoff)
0265 __field(pgoff_t, pglen)
0266 __field(dev_t, dev)
0267 ),
0268 TP_fast_assign(
0269 __entry->dev = inode->i_sb->s_dev;
0270 __entry->ino = inode->i_ino;
0271 __entry->pgoff = pgoff;
0272 __entry->pglen = pglen;
0273 ),
0274 TP_printk("dev %d:%d ino %#lx pgoff %#lx pglen %#lx",
0275 MAJOR(__entry->dev),
0276 MINOR(__entry->dev),
0277 __entry->ino,
0278 __entry->pgoff,
0279 __entry->pglen
0280 )
0281 )
0282
0283 #endif
0284
0285
0286 #include <trace/define_trace.h>