vmscan.h 12.4 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5 6 7 8 9
#undef TRACE_SYSTEM
#define TRACE_SYSTEM vmscan

#if !defined(_TRACE_VMSCAN_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_VMSCAN_H

#include <linux/types.h>
#include <linux/tracepoint.h>
10 11
#include <linux/mm.h>
#include <linux/memcontrol.h>
12
#include <trace/events/mmflags.h>
13

14 15
#define RECLAIM_WB_ANON		0x0001u
#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 22 23 24

#define show_reclaim_flags(flags)				\
	(flags) ? __print_flags(flags, "|",			\
		{RECLAIM_WB_ANON,	"RECLAIM_WB_ANON"},	\
		{RECLAIM_WB_FILE,	"RECLAIM_WB_FILE"},	\
25
		{RECLAIM_WB_MIXED,	"RECLAIM_WB_MIXED"},	\
26 27 28 29
		{RECLAIM_WB_SYNC,	"RECLAIM_WB_SYNC"},	\
		{RECLAIM_WB_ASYNC,	"RECLAIM_WB_ASYNC"}	\
		) : "RECLAIM_WB_NONE"

M
Mel Gorman 已提交
30
#define trace_reclaim_flags(page) ( \
31
	(page_is_file_cache(page) ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
32
	(RECLAIM_WB_ASYNC) \
33 34
	)

M
Mel Gorman 已提交
35
#define trace_shrink_flags(file) \
36 37 38
	( \
		(file ? RECLAIM_WB_FILE : RECLAIM_WB_ANON) | \
		(RECLAIM_WB_ASYNC) \
39 40
	)

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
TRACE_EVENT(mm_vmscan_kswapd_sleep,

	TP_PROTO(int nid),

	TP_ARGS(nid),

	TP_STRUCT__entry(
		__field(	int,	nid	)
	),

	TP_fast_assign(
		__entry->nid	= nid;
	),

	TP_printk("nid=%d", __entry->nid)
);

TRACE_EVENT(mm_vmscan_kswapd_wake,

60
	TP_PROTO(int nid, int zid, int order),
61

62
	TP_ARGS(nid, zid, order),
63 64 65

	TP_STRUCT__entry(
		__field(	int,	nid	)
66
		__field(	int,	zid	)
67 68 69 70 71
		__field(	int,	order	)
	),

	TP_fast_assign(
		__entry->nid	= nid;
72
		__entry->zid    = zid;
73 74 75
		__entry->order	= order;
	),

76
	TP_printk("nid=%d zid=%d order=%d", __entry->nid, __entry->zid, __entry->order)
77 78 79 80
);

TRACE_EVENT(mm_vmscan_wakeup_kswapd,

81
	TP_PROTO(int nid, int zid, int order, gfp_t gfp_flags),
82

83
	TP_ARGS(nid, zid, order, gfp_flags),
84 85

	TP_STRUCT__entry(
86 87 88 89
		__field(	int,	nid		)
		__field(	int,	zid		)
		__field(	int,	order		)
		__field(	gfp_t,	gfp_flags	)
90 91 92 93 94 95
	),

	TP_fast_assign(
		__entry->nid		= nid;
		__entry->zid		= zid;
		__entry->order		= order;
96
		__entry->gfp_flags	= gfp_flags;
97 98
	),

99
	TP_printk("nid=%d zid=%d order=%d gfp_flags=%s",
100 101
		__entry->nid,
		__entry->zid,
102 103
		__entry->order,
		show_gfp_flags(__entry->gfp_flags))
104 105
);

106
DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template,
107

108
	TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx),
109

110
	TP_ARGS(order, may_writepage, gfp_flags, classzone_idx),
111 112 113 114 115

	TP_STRUCT__entry(
		__field(	int,	order		)
		__field(	int,	may_writepage	)
		__field(	gfp_t,	gfp_flags	)
116
		__field(	int,	classzone_idx	)
117 118 119 120 121 122
	),

	TP_fast_assign(
		__entry->order		= order;
		__entry->may_writepage	= may_writepage;
		__entry->gfp_flags	= gfp_flags;
123
		__entry->classzone_idx	= classzone_idx;
124 125
	),

126
	TP_printk("order=%d may_writepage=%d gfp_flags=%s classzone_idx=%d",
127 128
		__entry->order,
		__entry->may_writepage,
129 130
		show_gfp_flags(__entry->gfp_flags),
		__entry->classzone_idx)
