1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM ksm 4 5 #if !defined(_TRACE_KSM_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_KSM_H 7 8 #include <linux/tracepoint.h> 9 10 /** 11 * ksm_scan_template - called for start / stop scan 12 * 13 * @seq: sequence number of scan 14 * @rmap_entries: actual number of rmap entries 15 * 16 * Allows to trace the start / stop of a ksm scan. 17 */ 18 DECLARE_EVENT_CLASS(ksm_scan_template, 19 20 TP_PROTO(int seq, u32 rmap_entries), 21 22 TP_ARGS(seq, rmap_entries), 23 24 TP_STRUCT__entry( 25 __field(int, seq) 26 __field(u32, rmap_entries) 27 ), 28 29 TP_fast_assign( 30 __entry->seq = seq; 31 __entry->rmap_entries = rmap_entries; 32 ), 33 34 TP_printk("seq %d rmap size %d", 35 __entry->seq, __entry->rmap_entries) 36 ); 37 38 /** 39 * ksm_start_scan - called after a new ksm scan is started 40 * 41 * @seq: sequence number of scan 42 * @rmap_entries: actual number of rmap entries 43 * 44 * Allows to trace the start of a ksm scan. 45 */ 46 DEFINE_EVENT(ksm_scan_template, ksm_start_scan, 47 48 TP_PROTO(int seq, u32 rmap_entries), 49 50 TP_ARGS(seq, rmap_entries) 51 ); 52 53 /** 54 * ksm_stop_scan - called after a new ksm scan has completed 55 * 56 * @seq: sequence number of scan 57 * @rmap_entries: actual number of rmap entries 58 * 59 * Allows to trace the completion of a ksm scan. 60 */ 61 DEFINE_EVENT(ksm_scan_template, ksm_stop_scan, 62 63 TP_PROTO(int seq, u32 rmap_entries), 64 65 TP_ARGS(seq, rmap_entries) 66 ); 67 68 /** 69 * ksm_enter - called after a new process has been added / removed from ksm 70 * 71 * @mm: address of the mm object of the process 72 * 73 * Allows to trace the when a process has been added or removed from ksm. 74 */ 75 DECLARE_EVENT_CLASS(ksm_enter_exit_template, 76 77 TP_PROTO(void *mm), 78 79 TP_ARGS(mm), 80 81 TP_STRUCT__entry( 82 __field(void *, mm) 83 ), 84 85 TP_fast_assign( 86 __entry->mm = mm; 87 ), 88 89 TP_printk("mm %p", __entry->mm) 90 ); 91 92 /** 93 * ksm_enter - called after a new process has been added to ksm 94 * 95 * @mm: address of the mm object of the process 96 * 97 * Allows to trace the when a process has been added to ksm. 98 */ 99 DEFINE_EVENT(ksm_enter_exit_template, ksm_enter, 100 101 TP_PROTO(void *mm), 102 103 TP_ARGS(mm) 104 ); 105 106 /** 107 * ksm_exit - called after a new process has been removed from ksm 108 * 109 * @mm: address of the mm object of the process 110 * 111 * Allows to trace the when a process has been removed from ksm. 112 */ 113 DEFINE_EVENT(ksm_enter_exit_template, ksm_exit, 114 115 TP_PROTO(void *mm), 116 117 TP_ARGS(mm) 118 ); 119 120 /** 121 * ksm_merge_one_page - called after a page has been merged 122 * 123 * @pfn: page frame number of ksm page 124 * @rmap_item: address of rmap_item object 125 * @mm: address of the process mm struct 126 * @err: success 127 * 128 * Allows to trace the ksm merging of individual pages. 129 */ 130 TRACE_EVENT(ksm_merge_one_page, 131 132 TP_PROTO(unsigned long pfn, void *rmap_item, void *mm, int err), 133 134 TP_ARGS(pfn, rmap_item, mm, err), 135 136 TP_STRUCT__entry( 137 __field(unsigned long, pfn) 138 __field(void *, rmap_item) 139 __field(void *, mm) 140 __field(int, err) 141 ), 142 143 TP_fast_assign( 144 __entry->pfn = pfn; 145 __entry->rmap_item = rmap_item; 146 __entry->mm = mm; 147 __entry->err = err; 148 ), 149 150 TP_printk("ksm pfn %lu rmap_item %p mm %p error %d", 151 __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) 152 ); 153 154 /** 155 * ksm_merge_with_ksm_page - called after a page has been merged with a ksm page 156 * 157 * @ksm_page: address ksm page 158 * @pfn: page frame number of ksm page 159 * @rmap_item: address of rmap_item object 160 * @mm: address of the mm object of the process 161 * @err: success 162 * 163 * Allows to trace the merging of a page with a ksm page. 164 */ 165 TRACE_EVENT(ksm_merge_with_ksm_page, 166 167 TP_PROTO(void *ksm_page, unsigned long pfn, void *rmap_item, void *mm, int err), 168 169 TP_ARGS(ksm_page, pfn, rmap_item, mm, err), 170 171 TP_STRUCT__entry( 172 __field(void *, ksm_page) 173 __field(unsigned long, pfn) 174 __field(void *, rmap_item) 175 __field(void *, mm) 176 __field(int, err) 177 ), 178 179 TP_fast_assign( 180 __entry->ksm_page = ksm_page; 181 __entry->pfn = pfn; 182 __entry->rmap_item = rmap_item; 183 __entry->mm = mm; 184 __entry->err = err; 185 ), 186 187 TP_printk("%spfn %lu rmap_item %p mm %p error %d", 188 (__entry->ksm_page ? "ksm " : ""), 189 __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) 190 ); 191 192 /** 193 * ksm_remove_ksm_page - called after a ksm page has been removed 194 * 195 * @pfn: page frame number of ksm page 196 * 197 * Allows to trace the removing of stable ksm pages. 198 */ 199 TRACE_EVENT(ksm_remove_ksm_page, 200 201 TP_PROTO(unsigned long pfn), 202 203 TP_ARGS(pfn), 204 205 TP_STRUCT__entry( 206 __field(unsigned long, pfn) 207 ), 208 209 TP_fast_assign( 210 __entry->pfn = pfn; 211 ), 212 213 TP_printk("pfn %lu", __entry->pfn) 214 ); 215 216 /** 217 * ksm_remove_rmap_item - called after a rmap_item has been removed from the 218 * stable tree 219 * 220 * @pfn: page frame number of ksm page 221 * @rmap_item: address of rmap_item object 222 * @mm: address of the process mm struct 223 * 224 * Allows to trace the removal of pages from the stable tree list. 225 */ 226 TRACE_EVENT(ksm_remove_rmap_item, 227 228 TP_PROTO(unsigned long pfn, void *rmap_item, void *mm), 229 230 TP_ARGS(pfn, rmap_item, mm), 231 232 TP_STRUCT__entry( 233 __field(unsigned long, pfn) 234 __field(void *, rmap_item) 235 __field(void *, mm) 236 ), 237 238 TP_fast_assign( 239 __entry->pfn = pfn; 240 __entry->rmap_item = rmap_item; 241 __entry->mm = mm; 242 ), 243 244 TP_printk("pfn %lu rmap_item %p mm %p", 245 __entry->pfn, __entry->rmap_item, __entry->mm) 246 ); 247 248 #endif /* _TRACE_KSM_H */ 249 250 /* This part must be outside protection */ 251 #include <trace/define_trace.h> 252