1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM fs_dax 4 5 #if !defined(_TRACE_FS_DAX_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_FS_DAX_H 7 8 #include <linux/tracepoint.h> 9 10 DECLARE_EVENT_CLASS(dax_pmd_fault_class, 11 TP_PROTO(struct inode *inode, struct vm_fault *vmf, 12 pgoff_t max_pgoff, int result), 13 TP_ARGS(inode, vmf, max_pgoff, result), 14 TP_STRUCT__entry( 15 __field(unsigned long, ino) 16 __field(unsigned long, vm_start) 17 __field(unsigned long, vm_end) 18 __field(unsigned long, vm_flags) 19 __field(unsigned long, address) 20 __field(pgoff_t, pgoff) 21 __field(pgoff_t, max_pgoff) 22 __field(dev_t, dev) 23 __field(unsigned int, flags) 24 __field(int, result) 25 ), 26 TP_fast_assign( 27 __entry->dev = inode->i_sb->s_dev; 28 __entry->ino = inode->i_ino; 29 __entry->vm_start = vmf->vma->vm_start; 30 __entry->vm_end = vmf->vma->vm_end; 31 __entry->vm_flags = vmf->vma->vm_flags; 32 __entry->address = vmf->address; 33 __entry->flags = vmf->flags; 34 __entry->pgoff = vmf->pgoff; 35 __entry->max_pgoff = max_pgoff; 36 __entry->result = result; 37 ), 38 TP_printk("dev %d:%d ino %#lx %s %s address %#lx vm_start " 39 "%#lx vm_end %#lx pgoff %#lx max_pgoff %#lx %s", 40 MAJOR(__entry->dev), 41 MINOR(__entry->dev), 42 __entry->ino, 43 __entry->vm_flags & VM_SHARED ? "shared" : "private", 44 __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE), 45 __entry->address, 46 __entry->vm_start, 47 __entry->vm_end, 48 __entry->pgoff, 49 __entry->max_pgoff, 50 __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE) 51 ) 52 ) 53 54 #define DEFINE_PMD_FAULT_EVENT(name) \ 55 DEFINE_EVENT(dax_pmd_fault_class, name, \ 56 TP_PROTO(struct inode *inode, struct vm_fault *vmf, \ 57 pgoff_t max_pgoff, int result), \ 58 TP_ARGS(inode, vmf, max_pgoff, result)) 59 60 DEFINE_PMD_FAULT_EVENT(dax_pmd_fault); 61 DEFINE_PMD_FAULT_EVENT(dax_pmd_fault_done); 62 63 DECLARE_EVENT_CLASS(dax_pmd_load_hole_class, 64 TP_PROTO(struct inode *inode, struct vm_fault *vmf, 65 struct folio *zero_folio, 66 void *radix_entry), 67 TP_ARGS(inode, vmf, zero_folio, radix_entry), 68 TP_STRUCT__entry( 69 __field(unsigned long, ino) 70 __field(unsigned long, vm_flags) 71 __field(unsigned long, address) 72 __field(struct folio *, zero_folio) 73 __field(void *, radix_entry) 74 __field(dev_t, dev) 75 ), 76 TP_fast_assign( 77 __entry->dev = inode->i_sb->s_dev; 78 __entry->ino = inode->i_ino; 79 __entry->vm_flags = vmf->vma->vm_flags; 80 __entry->address = vmf->address; 81 __entry->zero_folio = zero_folio; 82 __entry->radix_entry = radix_entry; 83 ), 84 TP_printk("dev %d:%d ino %#lx %s address %#lx zero_folio %p " 85 "radix_entry %#lx", 86 MAJOR(__entry->dev), 87 MINOR(__entry->dev), 88 __entry->ino, 89 __entry->vm_flags & VM_SHARED ? "shared" : "private", 90 __entry->address, 91 __entry->zero_folio, 92 (unsigned long)__entry->radix_entry 93 ) 94 ) 95 96 #define DEFINE_PMD_LOAD_HOLE_EVENT(name) \ 97 DEFINE_EVENT(dax_pmd_load_hole_class, name, \ 98 TP_PROTO(struct inode *inode, struct vm_fault *vmf, \ 99 struct folio *zero_folio, void *radix_entry), \ 100 TP_ARGS(inode, vmf, zero_folio, radix_entry)) 101 102 DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole); 103 DEFINE_PMD_LOAD_HOLE_EVENT(dax_pmd_load_hole_fallback); 104 105 DECLARE_EVENT_CLASS(dax_pte_fault_class, 106 TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result), 107 TP_ARGS(inode, vmf, result), 108 TP_STRUCT__entry( 109 __field(unsigned long, ino) 110 __field(unsigned long, vm_flags) 111 __field(unsigned long, address) 112 __field(pgoff_t, pgoff) 113 __field(dev_t, dev) 114 __field(unsigned int, flags) 115 __field(int, result) 116 ), 117 TP_fast_assign( 118 __entry->dev = inode->i_sb->s_dev; 119 __entry->ino = inode->i_ino; 120 __entry->vm_flags = vmf->vma->vm_flags; 121 __entry->address = vmf->address; 122 __entry->flags = vmf->flags; 123 __entry->pgoff = vmf->pgoff; 124 __entry->result = result; 125 ), 126 TP_printk("dev %d:%d ino %#lx %s %s address %#lx pgoff %#lx %s", 127 MAJOR(__entry->dev), 128 MINOR(__entry->dev), 129 __entry->ino, 130 __entry->vm_flags & VM_SHARED ? "shared" : "private", 131 __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE), 132 __entry->address, 133 __entry->pgoff, 134 __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE) 135 ) 136 ) 137 138 #define DEFINE_PTE_FAULT_EVENT(name) \ 139 DEFINE_EVENT(dax_pte_fault_class, name, \ 140 TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result), \ 141 TP_ARGS(inode, vmf, result)) 142 143 DEFINE_PTE_FAULT_EVENT(dax_pte_fault); 144 DEFINE_PTE_FAULT_EVENT(dax_pte_fault_done); 145 DEFINE_PTE_FAULT_EVENT(dax_load_hole); 146 DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite_no_entry); 147 DEFINE_PTE_FAULT_EVENT(dax_insert_pfn_mkwrite); 148 149 DECLARE_EVENT_CLASS(dax_writeback_range_class, 150 TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index), 151 TP_ARGS(inode, start_index, end_index), 152 TP_STRUCT__entry( 153 __field(unsigned long, ino) 154 __field(pgoff_t, start_index) 155 __field(pgoff_t, end_index) 156 __field(dev_t, dev) 157 ), 158 TP_fast_assign( 159 __entry->dev = inode->i_sb->s_dev; 160 __entry->ino = inode->i_ino; 161 __entry->start_index = start_index; 162 __entry->end_index = end_index; 163 ), 164 TP_printk("dev %d:%d ino %#lx pgoff %#lx-%#lx", 165 MAJOR(__entry->dev), 166 MINOR(__entry->dev), 167 __entry->ino, 168 __entry->start_index, 169 __entry->end_index 170 ) 171 ) 172 173 #define DEFINE_WRITEBACK_RANGE_EVENT(name) \ 174 DEFINE_EVENT(dax_writeback_range_class, name, \ 175 TP_PROTO(struct inode *inode, pgoff_t start_index, pgoff_t end_index),\ 176 TP_ARGS(inode, start_index, end_index)) 177 178 DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range); 179 DEFINE_WRITEBACK_RANGE_EVENT(dax_writeback_range_done); 180 181 TRACE_EVENT(dax_writeback_one, 182 TP_PROTO(struct inode *inode, pgoff_t pgoff, pgoff_t pglen), 183 TP_ARGS(inode, pgoff, pglen), 184 TP_STRUCT__entry( 185 __field(unsigned long, ino) 186 __field(pgoff_t, pgoff) 187 __field(pgoff_t, pglen) 188 __field(dev_t, dev) 189 ), 190 TP_fast_assign( 191 __entry->dev = inode->i_sb->s_dev; 192 __entry->ino = inode->i_ino; 193 __entry->pgoff = pgoff; 194 __entry->pglen = pglen; 195 ), 196 TP_printk("dev %d:%d ino %#lx pgoff %#lx pglen %#lx", 197 MAJOR(__entry->dev), 198 MINOR(__entry->dev), 199 __entry->ino, 200 __entry->pgoff, 201 __entry->pglen 202 ) 203 ) 204 205 #endif /* _TRACE_FS_DAX_H */ 206 207 /* This part must be outside protection */ 208 #include <trace/define_trace.h> 209