xref: /openbmc/linux/include/trace/events/ksm.h (revision 739100c8)
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