1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM compaction
4 
5 #if !defined(_TRACE_COMPACTION_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_COMPACTION_H
7 
8 #include <linux/types.h>
9 #include <linux/list.h>
10 #include <linux/tracepoint.h>
11 #include <trace/events/mmflags.h>
12 
13 
14 DECLARE_EVENT_CLASS(mm_compaction_isolate_template,
15 
16 	TP_PROTO(
17 		unsigned long start_pfn,
18 		unsigned long end_pfn,
19 		unsigned long nr_scanned,
20 		unsigned long nr_taken),
21 
22 	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken),
23 
24 	TP_STRUCT__entry(
25 		__field(unsigned long, start_pfn)
26 		__field(unsigned long, end_pfn)
27 		__field(unsigned long, nr_scanned)
28 		__field(unsigned long, nr_taken)
29 	),
30 
31 	TP_fast_assign(
32 		__entry->start_pfn = start_pfn;
33 		__entry->end_pfn = end_pfn;
34 		__entry->nr_scanned = nr_scanned;
35 		__entry->nr_taken = nr_taken;
36 	),
37 
38 	TP_printk("range=(0x%lx ~ 0x%lx) nr_scanned=%lu nr_taken=%lu",
39 		__entry->start_pfn,
40 		__entry->end_pfn,
41 		__entry->nr_scanned,
42 		__entry->nr_taken)
43 );
44 
45 DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_migratepages,
46 
47 	TP_PROTO(
48 		unsigned long start_pfn,
49 		unsigned long end_pfn,
50 		unsigned long nr_scanned,
51 		unsigned long nr_taken),
52 
53 	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken)
54 );
55 
56 DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_freepages,
57 
58 	TP_PROTO(
59 		unsigned long start_pfn,
60 		unsigned long end_pfn,
61 		unsigned long nr_scanned,
62 		unsigned long nr_taken),
63 
64 	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken)
65 );
66 
67 DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_fast_isolate_freepages,
68 
69 	TP_PROTO(
70 		unsigned long start_pfn,
71 		unsigned long end_pfn,
72 		unsigned long nr_scanned,
73 		unsigned long nr_taken),
74 
75 	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken)
76 );
77 
78 #ifdef CONFIG_COMPACTION
79 TRACE_EVENT(mm_compaction_migratepages,
80 
81 	TP_PROTO(struct compact_control *cc,
82 		unsigned int nr_succeeded),
83 
84 	TP_ARGS(cc, nr_succeeded),
85 
86 	TP_STRUCT__entry(
87 		__field(unsigned long, nr_migrated)
88 		__field(unsigned long, nr_failed)
89 	),
90 
91 	TP_fast_assign(
92 		__entry->nr_migrated = nr_succeeded;
93 		__entry->nr_failed = cc->nr_migratepages - nr_succeeded;
94 	),
95 
96 	TP_printk("nr_migrated=%lu nr_failed=%lu",
97 		__entry->nr_migrated,
98 		__entry->nr_failed)
99 );
100 
101 TRACE_EVENT(mm_compaction_begin,
102 	TP_PROTO(struct compact_control *cc, unsigned long zone_start,
103 		unsigned long zone_end, bool sync),
104 
105 	TP_ARGS(cc, zone_start, zone_end, sync),
106 
107 	TP_STRUCT__entry(
108 		__field(unsigned long, zone_start)
109 		__field(unsigned long, migrate_pfn)
110 		__field(unsigned long, free_pfn)
111 		__field(unsigned long, zone_end)
112 		__field(bool, sync)
113 	),
114 
115 	TP_fast_assign(
116 		__entry->zone_start = zone_start;
117 		__entry->migrate_pfn = cc->migrate_pfn;
118 		__entry->free_pfn = cc->free_pfn;
119 		__entry->zone_end = zone_end;
120 		__entry->sync = sync;
121 	),
122 
123 	TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s",
124 		__entry->zone_start,
125 		__entry->migrate_pfn,
126 		__entry->free_pfn,
127 		__entry->zone_end,
128 		__entry->sync ? "sync" : "async")
129 );
130 
131 TRACE_EVENT(mm_compaction_end,
132 	TP_PROTO(struct compact_control *cc, unsigned long zone_start,
133 		unsigned long zone_end, bool sync,
134 		int status),
135 
136 	TP_ARGS(cc, zone_start, zone_end, sync, status),
137 
138 	TP_STRUCT__entry(
139 		__field(unsigned long, zone_start)
140 		__field(unsigned long, migrate_pfn)
141 		__field(unsigned long, free_pfn)
142 		__field(unsigned long, zone_end)
143 		__field(bool, sync)
144 		__field(int, status)
145 	),
146 
147 	TP_fast_assign(
148 		__entry->zone_start = zone_start;
149 		__entry->migrate_pfn = cc->migrate_pfn;
150 		__entry->free_pfn = cc->free_pfn;
151 		__entry->zone_end = zone_end;
152 		__entry->sync = sync;
153 		__entry->status = status;
154 	),
155 
156 	TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s status=%s",
157 		__entry->zone_start,
158 		__entry->migrate_pfn,
159 		__entry->free_pfn,
160 		__entry->zone_end,
161 		__entry->sync ? "sync" : "async",
162 		__print_symbolic(__entry->status, COMPACTION_STATUS))
163 );
164 
165 TRACE_EVENT(mm_compaction_try_to_compact_pages,
166 
167 	TP_PROTO(
168 		int order,
169 		gfp_t gfp_mask,
170 		int prio),
171 
172 	TP_ARGS(order, gfp_mask, prio),
173 
174 	TP_STRUCT__entry(
175 		__field(int, order)
176 		__field(unsigned long, gfp_mask)
177 		__field(int, prio)
178 	),
179 
180 	TP_fast_assign(
181 		__entry->order = order;
182 		__entry->gfp_mask = (__force unsigned long)gfp_mask;
183 		__entry->prio = prio;
184 	),
185 
186 	TP_printk("order=%d gfp_mask=%s priority=%d",
187 		__entry->order,
188 		show_gfp_flags(__entry->gfp_mask),
189 		__entry->prio)
190 );
191 
192 DECLARE_EVENT_CLASS(mm_compaction_suitable_template,
193 
194 	TP_PROTO(struct zone *zone,
195 		int order,
196 		int ret),
197 
198 	TP_ARGS(zone, order, ret),
199 
200 	TP_STRUCT__entry(
201 		__field(int, nid)
202 		__field(enum zone_type, idx)
203 		__field(int, order)
204 		__field(int, ret)
205 	),
206 
207 	TP_fast_assign(
208 		__entry->nid = zone_to_nid(zone);
209 		__entry->idx = zone_idx(zone);
210 		__entry->order = order;
211 		__entry->ret = ret;
212 	),
213 
214 	TP_printk("node=%d zone=%-8s order=%d ret=%s",
215 		__entry->nid,
216 		__print_symbolic(__entry->idx, ZONE_TYPE),
217 		__entry->order,
218 		__print_symbolic(__entry->ret, COMPACTION_STATUS))
219 );
220 
221 DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_finished,
222 
223 	TP_PROTO(struct zone *zone,
224 		int order,
225 		int ret),
226 
227 	TP_ARGS(zone, order, ret)
228 );
229 
230 DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_suitable,
231 
232 	TP_PROTO(struct zone *zone,
233 		int order,
234 		int ret),
235 
236 	TP_ARGS(zone, order, ret)
237 );
238 
239 DECLARE_EVENT_CLASS(mm_compaction_defer_template,
240 
241 	TP_PROTO(struct zone *zone, int order),
242 
243 	TP_ARGS(zone, order),
244 
245 	TP_STRUCT__entry(
246 		__field(int, nid)
247 		__field(enum zone_type, idx)
248 		__field(int, order)
249 		__field(unsigned int, considered)
250 		__field(unsigned int, defer_shift)
251 		__field(int, order_failed)
252 	),
253 
254 	TP_fast_assign(
255 		__entry->nid = zone_to_nid(zone);
256 		__entry->idx = zone_idx(zone);
257 		__entry->order = order;
258 		__entry->considered = zone->compact_considered;
259 		__entry->defer_shift = zone->compact_defer_shift;
260 		__entry->order_failed = zone->compact_order_failed;
261 	),
262 
263 	TP_printk("node=%d zone=%-8s order=%d order_failed=%d consider=%u limit=%lu",
264 		__entry->nid,
265 		__print_symbolic(__entry->idx, ZONE_TYPE),
266 		__entry->order,
267 		__entry->order_failed,
268 		__entry->considered,
269 		1UL << __entry->defer_shift)
270 );
271 
272 DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_deferred,
273 
274 	TP_PROTO(struct zone *zone, int order),
275 
276 	TP_ARGS(zone, order)
277 );
278 
279 DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_compaction,
280 
281 	TP_PROTO(struct zone *zone, int order),
282 
283 	TP_ARGS(zone, order)
284 );
285 
286 DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_reset,
287 
288 	TP_PROTO(struct zone *zone, int order),
289 
290 	TP_ARGS(zone, order)
291 );
292 
293 TRACE_EVENT(mm_compaction_kcompactd_sleep,
294 
295 	TP_PROTO(int nid),
296 
297 	TP_ARGS(nid),
298 
299 	TP_STRUCT__entry(
300 		__field(int, nid)
301 	),
302 
303 	TP_fast_assign(
304 		__entry->nid = nid;
305 	),
306 
307 	TP_printk("nid=%d", __entry->nid)
308 );
309 
310 DECLARE_EVENT_CLASS(kcompactd_wake_template,
311 
312 	TP_PROTO(int nid, int order, enum zone_type highest_zoneidx),
313 
314 	TP_ARGS(nid, order, highest_zoneidx),
315 
316 	TP_STRUCT__entry(
317 		__field(int, nid)
318 		__field(int, order)
319 		__field(enum zone_type, highest_zoneidx)
320 	),
321 
322 	TP_fast_assign(
323 		__entry->nid = nid;
324 		__entry->order = order;
325 		__entry->highest_zoneidx = highest_zoneidx;
326 	),
327 
328 	/*
329 	 * classzone_idx is previous name of the highest_zoneidx.
330 	 * Reason not to change it is the ABI requirement of the tracepoint.
331 	 */
332 	TP_printk("nid=%d order=%d classzone_idx=%-8s",
333 		__entry->nid,
334 		__entry->order,
335 		__print_symbolic(__entry->highest_zoneidx, ZONE_TYPE))
336 );
337 
338 DEFINE_EVENT(kcompactd_wake_template, mm_compaction_wakeup_kcompactd,
339 
340 	TP_PROTO(int nid, int order, enum zone_type highest_zoneidx),
341 
342 	TP_ARGS(nid, order, highest_zoneidx)
343 );
344 
345 DEFINE_EVENT(kcompactd_wake_template, mm_compaction_kcompactd_wake,
346 
347 	TP_PROTO(int nid, int order, enum zone_type highest_zoneidx),
348 
349 	TP_ARGS(nid, order, highest_zoneidx)
350 );
351 #endif
352 
353 #endif /* _TRACE_COMPACTION_H */
354 
355 /* This part must be outside protection */
356 #include <trace/define_trace.h>
357