1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM fs_dax 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_FS_DAX_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_FS_DAX_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/tracepoint.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dax_pmd_fault_class, 11*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, 12*4882a593Smuzhiyun pgoff_t max_pgoff, int result), 13*4882a593Smuzhiyun TP_ARGS(inode, vmf, max_pgoff, result), 14*4882a593Smuzhiyun TP_STRUCT__entry( 15*4882a593Smuzhiyun __field(unsigned long, ino) 16*4882a593Smuzhiyun __field(unsigned long, vm_start) 17*4882a593Smuzhiyun __field(unsigned long, vm_end) 18*4882a593Smuzhiyun __field(unsigned long, vm_flags) 19*4882a593Smuzhiyun __field(unsigned long, address) 20*4882a593Smuzhiyun __field(pgoff_t, pgoff) 21*4882a593Smuzhiyun __field(pgoff_t, max_pgoff) 22*4882a593Smuzhiyun __field(dev_t, dev) 23*4882a593Smuzhiyun __field(unsigned int, flags) 24*4882a593Smuzhiyun __field(int, result) 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->vm_start = vmf->vma->vm_start; 30*4882a593Smuzhiyun __entry->vm_end = vmf->vma->vm_end; 31*4882a593Smuzhiyun __entry->vm_flags = vmf->vma->vm_flags; 32*4882a593Smuzhiyun __entry->address = vmf->address; 33*4882a593Smuzhiyun __entry->flags = vmf->flags; 34*4882a593Smuzhiyun __entry->pgoff = vmf->pgoff; 35*4882a593Smuzhiyun __entry->max_pgoff = max_pgoff; 36*4882a593Smuzhiyun __entry->result = result; 37*4882a593Smuzhiyun ), 38*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx %s %s address %#lx vm_start " 39*4882a593Smuzhiyun "%#lx vm_end %#lx pgoff %#lx max_pgoff %#lx %s", 40*4882a593Smuzhiyun MAJOR(__entry->dev), 41*4882a593Smuzhiyun MINOR(__entry->dev), 42*4882a593Smuzhiyun __entry->ino, 43*4882a593Smuzhiyun __entry->vm_flags & VM_SHARED ? "shared" : "private", 44*4882a593Smuzhiyun __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE), 45*4882a593Smuzhiyun __entry->address, 46*4882a593Smuzhiyun __entry->vm_start, 47*4882a593Smuzhiyun __entry->vm_end, 48*4882a593Smuzhiyun __entry->pgoff, 49*4882a593Smuzhiyun __entry->max_pgoff, 50*4882a593Smuzhiyun __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE) 51*4882a593Smuzhiyun ) 52*4882a593Smuzhiyun ) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define DEFINE_PMD_FAULT_EVENT(name) \ 55*4882a593Smuzhiyun DEFINE_EVENT(dax_pmd_fault_class, name, \ 56*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, \ 57*4882a593Smuzhiyun pgoff_t max_pgoff, int result), \ 58*4882a593Smuzhiyun TP_ARGS(inode, vmf, max_pgoff, result)) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun DEFINE_PMD_FAULT_EVENT(dax_pmd_fault); 61*4882a593Smuzhiyun DEFINE_PMD_FAULT_EVENT(dax_pmd_fault_done); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dax_pmd_load_hole_class, 64*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, 65*4882a593Smuzhiyun struct page *zero_page, 66*4882a593Smuzhiyun void *radix_entry), 67*4882a593Smuzhiyun TP_ARGS(inode, vmf, zero_page, radix_entry), 68*4882a593Smuzhiyun TP_STRUCT__entry( 69*4882a593Smuzhiyun __field(unsigned long, ino) 70*4882a593Smuzhiyun __field(unsigned long, vm_flags) 71*4882a593Smuzhiyun __field(unsigned long, address) 72*4882a593Smuzhiyun __field(struct page *, zero_page) 73*4882a593Smuzhiyun __field(void *, radix_entry) 74*4882a593Smuzhiyun __field(dev_t, dev) 75*4882a593Smuzhiyun ), 76*4882a593Smuzhiyun TP_fast_assign( 77*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 78*4882a593Smuzhiyun __entry->ino = inode->i_ino; 79*4882a593Smuzhiyun __entry->vm_flags = vmf->vma->vm_flags; 80*4882a593Smuzhiyun __entry->address = vmf->address; 81*4882a593Smuzhiyun __entry->zero_page = zero_page; 82*4882a593Smuzhiyun __entry->radix_entry = radix_entry; 83*4882a593Smuzhiyun ), 84*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx %s address %#lx zero_page %p " 85*4882a593Smuzhiyun "radix_entry %#lx", 86*4882a593Smuzhiyun MAJOR(__entry->dev), 87*4882a593Smuzhiyun MINOR(__entry->dev), 88*4882a593Smuzhiyun __entry->ino, 89*4882a593Smuzhiyun __entry->vm_flags & VM_SHARED ? "shared" : "private", 90*4882a593Smuzhiyun __entry->address, 91*4882a593Smuzhiyun __entry->zero_page, 92*4882a593Smuzhiyun (unsigned long)__entry->radix_entry 93*4882a593Smuzhiyun ) 94*4882a593Smuzhiyun ) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define DEFINE_PMD_LOAD_HOLE_EVENT(name) \ 97*4882a593Smuzhiyun DEFINE_EVENT(dax_pmd_load_hole_class, name, \ 98*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, \ 99*4882a593Smuzhiyun struct page *zero_page, void *radix_entry), \ 100*4882a593Smuzhiyun TP_ARGS(inode, vmf, zero_page, radix_entry)) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole); 103*4882a593Smuzhiyun DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dax_pmd_insert_mapping_class, 106*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, 107*4882a593Smuzhiyun long length, pfn_t pfn, void *radix_entry), 108*4882a593Smuzhiyun TP_ARGS(inode, vmf, length, pfn, radix_entry), 109*4882a593Smuzhiyun TP_STRUCT__entry( 110*4882a593Smuzhiyun __field(unsigned long, ino) 111*4882a593Smuzhiyun __field(unsigned long, vm_flags) 112*4882a593Smuzhiyun __field(unsigned long, address) 113*4882a593Smuzhiyun __field(long, length) 114*4882a593Smuzhiyun __field(u64, pfn_val) 115*4882a593Smuzhiyun __field(void *, radix_entry) 116*4882a593Smuzhiyun __field(dev_t, dev) 117*4882a593Smuzhiyun __field(int, write) 118*4882a593Smuzhiyun ), 119*4882a593Smuzhiyun TP_fast_assign( 120*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 121*4882a593Smuzhiyun __entry->ino = inode->i_ino; 122*4882a593Smuzhiyun __entry->vm_flags = vmf->vma->vm_flags; 123*4882a593Smuzhiyun __entry->address = vmf->address; 124*4882a593Smuzhiyun __entry->write = vmf->flags & FAULT_FLAG_WRITE; 125*4882a593Smuzhiyun __entry->length = length; 126*4882a593Smuzhiyun __entry->pfn_val = pfn.val; 127*4882a593Smuzhiyun __entry->radix_entry = radix_entry; 128*4882a593Smuzhiyun ), 129*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx %s %s address %#lx length %#lx " 130*4882a593Smuzhiyun "pfn %#llx %s radix_entry %#lx", 131*4882a593Smuzhiyun MAJOR(__entry->dev), 132*4882a593Smuzhiyun MINOR(__entry->dev), 133*4882a593Smuzhiyun __entry->ino, 134*4882a593Smuzhiyun __entry->vm_flags & VM_SHARED ? "shared" : "private", 135*4882a593Smuzhiyun __entry->write ? "write" : "read", 136*4882a593Smuzhiyun __entry->address, 137*4882a593Smuzhiyun __entry->length, 138*4882a593Smuzhiyun __entry->pfn_val & ~PFN_FLAGS_MASK, 139*4882a593Smuzhiyun __print_flags_u64(__entry->pfn_val & PFN_FLAGS_MASK, "|", 140*4882a593Smuzhiyun PFN_FLAGS_TRACE), 141*4882a593Smuzhiyun (unsigned long)__entry->radix_entry 142*4882a593Smuzhiyun ) 143*4882a593Smuzhiyun ) 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define DEFINE_PMD_INSERT_MAPPING_EVENT(name) \ 146*4882a593Smuzhiyun DEFINE_EVENT(dax_pmd_insert_mapping_class, name, \ 147*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, \ 148*4882a593Smuzhiyun long length, pfn_t pfn, void *radix_entry), \ 149*4882a593Smuzhiyun TP_ARGS(inode, vmf, length, pfn, radix_entry)) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dax_pte_fault_class, 154*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result), 155*4882a593Smuzhiyun TP_ARGS(inode, vmf, result), 156*4882a593Smuzhiyun TP_STRUCT__entry( 157*4882a593Smuzhiyun __field(unsigned long, ino) 158*4882a593Smuzhiyun __field(unsigned long, vm_flags) 159*4882a593Smuzhiyun __field(unsigned long, address) 160*4882a593Smuzhiyun __field(pgoff_t, pgoff) 161*4882a593Smuzhiyun __field(dev_t, dev) 162*4882a593Smuzhiyun __field(unsigned int, flags) 163*4882a593Smuzhiyun __field(int, result) 164*4882a593Smuzhiyun ), 165*4882a593Smuzhiyun TP_fast_assign( 166*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 167*4882a593Smuzhiyun __entry->ino = inode->i_ino; 168*4882a593Smuzhiyun __entry->vm_flags = vmf->vma->vm_flags; 169*4882a593Smuzhiyun __entry->address = vmf->address; 170*4882a593Smuzhiyun __entry->flags = vmf->flags; 171*4882a593Smuzhiyun __entry->pgoff = vmf->pgoff; 172*4882a593Smuzhiyun __entry->result = result; 173*4882a593Smuzhiyun ), 174*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx %s %s address %#lx pgoff %#lx %s", 175*4882a593Smuzhiyun MAJOR(__entry->dev), 176*4882a593Smuzhiyun MINOR(__entry->dev), 177*4882a593Smuzhiyun __entry->ino, 178*4882a593Smuzhiyun __entry->vm_flags & VM_SHARED ? "shared" : "private", 179*4882a593Smuzhiyun __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE), 180*4882a593Smuzhiyun __entry->address, 181*4882a593Smuzhiyun __entry->pgoff, 182*4882a593Smuzhiyun __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE) 183*4882a593Smuzhiyun ) 184*4882a593Smuzhiyun ) 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define DEFINE_PTE_FAULT_EVENT(name) \ 187*4882a593Smuzhiyun DEFINE_EVENT(dax_pte_fault_class, name, \ 188*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result), \ 189*4882a593Smuzhiyun TP_ARGS(inode, vmf, result)) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun DEFINE_PTE_FAULT_EVENT(dax_pte_fault); 192*4882a593Smuzhiyun DEFINE_PTE_FAULT_EVENT(dax_pte_fault_done); 193*4882a593Smuzhiyun DEFINE_PTE_FAULT_EVENT(dax_load_hole); 194*4882a593Smuzhiyun DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite_no_entry); 195*4882a593Smuzhiyun DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite); 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun TRACE_EVENT(dax_insert_mapping, 198*4882a593Smuzhiyun TP_PROTO(struct inode *inode, struct vm_fault *vmf, void *radix_entry), 199*4882a593Smuzhiyun TP_ARGS(inode, vmf, radix_entry), 200*4882a593Smuzhiyun TP_STRUCT__entry( 201*4882a593Smuzhiyun __field(unsigned long, ino) 202*4882a593Smuzhiyun __field(unsigned long, vm_flags) 203*4882a593Smuzhiyun __field(unsigned long, address) 204*4882a593Smuzhiyun __field(void *, radix_entry) 205*4882a593Smuzhiyun __field(dev_t, dev) 206*4882a593Smuzhiyun __field(int, write) 207*4882a593Smuzhiyun ), 208*4882a593Smuzhiyun TP_fast_assign( 209*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 210*4882a593Smuzhiyun __entry->ino = inode->i_ino; 211*4882a593Smuzhiyun __entry->vm_flags = vmf->vma->vm_flags; 212*4882a593Smuzhiyun __entry->address = vmf->address; 213*4882a593Smuzhiyun __entry->write = vmf->flags & FAULT_FLAG_WRITE; 214*4882a593Smuzhiyun __entry->radix_entry = radix_entry; 215*4882a593Smuzhiyun ), 216*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx %s %s address %#lx radix_entry %#lx", 217*4882a593Smuzhiyun MAJOR(__entry->dev), 218*4882a593Smuzhiyun MINOR(__entry->dev), 219*4882a593Smuzhiyun __entry->ino, 220*4882a593Smuzhiyun __entry->vm_flags & VM_SHARED ? "shared" : "private", 221*4882a593Smuzhiyun __entry->write ? "write" : "read", 222*4882a593Smuzhiyun __entry->address, 223*4882a593Smuzhiyun (unsigned long)__entry->radix_entry 224*4882a593Smuzhiyun ) 225*4882a593Smuzhiyun ) 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dax_writeback_range_class, 228*4882a593Smuzhiyun TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index), 229*4882a593Smuzhiyun TP_ARGS(inode, start_index, end_index), 230*4882a593Smuzhiyun TP_STRUCT__entry( 231*4882a593Smuzhiyun __field(unsigned long, ino) 232*4882a593Smuzhiyun __field(pgoff_t, start_index) 233*4882a593Smuzhiyun __field(pgoff_t, end_index) 234*4882a593Smuzhiyun __field(dev_t, dev) 235*4882a593Smuzhiyun ), 236*4882a593Smuzhiyun TP_fast_assign( 237*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 238*4882a593Smuzhiyun __entry->ino = inode->i_ino; 239*4882a593Smuzhiyun __entry->start_index = start_index; 240*4882a593Smuzhiyun __entry->end_index = end_index; 241*4882a593Smuzhiyun ), 242*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx pgoff %#lx-%#lx", 243*4882a593Smuzhiyun MAJOR(__entry->dev), 244*4882a593Smuzhiyun MINOR(__entry->dev), 245*4882a593Smuzhiyun __entry->ino, 246*4882a593Smuzhiyun __entry->start_index, 247*4882a593Smuzhiyun __entry->end_index 248*4882a593Smuzhiyun ) 249*4882a593Smuzhiyun ) 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun #define DEFINE_WRITEBACK_RANGE_EVENT(name) \ 252*4882a593Smuzhiyun DEFINE_EVENT(dax_writeback_range_class, name, \ 253*4882a593Smuzhiyun TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),\ 254*4882a593Smuzhiyun TP_ARGS(inode, start_index, end_index)) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range); 257*4882a593Smuzhiyun DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range_done); 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun TRACE_EVENT(dax_writeback_one, 260*4882a593Smuzhiyun TP_PROTO(struct inode *inode, pgoff_t pgoff, pgoff_t pglen), 261*4882a593Smuzhiyun TP_ARGS(inode, pgoff, pglen), 262*4882a593Smuzhiyun TP_STRUCT__entry( 263*4882a593Smuzhiyun __field(unsigned long, ino) 264*4882a593Smuzhiyun __field(pgoff_t, pgoff) 265*4882a593Smuzhiyun __field(pgoff_t, pglen) 266*4882a593Smuzhiyun __field(dev_t, dev) 267*4882a593Smuzhiyun ), 268*4882a593Smuzhiyun TP_fast_assign( 269*4882a593Smuzhiyun __entry->dev = inode->i_sb->s_dev; 270*4882a593Smuzhiyun __entry->ino = inode->i_ino; 271*4882a593Smuzhiyun __entry->pgoff = pgoff; 272*4882a593Smuzhiyun __entry->pglen = pglen; 273*4882a593Smuzhiyun ), 274*4882a593Smuzhiyun TP_printk("dev %d:%d ino %#lx pgoff %#lx pglen %#lx", 275*4882a593Smuzhiyun MAJOR(__entry->dev), 276*4882a593Smuzhiyun MINOR(__entry->dev), 277*4882a593Smuzhiyun __entry->ino, 278*4882a593Smuzhiyun __entry->pgoff, 279*4882a593Smuzhiyun __entry->pglen 280*4882a593Smuzhiyun ) 281*4882a593Smuzhiyun ) 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #endif /* _TRACE_FS_DAX_H */ 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun /* This part must be outside protection */ 286*4882a593Smuzhiyun #include <trace/define_trace.h> 287