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 */
18DECLARE_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 */
46DEFINE_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 */
61DEFINE_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 */
75DECLARE_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 */
99DEFINE_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 */
113DEFINE_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 */
130TRACE_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 */
165TRACE_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 */
199TRACE_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 */
226TRACE_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/**
249 * ksm_advisor - called after the advisor has run
250 *
251 * @scan_time:		scan time in seconds
252 * @pages_to_scan:	new pages_to_scan value
253 * @cpu_percent:	cpu usage in percent
254 *
255 * Allows to trace the ksm advisor.
256 */
257TRACE_EVENT(ksm_advisor,
258
259	TP_PROTO(s64 scan_time, unsigned long pages_to_scan,
260		 unsigned int cpu_percent),
261
262	TP_ARGS(scan_time, pages_to_scan, cpu_percent),
263
264	TP_STRUCT__entry(
265		__field(s64,		scan_time)
266		__field(unsigned long,	pages_to_scan)
267		__field(unsigned int,	cpu_percent)
268	),
269
270	TP_fast_assign(
271		__entry->scan_time	= scan_time;
272		__entry->pages_to_scan	= pages_to_scan;
273		__entry->cpu_percent	= cpu_percent;
274	),
275
276	TP_printk("ksm scan time %lld pages_to_scan %lu cpu percent %u",
277			__entry->scan_time, __entry->pages_to_scan,
278			__entry->cpu_percent)
279);
280
281#endif /* _TRACE_KSM_H */
282
283/* This part must be outside protection */
284#include <trace/define_trace.h>
285