131 132
);

133 134
DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin,

135
	TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx),
136

137
	TP_ARGS(order, may_writepage, gfp_flags, classzone_idx)
138 139
);

140
#ifdef CONFIG_MEMCG
141 142
DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin,

143
	TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx),
144

145
	TP_ARGS(order, may_writepage, gfp_flags, classzone_idx)
146 147 148 149
);

DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin,

150
	TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx),
151

152
	TP_ARGS(order, may_writepage, gfp_flags, classzone_idx)
153
);
154
#endif /* CONFIG_MEMCG */
155 156

DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template,
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

	TP_PROTO(unsigned long nr_reclaimed),

	TP_ARGS(nr_reclaimed),

	TP_STRUCT__entry(
		__field(	unsigned long,	nr_reclaimed	)
	),

	TP_fast_assign(
		__entry->nr_reclaimed	= nr_reclaimed;
	),

	TP_printk("nr_reclaimed=%lu", __entry->nr_reclaimed)
);

173 174 175 176 177 178 179
DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_direct_reclaim_end,

	TP_PROTO(unsigned long nr_reclaimed),

	TP_ARGS(nr_reclaimed)
);

180
#ifdef CONFIG_MEMCG
181 182 183 184 185 186 187 188 189 190 191 192 193
DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_reclaim_end,

	TP_PROTO(unsigned long nr_reclaimed),

	TP_ARGS(nr_reclaimed)
);

DEFINE_EVENT(mm_vmscan_direct_reclaim_end_template, mm_vmscan_memcg_softlimit_reclaim_end,

	TP_PROTO(unsigned long nr_reclaimed),

	TP_ARGS(nr_reclaimed)
);
194
#endif /* CONFIG_MEMCG */
195

196 197
TRACE_EVENT(mm_shrink_slab_start,
	TP_PROTO(struct shrinker *shr, struct shrink_control *sc,
198 199 200
		long nr_objects_to_shrink, unsigned long cache_items,
		unsigned long long delta, unsigned long total_scan,
		int priority),
201

202 203
	TP_ARGS(shr, sc, nr_objects_to_shrink, cache_items, delta, total_scan,
		priority),
204 205 206 207

	TP_STRUCT__entry(
		__field(struct shrinker *, shr)
		__field(void *, shrink)
208
		__field(int, nid)
209 210 211 212 213
		__field(long, nr_objects_to_shrink)
		__field(gfp_t, gfp_flags)
		__field(unsigned long, cache_items)
		__field(unsigned long long, delta)
		__field(unsigned long, total_scan)
214
		__field(int, priority)
215 216 217 218
	),

	TP_fast_assign(
		__entry->shr = shr;
D
Dave Chinner 已提交
219
		__entry->shrink = shr->scan_objects;
220
		__entry->nid = sc->nid;
221 222 223 224 225
		__entry->nr_objects_to_shrink = nr_objects_to_shrink;
		__entry->gfp_flags = sc->gfp_mask;
		__entry->cache_items = cache_items;
		__entry->delta = delta;
		__entry->total_scan = total_scan;
226
		__entry->priority = priority;
227 228
	),

229
	TP_printk("%pF %p: nid: %d objects to shrink %ld gfp_flags %s cache items %ld delta %lld total_scan %ld priority %d",
230 231
		__entry->shrink,
		__entry->shr,
232
		__entry->nid,
233 234 235 236
		__entry->nr_objects_to_shrink,
		show_gfp_flags(__entry->gfp_flags),
		__entry->cache_items,
		__entry->delta,
237 238
		__entry->total_scan,
		__entry->priority)
239 240 241
);

TRACE_EVENT(mm_shrink_slab_end,
242
	TP_PROTO(struct shrinker *shr, int nid, int shrinker_retval,
243
		long unused_scan_cnt, long new_scan_cnt, long total_scan),
244

245 246
	TP_ARGS(shr, nid, shrinker_retval, unused_scan_cnt, new_scan_cnt,
		total_scan),
247 248 249

	TP_STRUCT__entry(
		__field(struct shrinker *, shr)
250
		__field(int, nid)
251 252 253 254 255 256 257 258 259
		__field(void *, shrink)
		__field(long, unused_scan)
		__field(long, new_scan)
		__field(int, retval)
		__field(long, total_scan)
	),

	TP_fast_assign(
		__entry->shr = shr;
260
		__entry->nid = nid;
D
Dave Chinner 已提交
261
		__entry->shrink = shr->scan_objects;
262 263 264
		__entry->unused_scan = unused_scan_cnt;
		__entry->new_scan = new_scan_cnt;
		__entry->retval = shrinker_retval;
265
		__entry->total_scan = total_scan;
266 267
	),

268
	TP_printk("%pF %p: nid: %d unused scan count %ld new scan count %ld total_scan %ld last shrinker return val %d",
269 270
		__entry->shrink,
		__entry->shr,
271
		__entry->nid,
272 273 274 275 276
		__entry->unused_scan,
		__entry->new_scan,
		__entry->total_scan,
		__entry->retval)
);
277

