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