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