278
TRACE_EVENT(mm_vmscan_lru_isolate,
279 280
	TP_PROTO(int classzone_idx,
		int order,
281 282
		unsigned long nr_requested,
		unsigned long nr_scanned,
283
		unsigned long nr_skipped,
284
		unsigned long nr_taken,
285
		isolate_mode_t isolate_mode,
286
		int lru),
287

288
	TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, isolate_mode, lru),
289 290

	TP_STRUCT__entry(
291
		__field(int, classzone_idx)
292 293 294
		__field(int, order)
		__field(unsigned long, nr_requested)
		__field(unsigned long, nr_scanned)
295
		__field(unsigned long, nr_skipped)
296
		__field(unsigned long, nr_taken)
297
		__field(isolate_mode_t, isolate_mode)
298
		__field(int, lru)
299 300 301
	),

	TP_fast_assign(
302
		__entry->classzone_idx = classzone_idx;
303 304 305
		__entry->order = order;
		__entry->nr_requested = nr_requested;
		__entry->nr_scanned = nr_scanned;
306
		__entry->nr_skipped = nr_skipped;
307 308
		__entry->nr_taken = nr_taken;
		__entry->isolate_mode = isolate_mode;
309
		__entry->lru = lru;
310 311
	),

312
	TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu lru=%s",
313
		__entry->isolate_mode,
314
		__entry->classzone_idx,
315 316 317
		__entry->order,
		__entry->nr_requested,
		__entry->nr_scanned,
318
		__entry->nr_skipped,
319
		__entry->nr_taken,
320
		__print_symbolic(__entry->lru, LRU_NAMES))
321 322
);

323 324
TRACE_EVENT(mm_vmscan_writepage,

325
	TP_PROTO(struct page *page),
326

327
	TP_ARGS(page),
328 329

	TP_STRUCT__entry(
330
		__field(unsigned long, pfn)
331 332 333 334
		__field(int, reclaim_flags)
	),

	TP_fast_assign(
335
		__entry->pfn = page_to_pfn(page);
336
		__entry->reclaim_flags = trace_reclaim_flags(page);
337 338 339
	),

	TP_printk("page=%p pfn=%lu flags=%s",
340 341
		pfn_to_page(__entry->pfn),
		__entry->pfn,
342 343 344
		show_reclaim_flags(__entry->reclaim_flags))
);

345 346
TRACE_EVENT(mm_vmscan_lru_shrink_inactive,

M
Mel Gorman 已提交
347
	TP_PROTO(int nid,
348
		unsigned long nr_scanned, unsigned long nr_reclaimed,
349 350 351 352
		unsigned long nr_dirty, unsigned long nr_writeback,
		unsigned long nr_congested, unsigned long nr_immediate,
		unsigned long nr_activate, unsigned long nr_ref_keep,
		unsigned long nr_unmap_fail,
353
		int priority, int file),
354

355 356 357
	TP_ARGS(nid, nr_scanned, nr_reclaimed, nr_dirty, nr_writeback,
		nr_congested, nr_immediate, nr_activate, nr_ref_keep,
		nr_unmap_fail, priority, file),
358 359 360 361 362

	TP_STRUCT__entry(
		__field(int, nid)
		__field(unsigned long, nr_scanned)
		__field(unsigned long, nr_reclaimed)
363 364 365 366 367 368 369
		__field(unsigned long, nr_dirty)
		__field(unsigned long, nr_writeback)
		__field(unsigned long, nr_congested)
		__field(unsigned long, nr_immediate)
		__field(unsigned long, nr_activate)
		__field(unsigned long, nr_ref_keep)
		__field(unsigned long, nr_unmap_fail)
370 371 372 373 374
		__field(int, priority)
		__field(int, reclaim_flags)
	),

	TP_fast_assign(
M
Mel Gorman 已提交
375
		__entry->nid = nid;
376 377
		__entry->nr_scanned = nr_scanned;
		__entry->nr_reclaimed = nr_reclaimed;
378 379 380 381 382 383 384
		__entry->nr_dirty = nr_dirty;
		__entry->nr_writeback = nr_writeback;
		__entry->nr_congested = nr_congested;
		__entry->nr_immediate = nr_immediate;
		__entry->nr_activate = nr_activate;
		__entry->nr_ref_keep = nr_ref_keep;
		__entry->nr_unmap_fail = nr_unmap_fail;
385
		__entry->priority = priority;
386
		__entry->reclaim_flags = trace_shrink_flags(file);
387 388
	),

389
	TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate=%ld nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
M
Mel Gorman 已提交
390
		__entry->nid,
391
		__entry->nr_scanned, __entry->nr_reclaimed,
392 393 394 395
		__entry->nr_dirty, __entry->nr_writeback,
		__entry->nr_congested, __entry->nr_immediate,
		__entry->nr_activate, __entry->nr_ref_keep,
		__entry->nr_unmap_fail, __entry->priority,
396 397 398
		show_reclaim_flags(__entry->reclaim_flags))
);

