Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
2 : : #undef TRACE_SYSTEM
3 : : #define TRACE_SYSTEM vmscan
4 : :
5 : : #if !defined(_TRACE_VMSCAN_H) || defined(TRACE_HEADER_MULTI_READ)
6 : : #define _TRACE_VMSCAN_H
7 : :
8 : : #include <linux/types.h>
9 : : #include <linux/tracepoint.h>
10 : : #include <linux/mm.h>
11 : : #include <linux/memcontrol.h>
12 : : #include <trace/events/mmflags.h>
13 : :
14 : : #define RECLAIM_WB_ANON 0x0001u
15 : : #define RECLAIM_WB_FILE 0x0002u
16 : : #define RECLAIM_WB_MIXED 0x0010u
17 : : #define RECLAIM_WB_SYNC 0x0004u /* Unused, all reclaim async */
18 : : #define RECLAIM_WB_ASYNC 0x0008u
19 : : #define RECLAIM_WB_LRU (RECLAIM_WB_ANON|RECLAIM_WB_FILE)
20 : :
21 : : #define show_reclaim_flags(flags) \
22 : : (flags) ? __print_flags(flags, "|", \
23 : : {RECLAIM_WB_ANON, "RECLAIM_WB_ANON"}, \
24 : : {RECLAIM_WB_FILE, "RECLAIM_WB_FILE"}, \
25 : : {RECLAIM_WB_MIXED, "RECLAIM_WB_MIXED"}, \
26 : : {RECLAIM_WB_SYNC, "RECLAIM_WB_SYNC"}, \
27 : : {RECLAIM_WB_ASYNC, "RECLAIM_WB_ASYNC"} \
28 : : ) : "RECLAIM_WB_NONE"
29 : :
30 : : #define trace_reclaim_flags(file) ( \
31 : : (file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
32 : : (RECLAIM_WB_ASYNC) \
33 : : )
34 : :
35 : 3 : TRACE_EVENT(mm_vmscan_kswapd_sleep,
36 : :
37 : : TP_PROTO(int nid),
38 : :
39 : : TP_ARGS(nid),
40 : :
41 : : TP_STRUCT__entry(
42 : : __field( int, nid )
43 : : ),
44 : :
45 : : TP_fast_assign(
46 : : __entry->nid = nid;
47 : : ),
48 : :
49 : : TP_printk("nid=%d", __entry->nid)
50 : : );
51 : :
52 : 3 : TRACE_EVENT(mm_vmscan_kswapd_wake,
53 : :
54 : : TP_PROTO(int nid, int zid, int order),
55 : :
56 : : TP_ARGS(nid, zid, order),
57 : :
58 : : TP_STRUCT__entry(
59 : : __field( int, nid )
60 : : __field( int, zid )
61 : : __field( int, order )
62 : : ),
63 : :
64 : : TP_fast_assign(
65 : : __entry->nid = nid;
66 : : __entry->zid = zid;
67 : : __entry->order = order;
68 : : ),
69 : :
70 : : TP_printk("nid=%d order=%d",
71 : : __entry->nid,
72 : : __entry->order)
73 : : );
74 : :
75 : 3 : TRACE_EVENT(mm_vmscan_wakeup_kswapd,
76 : :
77 : : TP_PROTO(int nid, int zid, int order, gfp_t gfp_flags),
78 : :
79 : : TP_ARGS(nid, zid, order, gfp_flags),
80 : :
81 : : TP_STRUCT__entry(
82 : : __field( int, nid )
83 : : __field( int, zid )
84 : : __field( int, order )
85 : : __field( gfp_t, gfp_flags )
86 : : ),
87 : :
88 : : TP_fast_assign(
89 : : __entry->nid = nid;
90 : : __entry->zid = zid;
91 : : __entry->order = order;
92 : : __entry->gfp_flags = gfp_flags;
93 : : ),
94 : :
95 : : TP_printk("nid=%d order=%d gfp_flags=%s",
96 : : __entry->nid,
97 : : __entry->order,
98 : : show_gfp_flags(__entry->gfp_flags))
99 : : );
100 : :
101 : 3 : DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
102 : :
103 : : TP_PROTO(int order, gfp_t gfp_flags),
104 : :
105 : : TP_ARGS(order, gfp_flags),
106 : :
107 : : TP_STRUCT__entry(
108 : : __field( int, order )
109 : : __field( gfp_t, gfp_flags )
110 : : ),
111 : :
112 : : TP_fast_assign(
113 : : __entry->order = order;
114 : : __entry->gfp_flags = gfp_flags;
115 : : ),
116 : :
117 : : TP_printk("order=%d gfp_flags=%s",
118 : : __entry->order,
119 : : show_gfp_flags(__entry->gfp_flags))
120 : : );
121 : :
122 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin,
123 : :
124 : : TP_PROTO(int order, gfp_t gfp_flags),
125 : :
126 : : TP_ARGS(order, gfp_flags)
127 : : );
128 : :
129 : : #ifdef CONFIG_MEMCG
130 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin,
131 : :
132 : : TP_PROTO(int order, gfp_t gfp_flags),
133 : :
134 : : TP_ARGS(order, gfp_flags)
135 : : );
136 : :
137 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin,
138 : :
139 : : TP_PROTO(int order, gfp_t gfp_flags),
140 : :
141 : : TP_ARGS(order, gfp_flags)
142 : : );
143 : : #endif /* CONFIG_MEMCG */
144 : :
145 : 3 : DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template,
146 : :
147 : : TP_PROTO(unsigned long nr_reclaimed),
148 : :
149 : : TP_ARGS(nr_reclaimed),
150 : :
151 : : TP_STRUCT__entry(
152 : : __field( unsigned long, nr_reclaimed )
153 : : ),
154 : :
155 : : TP_fast_assign(
156 : : __entry->nr_reclaimed = nr_reclaimed;
157 : : ),
158 : :
159 : : TP_printk("nr_reclaimed=%lu", __entry->nr_reclaimed)
160 : : );
161 : :
162 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end,
163 : :
164 : : TP_PROTO(unsigned long nr_reclaimed),
165 : :
166 : : TP_ARGS(nr_reclaimed)
167 : : );
168 : :
169 : : #ifdef CONFIG_MEMCG
170 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end,
171 : :
172 : : TP_PROTO(unsigned long nr_reclaimed),
173 : :
174 : : TP_ARGS(nr_reclaimed)
175 : : );
176 : :
177 : 0 : DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end,
178 : :
179 : : TP_PROTO(unsigned long nr_reclaimed),
180 : :
181 : : TP_ARGS(nr_reclaimed)
182 : : );
183 : : #endif /* CONFIG_MEMCG */
184 : :
185 : 3 : TRACE_EVENT(mm_shrink_slab_start,
186 : : TP_PROTO(struct shrinker *shr, struct shrink_control *sc,
187 : : long nr_objects_to_shrink, unsigned long cache_items,
188 : : unsigned long long delta, unsigned long total_scan,
189 : : int priority),
190 : :
191 : : TP_ARGS(shr, sc, nr_objects_to_shrink, cache_items, delta, total_scan,
192 : : priority),
193 : :
194 : : TP_STRUCT__entry(
195 : : __field(struct shrinker *, shr)
196 : : __field(void *, shrink)
197 : : __field(int, nid)
198 : : __field(long, nr_objects_to_shrink)
199 : : __field(gfp_t, gfp_flags)
200 : : __field(unsigned long, cache_items)
201 : : __field(unsigned long long, delta)
202 : : __field(unsigned long, total_scan)
203 : : __field(int, priority)
204 : : ),
205 : :
206 : : TP_fast_assign(
207 : : __entry->shr = shr;
208 : : __entry->shrink = shr->scan_objects;
209 : : __entry->nid = sc->nid;
210 : : __entry->nr_objects_to_shrink = nr_objects_to_shrink;
211 : : __entry->gfp_flags = sc->gfp_mask;
212 : : __entry->cache_items = cache_items;
213 : : __entry->delta = delta;
214 : : __entry->total_scan = total_scan;
215 : : __entry->priority = priority;
216 : : ),
217 : :
218 : : TP_printk("%pS %p: nid: %d objects to shrink %ld gfp_flags %s cache items %ld delta %lld total_scan %ld priority %d",
219 : : __entry->shrink,
220 : : __entry->shr,
221 : : __entry->nid,
222 : : __entry->nr_objects_to_shrink,
223 : : show_gfp_flags(__entry->gfp_flags),
224 : : __entry->cache_items,
225 : : __entry->delta,
226 : : __entry->total_scan,
227 : : __entry->priority)
228 : : );
229 : :
230 : 3 : TRACE_EVENT(mm_shrink_slab_end,
231 : : TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval,
232 : : long unused_scan_cnt, long new_scan_cnt, long total_scan),
233 : :
234 : : TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt,
235 : : total_scan),
236 : :
237 : : TP_STRUCT__entry(
238 : : __field(struct shrinker *, shr)
239 : : __field(int, nid)
240 : : __field(void *, shrink)
241 : : __field(long, unused_scan)
242 : : __field(long, new_scan)
243 : : __field(int, retval)
244 : : __field(long, total_scan)
245 : : ),
246 : :
247 : : TP_fast_assign(
248 : : __entry->shr = shr;
249 : : __entry->nid = nid;
250 : : __entry->shrink = shr->scan_objects;
251 : : __entry->unused_scan = unused_scan_cnt;
252 : : __entry->new_scan = new_scan_cnt;
253 : : __entry->retval = shrinker_retval;
254 : : __entry->total_scan = total_scan;
255 : : ),
256 : :
257 : : TP_printk("%pS %p: nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d",
258 : : __entry->shrink,
259 : : __entry->shr,
260 : : __entry->nid,
261 : : __entry->unused_scan,
262 : : __entry->new_scan,
263 : : __entry->total_scan,
264 : : __entry->retval)
265 : : );
266 : :
267 : 3 : TRACE_EVENT(mm_vmscan_lru_isolate,
268 : : TP_PROTO(int classzone_idx,
269 : : int order,
270 : : unsigned long nr_requested,
271 : : unsigned long nr_scanned,
272 : : unsigned long nr_skipped,
273 : : unsigned long nr_taken,
274 : : isolate_mode_t isolate_mode,
275 : : int lru),
276 : :
277 : : TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, isolate_mode, lru),
278 : :
279 : : TP_STRUCT__entry(
280 : : __field(int, classzone_idx)
281 : : __field(int, order)
282 : : __field(unsigned long, nr_requested)
283 : : __field(unsigned long, nr_scanned)
284 : : __field(unsigned long, nr_skipped)
285 : : __field(unsigned long, nr_taken)
286 : : __field(isolate_mode_t, isolate_mode)
287 : : __field(int, lru)
288 : : ),
289 : :
290 : : TP_fast_assign(
291 : : __entry->classzone_idx = classzone_idx;
292 : : __entry->order = order;
293 : : __entry->nr_requested = nr_requested;
294 : : __entry->nr_scanned = nr_scanned;
295 : : __entry->nr_skipped = nr_skipped;
296 : : __entry->nr_taken = nr_taken;
297 : : __entry->isolate_mode = isolate_mode;
298 : : __entry->lru = lru;
299 : : ),
300 : :
301 : : TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu lru=%s",
302 : : __entry->isolate_mode,
303 : : __entry->classzone_idx,
304 : : __entry->order,
305 : : __entry->nr_requested,
306 : : __entry->nr_scanned,
307 : : __entry->nr_skipped,
308 : : __entry->nr_taken,
309 : : __print_symbolic(__entry->lru, LRU_NAMES))
310 : : );
311 : :
312 : 3 : TRACE_EVENT(mm_vmscan_writepage,
313 : :
314 : : TP_PROTO(struct page *page),
315 : :
316 : : TP_ARGS(page),
317 : :
318 : : TP_STRUCT__entry(
319 : : __field(unsigned long, pfn)
320 : : __field(int, reclaim_flags)
321 : : ),
322 : :
323 : : TP_fast_assign(
324 : : __entry->pfn = page_to_pfn(page);
325 : : __entry->reclaim_flags = trace_reclaim_flags(
326 : : page_is_file_cache(page));
327 : : ),
328 : :
329 : : TP_printk("page=%p pfn=%lu flags=%s",
330 : : pfn_to_page(__entry->pfn),
331 : : __entry->pfn,
332 : : show_reclaim_flags(__entry->reclaim_flags))
333 : : );
334 : :
335 : 3 : TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
336 : :
337 : : TP_PROTO(int nid,
338 : : unsigned long nr_scanned, unsigned long nr_reclaimed,
339 : : struct reclaim_stat *stat, int priority, int file),
340 : :
341 : : TP_ARGS(nid, nr_scanned, nr_reclaimed, stat, priority, file),
342 : :
343 : : TP_STRUCT__entry(
344 : : __field(int, nid)
345 : : __field(unsigned long, nr_scanned)
346 : : __field(unsigned long, nr_reclaimed)
347 : : __field(unsigned long, nr_dirty)
348 : : __field(unsigned long, nr_writeback)
349 : : __field(unsigned long, nr_congested)
350 : : __field(unsigned long, nr_immediate)
351 : : __field(unsigned int, nr_activate0)
352 : : __field(unsigned int, nr_activate1)
353 : : __field(unsigned long, nr_ref_keep)
354 : : __field(unsigned long, nr_unmap_fail)
355 : : __field(int, priority)
356 : : __field(int, reclaim_flags)
357 : : ),
358 : :
359 : : TP_fast_assign(
360 : : __entry->nid = nid;
361 : : __entry->nr_scanned = nr_scanned;
362 : : __entry->nr_reclaimed = nr_reclaimed;
363 : : __entry->nr_dirty = stat->nr_dirty;
364 : : __entry->nr_writeback = stat->nr_writeback;
365 : : __entry->nr_congested = stat->nr_congested;
366 : : __entry->nr_immediate = stat->nr_immediate;
367 : : __entry->nr_activate0 = stat->nr_activate[0];
368 : : __entry->nr_activate1 = stat->nr_activate[1];
369 : : __entry->nr_ref_keep = stat->nr_ref_keep;
370 : : __entry->nr_unmap_fail = stat->nr_unmap_fail;
371 : : __entry->priority = priority;
372 : : __entry->reclaim_flags = trace_reclaim_flags(file);
373 : : ),
374 : :
375 : : TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
376 : : __entry->nid,
377 : : __entry->nr_scanned, __entry->nr_reclaimed,
378 : : __entry->nr_dirty, __entry->nr_writeback,
379 : : __entry->nr_congested, __entry->nr_immediate,
380 : : __entry->nr_activate0, __entry->nr_activate1,
381 : : __entry->nr_ref_keep, __entry->nr_unmap_fail,
382 : : __entry->priority,
383 : : show_reclaim_flags(__entry->reclaim_flags))
384 : : );
385 : :
386 : 3 : TRACE_EVENT(mm_vmscan_lru_shrink_active,
387 : :
388 : : TP_PROTO(int nid, unsigned long nr_taken,
389 : : unsigned long nr_active, unsigned long nr_deactivated,
390 : : unsigned long nr_referenced, int priority, int file),
391 : :
392 : : TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file),
393 : :
394 : : TP_STRUCT__entry(
395 : : __field(int, nid)
396 : : __field(unsigned long, nr_taken)
397 : : __field(unsigned long, nr_active)
398 : : __field(unsigned long, nr_deactivated)
399 : : __field(unsigned long, nr_referenced)
400 : : __field(int, priority)
401 : : __field(int, reclaim_flags)
402 : : ),
403 : :
404 : : TP_fast_assign(
405 : : __entry->nid = nid;
406 : : __entry->nr_taken = nr_taken;
407 : : __entry->nr_active = nr_active;
408 : : __entry->nr_deactivated = nr_deactivated;
409 : : __entry->nr_referenced = nr_referenced;
410 : : __entry->priority = priority;
411 : : __entry->reclaim_flags = trace_reclaim_flags(file);
412 : : ),
413 : :
414 : : TP_printk("nid=%d nr_taken=%ld nr_active=%ld nr_deactivated=%ld nr_referenced=%ld priority=%d flags=%s",
415 : : __entry->nid,
416 : : __entry->nr_taken,
417 : : __entry->nr_active, __entry->nr_deactivated, __entry->nr_referenced,
418 : : __entry->priority,
419 : : show_reclaim_flags(__entry->reclaim_flags))
420 : : );
421 : :
422 : 3 : TRACE_EVENT(mm_vmscan_inactive_list_is_low,
423 : :
424 : : TP_PROTO(int nid, int reclaim_idx,
425 : : unsigned long total_inactive, unsigned long inactive,
426 : : unsigned long total_active, unsigned long active,
427 : : unsigned long ratio, int file),
428 : :
429 : : TP_ARGS(nid, reclaim_idx, total_inactive, inactive, total_active, active, ratio, file),
430 : :
431 : : TP_STRUCT__entry(
432 : : __field(int, nid)
433 : : __field(int, reclaim_idx)
434 : : __field(unsigned long, total_inactive)
435 : : __field(unsigned long, inactive)
436 : : __field(unsigned long, total_active)
437 : : __field(unsigned long, active)
438 : : __field(unsigned long, ratio)
439 : : __field(int, reclaim_flags)
440 : : ),
441 : :
442 : : TP_fast_assign(
443 : : __entry->nid = nid;
444 : : __entry->reclaim_idx = reclaim_idx;
445 : : __entry->total_inactive = total_inactive;
446 : : __entry->inactive = inactive;
447 : : __entry->total_active = total_active;
448 : : __entry->active = active;
449 : : __entry->ratio = ratio;
450 : : __entry->reclaim_flags = trace_reclaim_flags(file) &
451 : : RECLAIM_WB_LRU;
452 : : ),
453 : :
454 : : TP_printk("nid=%d reclaim_idx=%d total_inactive=%ld inactive=%ld total_active=%ld active=%ld ratio=%ld flags=%s",
455 : : __entry->nid,
456 : : __entry->reclaim_idx,
457 : : __entry->total_inactive, __entry->inactive,
458 : : __entry->total_active, __entry->active,
459 : : __entry->ratio,
460 : : show_reclaim_flags(__entry->reclaim_flags))
461 : : );
462 : :
463 : 3 : TRACE_EVENT(mm_vmscan_node_reclaim_begin,
464 : :
465 : : TP_PROTO(int nid, int order, gfp_t gfp_flags),
466 : :
467 : : TP_ARGS(nid, order, gfp_flags),
468 : :
469 : : TP_STRUCT__entry(
470 : : __field(int, nid)
471 : : __field(int, order)
472 : : __field(gfp_t, gfp_flags)
473 : : ),
474 : :
475 : : TP_fast_assign(
476 : : __entry->nid = nid;
477 : : __entry->order = order;
478 : : __entry->gfp_flags = gfp_flags;
479 : : ),
480 : :
481 : : TP_printk("nid=%d order=%d gfp_flags=%s",
482 : : __entry->nid,
483 : : __entry->order,
484 : : show_gfp_flags(__entry->gfp_flags))
485 : : );
486 : :
487 : : DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_node_reclaim_end,
488 : :
489 : : TP_PROTO(unsigned long nr_reclaimed),
490 : :
491 : : TP_ARGS(nr_reclaimed)
492 : : );
493 : :
494 : : #endif /* _TRACE_VMSCAN_H */
495 : :
496 : : /* This part must be outside protection */
497 : : #include <trace/define_trace.h>
|