1739100c8SStefan Roesch /* SPDX-License-Identifier: GPL-2.0 */ 2739100c8SStefan Roesch #undef TRACE_SYSTEM 3739100c8SStefan Roesch #define TRACE_SYSTEM ksm 4739100c8SStefan Roesch 5739100c8SStefan Roesch #if !defined(_TRACE_KSM_H) || defined(TRACE_HEADER_MULTI_READ) 6739100c8SStefan Roesch #define _TRACE_KSM_H 7739100c8SStefan Roesch 8739100c8SStefan Roesch #include <linux/tracepoint.h> 9739100c8SStefan Roesch 10739100c8SStefan Roesch /** 11739100c8SStefan Roesch * ksm_scan_template - called for start / stop scan 12739100c8SStefan Roesch * 13739100c8SStefan Roesch * @seq: sequence number of scan 14739100c8SStefan Roesch * @rmap_entries: actual number of rmap entries 15739100c8SStefan Roesch * 16739100c8SStefan Roesch * Allows to trace the start / stop of a ksm scan. 17739100c8SStefan Roesch */ 18739100c8SStefan Roesch DECLARE_EVENT_CLASS(ksm_scan_template, 19739100c8SStefan Roesch 20739100c8SStefan Roesch TP_PROTO(int seq, u32 rmap_entries), 21739100c8SStefan Roesch 22739100c8SStefan Roesch TP_ARGS(seq, rmap_entries), 23739100c8SStefan Roesch 24739100c8SStefan Roesch TP_STRUCT__entry( 25739100c8SStefan Roesch __field(int, seq) 26739100c8SStefan Roesch __field(u32, rmap_entries) 27739100c8SStefan Roesch ), 28739100c8SStefan Roesch 29739100c8SStefan Roesch TP_fast_assign( 30739100c8SStefan Roesch __entry->seq = seq; 31739100c8SStefan Roesch __entry->rmap_entries = rmap_entries; 32739100c8SStefan Roesch ), 33739100c8SStefan Roesch 34739100c8SStefan Roesch TP_printk("seq %d rmap size %d", 35739100c8SStefan Roesch __entry->seq, __entry->rmap_entries) 36739100c8SStefan Roesch ); 37739100c8SStefan Roesch 38739100c8SStefan Roesch /** 39739100c8SStefan Roesch * ksm_start_scan - called after a new ksm scan is started 40739100c8SStefan Roesch * 41739100c8SStefan Roesch * @seq: sequence number of scan 42739100c8SStefan Roesch * @rmap_entries: actual number of rmap entries 43739100c8SStefan Roesch * 44739100c8SStefan Roesch * Allows to trace the start of a ksm scan. 45739100c8SStefan Roesch */ 46739100c8SStefan Roesch DEFINE_EVENT(ksm_scan_template, ksm_start_scan, 47739100c8SStefan Roesch 48739100c8SStefan Roesch TP_PROTO(int seq, u32 rmap_entries), 49739100c8SStefan Roesch 50739100c8SStefan Roesch TP_ARGS(seq, rmap_entries) 51739100c8SStefan Roesch ); 52739100c8SStefan Roesch 53739100c8SStefan Roesch /** 54739100c8SStefan Roesch * ksm_stop_scan - called after a new ksm scan has completed 55739100c8SStefan Roesch * 56739100c8SStefan Roesch * @seq: sequence number of scan 57739100c8SStefan Roesch * @rmap_entries: actual number of rmap entries 58739100c8SStefan Roesch * 59739100c8SStefan Roesch * Allows to trace the completion of a ksm scan. 60739100c8SStefan Roesch */ 61739100c8SStefan Roesch DEFINE_EVENT(ksm_scan_template, ksm_stop_scan, 62739100c8SStefan Roesch 63739100c8SStefan Roesch TP_PROTO(int seq, u32 rmap_entries), 64739100c8SStefan Roesch 65739100c8SStefan Roesch TP_ARGS(seq, rmap_entries) 66739100c8SStefan Roesch ); 67739100c8SStefan Roesch 68739100c8SStefan Roesch /** 69739100c8SStefan Roesch * ksm_enter - called after a new process has been added / removed from ksm 70739100c8SStefan Roesch * 71739100c8SStefan Roesch * @mm: address of the mm object of the process 72739100c8SStefan Roesch * 73739100c8SStefan Roesch * Allows to trace the when a process has been added or removed from ksm. 74739100c8SStefan Roesch */ 75739100c8SStefan Roesch DECLARE_EVENT_CLASS(ksm_enter_exit_template, 76739100c8SStefan Roesch 77739100c8SStefan Roesch TP_PROTO(void *mm), 78739100c8SStefan Roesch 79739100c8SStefan Roesch TP_ARGS(mm), 80739100c8SStefan Roesch 81739100c8SStefan Roesch TP_STRUCT__entry( 82739100c8SStefan Roesch __field(void *, mm) 83739100c8SStefan Roesch ), 84739100c8SStefan Roesch 85739100c8SStefan Roesch TP_fast_assign( 86739100c8SStefan Roesch __entry->mm = mm; 87739100c8SStefan Roesch ), 88739100c8SStefan Roesch 89739100c8SStefan Roesch TP_printk("mm %p", __entry->mm) 90739100c8SStefan Roesch ); 91739100c8SStefan Roesch 92739100c8SStefan Roesch /** 93739100c8SStefan Roesch * ksm_enter - called after a new process has been added to ksm 94739100c8SStefan Roesch * 95739100c8SStefan Roesch * @mm: address of the mm object of the process 96739100c8SStefan Roesch * 97739100c8SStefan Roesch * Allows to trace the when a process has been added to ksm. 98739100c8SStefan Roesch */ 99739100c8SStefan Roesch DEFINE_EVENT(ksm_enter_exit_template, ksm_enter, 100739100c8SStefan Roesch 101739100c8SStefan Roesch TP_PROTO(void *mm), 102739100c8SStefan Roesch 103739100c8SStefan Roesch TP_ARGS(mm) 104739100c8SStefan Roesch ); 105739100c8SStefan Roesch 106739100c8SStefan Roesch /** 107739100c8SStefan Roesch * ksm_exit - called after a new process has been removed from ksm 108739100c8SStefan Roesch * 109739100c8SStefan Roesch * @mm: address of the mm object of the process 110739100c8SStefan Roesch * 111739100c8SStefan Roesch * Allows to trace the when a process has been removed from ksm. 112739100c8SStefan Roesch */ 113739100c8SStefan Roesch DEFINE_EVENT(ksm_enter_exit_template, ksm_exit, 114739100c8SStefan Roesch 115739100c8SStefan Roesch TP_PROTO(void *mm), 116739100c8SStefan Roesch 117739100c8SStefan Roesch TP_ARGS(mm) 118739100c8SStefan Roesch ); 119739100c8SStefan Roesch 120739100c8SStefan Roesch /** 121739100c8SStefan Roesch * ksm_merge_one_page - called after a page has been merged 122739100c8SStefan Roesch * 123739100c8SStefan Roesch * @pfn: page frame number of ksm page 124739100c8SStefan Roesch * @rmap_item: address of rmap_item object 125739100c8SStefan Roesch * @mm: address of the process mm struct 126739100c8SStefan Roesch * @err: success 127739100c8SStefan Roesch * 128739100c8SStefan Roesch * Allows to trace the ksm merging of individual pages. 129739100c8SStefan Roesch */ 130739100c8SStefan Roesch TRACE_EVENT(ksm_merge_one_page, 131739100c8SStefan Roesch 132739100c8SStefan Roesch TP_PROTO(unsigned long pfn, void *rmap_item, void *mm, int err), 133739100c8SStefan Roesch 134739100c8SStefan Roesch TP_ARGS(pfn, rmap_item, mm, err), 135739100c8SStefan Roesch 136739100c8SStefan Roesch TP_STRUCT__entry( 137739100c8SStefan Roesch __field(unsigned long, pfn) 138739100c8SStefan Roesch __field(void *, rmap_item) 139739100c8SStefan Roesch __field(void *, mm) 140739100c8SStefan Roesch __field(int, err) 141739100c8SStefan Roesch ), 142739100c8SStefan Roesch 143739100c8SStefan Roesch TP_fast_assign( 144739100c8SStefan Roesch __entry->pfn = pfn; 145739100c8SStefan Roesch __entry->rmap_item = rmap_item; 146739100c8SStefan Roesch __entry->mm = mm; 147739100c8SStefan Roesch __entry->err = err; 148739100c8SStefan Roesch ), 149739100c8SStefan Roesch 150739100c8SStefan Roesch TP_printk("ksm pfn %lu rmap_item %p mm %p error %d", 151739100c8SStefan Roesch __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) 152739100c8SStefan Roesch ); 153739100c8SStefan Roesch 154739100c8SStefan Roesch /** 155739100c8SStefan Roesch * ksm_merge_with_ksm_page - called after a page has been merged with a ksm page 156739100c8SStefan Roesch * 157739100c8SStefan Roesch * @ksm_page: address ksm page 158739100c8SStefan Roesch * @pfn: page frame number of ksm page 159739100c8SStefan Roesch * @rmap_item: address of rmap_item object 160739100c8SStefan Roesch * @mm: address of the mm object of the process 161739100c8SStefan Roesch * @err: success 162739100c8SStefan Roesch * 163739100c8SStefan Roesch * Allows to trace the merging of a page with a ksm page. 164739100c8SStefan Roesch */ 165739100c8SStefan Roesch TRACE_EVENT(ksm_merge_with_ksm_page, 166739100c8SStefan Roesch 167739100c8SStefan Roesch TP_PROTO(void *ksm_page, unsigned long pfn, void *rmap_item, void *mm, int err), 168739100c8SStefan Roesch 169739100c8SStefan Roesch TP_ARGS(ksm_page, pfn, rmap_item, mm, err), 170739100c8SStefan Roesch 171739100c8SStefan Roesch TP_STRUCT__entry( 172739100c8SStefan Roesch __field(void *, ksm_page) 173739100c8SStefan Roesch __field(unsigned long, pfn) 174739100c8SStefan Roesch __field(void *, rmap_item) 175739100c8SStefan Roesch __field(void *, mm) 176739100c8SStefan Roesch __field(int, err) 177739100c8SStefan Roesch ), 178739100c8SStefan Roesch 179739100c8SStefan Roesch TP_fast_assign( 180739100c8SStefan Roesch __entry->ksm_page = ksm_page; 181739100c8SStefan Roesch __entry->pfn = pfn; 182739100c8SStefan Roesch __entry->rmap_item = rmap_item; 183739100c8SStefan Roesch __entry->mm = mm; 184739100c8SStefan Roesch __entry->err = err; 185739100c8SStefan Roesch ), 186739100c8SStefan Roesch 187739100c8SStefan Roesch TP_printk("%spfn %lu rmap_item %p mm %p error %d", 188739100c8SStefan Roesch (__entry->ksm_page ? "ksm " : ""), 189739100c8SStefan Roesch __entry->pfn, __entry->rmap_item, __entry->mm, __entry->err) 190739100c8SStefan Roesch ); 191739100c8SStefan Roesch 192739100c8SStefan Roesch /** 193739100c8SStefan Roesch * ksm_remove_ksm_page - called after a ksm page has been removed 194739100c8SStefan Roesch * 195739100c8SStefan Roesch * @pfn: page frame number of ksm page 196739100c8SStefan Roesch * 197739100c8SStefan Roesch * Allows to trace the removing of stable ksm pages. 198739100c8SStefan Roesch */ 199739100c8SStefan Roesch TRACE_EVENT(ksm_remove_ksm_page, 200739100c8SStefan Roesch 201739100c8SStefan Roesch TP_PROTO(unsigned long pfn), 202739100c8SStefan Roesch 203739100c8SStefan Roesch TP_ARGS(pfn), 204739100c8SStefan Roesch 205739100c8SStefan Roesch TP_STRUCT__entry( 206739100c8SStefan Roesch __field(unsigned long, pfn) 207739100c8SStefan Roesch ), 208739100c8SStefan Roesch 209739100c8SStefan Roesch TP_fast_assign( 210739100c8SStefan Roesch __entry->pfn = pfn; 211739100c8SStefan Roesch ), 212739100c8SStefan Roesch 213739100c8SStefan Roesch TP_printk("pfn %lu", __entry->pfn) 214739100c8SStefan Roesch ); 215739100c8SStefan Roesch 216739100c8SStefan Roesch /** 217739100c8SStefan Roesch * ksm_remove_rmap_item - called after a rmap_item has been removed from the 218739100c8SStefan Roesch * stable tree 219739100c8SStefan Roesch * 220739100c8SStefan Roesch * @pfn: page frame number of ksm page 221739100c8SStefan Roesch * @rmap_item: address of rmap_item object 222739100c8SStefan Roesch * @mm: address of the process mm struct 223739100c8SStefan Roesch * 224739100c8SStefan Roesch * Allows to trace the removal of pages from the stable tree list. 225739100c8SStefan Roesch */ 226739100c8SStefan Roesch TRACE_EVENT(ksm_remove_rmap_item, 227739100c8SStefan Roesch 228739100c8SStefan Roesch TP_PROTO(unsigned long pfn, void *rmap_item, void *mm), 229739100c8SStefan Roesch 230739100c8SStefan Roesch TP_ARGS(pfn, rmap_item, mm), 231739100c8SStefan Roesch 232739100c8SStefan Roesch TP_STRUCT__entry( 233739100c8SStefan Roesch __field(unsigned long, pfn) 234739100c8SStefan Roesch __field(void *, rmap_item) 235739100c8SStefan Roesch __field(void *, mm) 236739100c8SStefan Roesch ), 237739100c8SStefan Roesch 238739100c8SStefan Roesch TP_fast_assign( 239739100c8SStefan Roesch __entry->pfn = pfn; 240739100c8SStefan Roesch __entry->rmap_item = rmap_item; 241739100c8SStefan Roesch __entry->mm = mm; 242739100c8SStefan Roesch ), 243739100c8SStefan Roesch 244739100c8SStefan Roesch TP_printk("pfn %lu rmap_item %p mm %p", 245739100c8SStefan Roesch __entry->pfn, __entry->rmap_item, __entry->mm) 246739100c8SStefan Roesch ); 247739100c8SStefan Roesch 248*5088b497SStefan Roesch /** 249*5088b497SStefan Roesch * ksm_advisor - called after the advisor has run 250*5088b497SStefan Roesch * 251*5088b497SStefan Roesch * @scan_time: scan time in seconds 252*5088b497SStefan Roesch * @pages_to_scan: new pages_to_scan value 253*5088b497SStefan Roesch * @cpu_percent: cpu usage in percent 254*5088b497SStefan Roesch * 255*5088b497SStefan Roesch * Allows to trace the ksm advisor. 256*5088b497SStefan Roesch */ 257*5088b497SStefan Roesch TRACE_EVENT(ksm_advisor, 258*5088b497SStefan Roesch 259*5088b497SStefan Roesch TP_PROTO(s64 scan_time, unsigned long pages_to_scan, 260*5088b497SStefan Roesch unsigned int cpu_percent), 261*5088b497SStefan Roesch 262*5088b497SStefan Roesch TP_ARGS(scan_time, pages_to_scan, cpu_percent), 263*5088b497SStefan Roesch 264*5088b497SStefan Roesch TP_STRUCT__entry( 265*5088b497SStefan Roesch __field(s64, scan_time) 266*5088b497SStefan Roesch __field(unsigned long, pages_to_scan) 267*5088b497SStefan Roesch __field(unsigned int, cpu_percent) 268*5088b497SStefan Roesch ), 269*5088b497SStefan Roesch 270*5088b497SStefan Roesch TP_fast_assign( 271*5088b497SStefan Roesch __entry->scan_time = scan_time; 272*5088b497SStefan Roesch __entry->pages_to_scan = pages_to_scan; 273*5088b497SStefan Roesch __entry->cpu_percent = cpu_percent; 274*5088b497SStefan Roesch ), 275*5088b497SStefan Roesch 276*5088b497SStefan Roesch TP_printk("ksm scan time %lld pages_to_scan %lu cpu percent %u", 277*5088b497SStefan Roesch __entry->scan_time, __entry->pages_to_scan, 278*5088b497SStefan Roesch __entry->cpu_percent) 279*5088b497SStefan Roesch ); 280*5088b497SStefan Roesch 281739100c8SStefan Roesch #endif /* _TRACE_KSM_H */ 282739100c8SStefan Roesch 283739100c8SStefan Roesch /* This part must be outside protection */ 284739100c8SStefan Roesch #include <trace/define_trace.h> 285