399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
TRACE_EVENT(mm_vmscan_lru_shrink_active,

	TP_PROTO(int nid, unsigned long nr_taken,
		unsigned long nr_active, unsigned long nr_deactivated,
		unsigned long nr_referenced, int priority, int file),

	TP_ARGS(nid, nr_taken, nr_active, nr_deactivated, nr_referenced, priority, file),

	TP_STRUCT__entry(
		__field(int, nid)
		__field(unsigned long, nr_taken)
		__field(unsigned long, nr_active)
		__field(unsigned long, nr_deactivated)
		__field(unsigned long, nr_referenced)
		__field(int, priority)
		__field(int, reclaim_flags)
	),

	TP_fast_assign(
		__entry->nid = nid;
		__entry->nr_taken = nr_taken;
		__entry->nr_active = nr_active;
		__entry->nr_deactivated = nr_deactivated;
		__entry->nr_referenced = nr_referenced;
		__entry->priority = priority;
		__entry->reclaim_flags = trace_shrink_flags(file);
	),

	TP_printk("nid=%d nr_taken=%ld nr_active=%ld nr_deactivated=%ld nr_referenced=%ld priority=%d flags=%s",
		__entry->nid,
		__entry->nr_taken,
		__entry->nr_active, __entry->nr_deactivated, __entry->nr_referenced,
		__entry->priority,
		show_reclaim_flags(__entry->reclaim_flags))
);

435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
TRACE_EVENT(mm_vmscan_inactive_list_is_low,

	TP_PROTO(int nid, int reclaim_idx,
		unsigned long total_inactive, unsigned long inactive,
		unsigned long total_active, unsigned long active,
		unsigned long ratio, int file),

	TP_ARGS(nid, reclaim_idx, total_inactive, inactive, total_active, active, ratio, file),

	TP_STRUCT__entry(
		__field(int, nid)
		__field(int, reclaim_idx)
		__field(unsigned long, total_inactive)
		__field(unsigned long, inactive)
		__field(unsigned long, total_active)
		__field(unsigned long, active)
		__field(unsigned long, ratio)
		__field(int, reclaim_flags)
	),

	TP_fast_assign(
		__entry->nid = nid;
		__entry->reclaim_idx = reclaim_idx;
		__entry->total_inactive = total_inactive;
		__entry->inactive = inactive;
		__entry->total_active = total_active;
		__entry->active = active;
		__entry->ratio = ratio;
		__entry->reclaim_flags = trace_shrink_flags(file) & RECLAIM_WB_LRU;
	),

	TP_printk("nid=%d reclaim_idx=%d total_inactive=%ld inactive=%ld total_active=%ld active=%ld ratio=%ld flags=%s",
		__entry->nid,
		__entry->reclaim_idx,
		__entry->total_inactive, __entry->inactive,
		__entry->total_active, __entry->active,
		__entry->ratio,
		show_reclaim_flags(__entry->reclaim_flags))
);
474 475 476 477
#endif /* _TRACE_VMSCAN_H */

/* This part must be outside protection */
#include <trace/define_trace.h>