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