compaction.h 9.0 KB
Newer Older
1 2 3 4 5 6 7
#undef TRACE_SYSTEM
#define TRACE_SYSTEM compaction

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

#include <linux/types.h>
8
#include <linux/list.h>
9
#include <linux/tracepoint.h>
10
#include <trace/events/mmflags.h>
11

12 13
#define COMPACTION_STATUS					\
	EM( COMPACT_SKIPPED,		"skipped")		\
14
	EM( COMPACT_DEFERRED,		"deferred")		\
15
	EM( COMPACT_CONTINUE,		"continue")		\
16
	EM( COMPACT_SUCCESS,		"success")		\
17
	EM( COMPACT_PARTIAL_SKIPPED,	"partial_skipped")	\
18 19
	EM( COMPACT_COMPLETE,		"complete")		\
	EM( COMPACT_NO_SUITABLE_PAGE,	"no_suitable_page")	\
20 21
	EM( COMPACT_NOT_SUITABLE_ZONE,	"not_suitable_zone")	\
	EMe(COMPACT_CONTENDED,		"contended")
22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#ifdef CONFIG_ZONE_DMA
#define IFDEF_ZONE_DMA(X) X
#else
#define IFDEF_ZONE_DMA(X)
#endif

#ifdef CONFIG_ZONE_DMA32
#define IFDEF_ZONE_DMA32(X) X
#else
#define IFDEF_ZONE_DMA32(X)
#endif

#ifdef CONFIG_HIGHMEM
#define IFDEF_ZONE_HIGHMEM(X) X
#else
#define IFDEF_ZONE_HIGHMEM(X)
#endif

#define ZONE_TYPE						\
	IFDEF_ZONE_DMA(		EM (ZONE_DMA,	 "DMA"))	\
	IFDEF_ZONE_DMA32(	EM (ZONE_DMA32,	 "DMA32"))	\
				EM (ZONE_NORMAL, "Normal")	\
	IFDEF_ZONE_HIGHMEM(	EM (ZONE_HIGHMEM,"HighMem"))	\
				EMe(ZONE_MOVABLE,"Movable")

48 49 50 51 52 53 54 55 56 57
/*
 * First define the enums in the above macros to be exported to userspace
 * via TRACE_DEFINE_ENUM().
 */
#undef EM
#undef EMe
#define EM(a, b)	TRACE_DEFINE_ENUM(a);
#define EMe(a, b)	TRACE_DEFINE_ENUM(a);

COMPACTION_STATUS
58
ZONE_TYPE
59 60 61 62 63 64 65 66 67 68

/*
 * Now redefine the EM() and EMe() macros to map the enums to the strings
 * that will be printed in the output.
 */
#undef EM
#undef EMe
#define EM(a, b)	{a, b},
#define EMe(a, b)	{a, b}

69 70
DECLARE_EVENT_CLASS(mm_compaction_isolate_template,

71 72 73 74
	TP_PROTO(
		unsigned long start_pfn,
		unsigned long end_pfn,
		unsigned long nr_scanned,
75 76
		unsigned long nr_taken),

77
	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken),
78 79

	TP_STRUCT__entry(
80 81
		__field(unsigned long, start_pfn)
		__field(unsigned long, end_pfn)
82 83 84 85 86
		__field(unsigned long, nr_scanned)
		__field(unsigned long, nr_taken)
	),

	TP_fast_assign(
87 88
		__entry->start_pfn = start_pfn;
		__entry->end_pfn = end_pfn;
89 90 91 92
		__entry->nr_scanned = nr_scanned;
		__entry->nr_taken = nr_taken;
	),

93 94 95
	TP_printk("range=(0x%lx ~ 0x%lx) nr_scanned=%lu nr_taken=%lu",
		__entry->start_pfn,
		__entry->end_pfn,
96 97 98 99 100 101
		__entry->nr_scanned,
		__entry->nr_taken)
);

DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_migratepages,

102 103 104 105
	TP_PROTO(
		unsigned long start_pfn,
		unsigned long end_pfn,
		unsigned long nr_scanned,
106 107
		unsigned long nr_taken),

108
	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken)
109 110 111
);

DEFINE_EVENT(mm_compaction_isolate_template, mm_compaction_isolate_freepages,
112 113 114 115 116

	TP_PROTO(
		unsigned long start_pfn,
		unsigned long end_pfn,
		unsigned long nr_scanned,
117 118
		unsigned long nr_taken),

119
	TP_ARGS(start_pfn, end_pfn, nr_scanned, nr_taken)
120 121 122 123
);

TRACE_EVENT(mm_compaction_migratepages,

124 125 126
	TP_PROTO(unsigned long nr_all,
		int migrate_rc,
		struct list_head *migratepages),
127

128
	TP_ARGS(nr_all, migrate_rc, migratepages),
129 130 131 132 133 134 135

	TP_STRUCT__entry(
		__field(unsigned long, nr_migrated)
		__field(unsigned long, nr_failed)
	),

	TP_fast_assign(
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
		unsigned long nr_failed = 0;
		struct list_head *page_lru;

		/*
		 * migrate_pages() returns either a non-negative number
		 * with the number of pages that failed migration, or an
		 * error code, in which case we need to count the remaining
		 * pages manually
		 */
		if (migrate_rc >= 0)
			nr_failed = migrate_rc;
		else
			list_for_each(page_lru, migratepages)
				nr_failed++;

		__entry->nr_migrated = nr_all - nr_failed;
152 153 154 155 156 157 158 159
		__entry->nr_failed = nr_failed;
	),

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

160
TRACE_EVENT(mm_compaction_begin,
161 162
	TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn,
		unsigned long free_pfn, unsigned long zone_end, bool sync),
163

164
	TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync),
165 166 167

	TP_STRUCT__entry(
		__field(unsigned long, zone_start)
168 169
		__field(unsigned long, migrate_pfn)
		__field(unsigned long, free_pfn)
170
		__field(unsigned long, zone_end)
171
		__field(bool, sync)
172 173 174 175
	),

	TP_fast_assign(
		__entry->zone_start = zone_start;
176 177
		__entry->migrate_pfn = migrate_pfn;
		__entry->free_pfn = free_pfn;
178
		__entry->zone_end = zone_end;
179
		__entry->sync = sync;
180 181
	),

182
	TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s",
183
		__entry->zone_start,
184 185 186 187
		__entry->migrate_pfn,
		__entry->free_pfn,
		__entry->zone_end,
		__entry->sync ? "sync" : "async")
188 189 190
);

TRACE_EVENT(mm_compaction_end,
191 192 193
	TP_PROTO(unsigned long zone_start, unsigned long migrate_pfn,
		unsigned long free_pfn, unsigned long zone_end, bool sync,
		int status),
194

195
	TP_ARGS(zone_start, migrate_pfn, free_pfn, zone_end, sync, status),
196 197

	TP_STRUCT__entry(
198 199 200 201 202
		__field(unsigned long, zone_start)
		__field(unsigned long, migrate_pfn)
		__field(unsigned long, free_pfn)
		__field(unsigned long, zone_end)
		__field(bool, sync)
203 204 205 206
		__field(int, status)
	),

	TP_fast_assign(
207 208 209 210 211
		__entry->zone_start = zone_start;
		__entry->migrate_pfn = migrate_pfn;
		__entry->free_pfn = free_pfn;
		__entry->zone_end = zone_end;
		__entry->sync = sync;
212 213 214
		__entry->status = status;
	),

215 216 217 218 219 220
	TP_printk("zone_start=0x%lx migrate_pfn=0x%lx free_pfn=0x%lx zone_end=0x%lx, mode=%s status=%s",
		__entry->zone_start,
		__entry->migrate_pfn,
		__entry->free_pfn,
		__entry->zone_end,
		__entry->sync ? "sync" : "async",
221
		__print_symbolic(__entry->status, COMPACTION_STATUS))
222
);
223

224 225 226 227 228
TRACE_EVENT(mm_compaction_try_to_compact_pages,

	TP_PROTO(
		int order,
		gfp_t gfp_mask,
229
		int prio),
230

231
	TP_ARGS(order, gfp_mask, prio),
232 233 234 235

	TP_STRUCT__entry(
		__field(int, order)
		__field(gfp_t, gfp_mask)
236
		__field(int, prio)
237 238 239 240 241
	),

	TP_fast_assign(
		__entry->order = order;
		__entry->gfp_mask = gfp_mask;
242
		__entry->prio = prio;
243 244
	),

245
	TP_printk("order=%d gfp_mask=0x%x priority=%d",
246 247
		__entry->order,
		__entry->gfp_mask,
248
		__entry->prio)
249 250 251 252 253 254 255 256 257 258 259 260
);

DECLARE_EVENT_CLASS(mm_compaction_suitable_template,

	TP_PROTO(struct zone *zone,
		int order,
		int ret),

	TP_ARGS(zone, order, ret),

	TP_STRUCT__entry(
		__field(int, nid)
261
		__field(enum zone_type, idx)
262 263 264 265 266 267
		__field(int, order)
		__field(int, ret)
	),

	TP_fast_assign(
		__entry->nid = zone_to_nid(zone);
268
		__entry->idx = zone_idx(zone);
269 270 271 272 273 274
		__entry->order = order;
		__entry->ret = ret;
	),

	TP_printk("node=%d zone=%-8s order=%d ret=%s",
		__entry->nid,
275
		__print_symbolic(__entry->idx, ZONE_TYPE),
276
		__entry->order,
277
		__print_symbolic(__entry->ret, COMPACTION_STATUS))
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
);

DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_finished,

	TP_PROTO(struct zone *zone,
		int order,
		int ret),

	TP_ARGS(zone, order, ret)
);

DEFINE_EVENT(mm_compaction_suitable_template, mm_compaction_suitable,

	TP_PROTO(struct zone *zone,
		int order,
		int ret),

	TP_ARGS(zone, order, ret)
);

298 299 300 301 302 303 304 305 306
#ifdef CONFIG_COMPACTION
DECLARE_EVENT_CLASS(mm_compaction_defer_template,

	TP_PROTO(struct zone *zone, int order),

	TP_ARGS(zone, order),

	TP_STRUCT__entry(
		__field(int, nid)
307
		__field(enum zone_type, idx)
308 309 310 311 312 313 314 315
		__field(int, order)
		__field(unsigned int, considered)
		__field(unsigned int, defer_shift)
		__field(int, order_failed)
	),

	TP_fast_assign(
		__entry->nid = zone_to_nid(zone);
316
		__entry->idx = zone_idx(zone);
317 318 319 320 321 322 323 324
		__entry->order = order;
		__entry->considered = zone->compact_considered;
		__entry->defer_shift = zone->compact_defer_shift;
		__entry->order_failed = zone->compact_order_failed;
	),

	TP_printk("node=%d zone=%-8s order=%d order_failed=%d consider=%u limit=%lu",
		__entry->nid,
325
		__print_symbolic(__entry->idx, ZONE_TYPE),
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
		__entry->order,
		__entry->order_failed,
		__entry->considered,
		1UL << __entry->defer_shift)
);

DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_deferred,

	TP_PROTO(struct zone *zone, int order),

	TP_ARGS(zone, order)
);

DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_compaction,

	TP_PROTO(struct zone *zone, int order),

	TP_ARGS(zone, order)
);

DEFINE_EVENT(mm_compaction_defer_template, mm_compaction_defer_reset,

	TP_PROTO(struct zone *zone, int order),

	TP_ARGS(zone, order)
);
#endif

354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
TRACE_EVENT(mm_compaction_kcompactd_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)
);

DECLARE_EVENT_CLASS(kcompactd_wake_template,

	TP_PROTO(int nid, int order, enum zone_type classzone_idx),

	TP_ARGS(nid, order, classzone_idx),

	TP_STRUCT__entry(
		__field(int, nid)
		__field(int, order)
		__field(enum zone_type, classzone_idx)
	),

	TP_fast_assign(
		__entry->nid = nid;
		__entry->order = order;
		__entry->classzone_idx = classzone_idx;
	),

	TP_printk("nid=%d order=%d classzone_idx=%-8s",
		__entry->nid,
		__entry->order,
		__print_symbolic(__entry->classzone_idx, ZONE_TYPE))
);

DEFINE_EVENT(kcompactd_wake_template, mm_compaction_wakeup_kcompactd,

	TP_PROTO(int nid, int order, enum zone_type classzone_idx),

	TP_ARGS(nid, order, classzone_idx)
);

DEFINE_EVENT(kcompactd_wake_template, mm_compaction_kcompactd_wake,

	TP_PROTO(int nid, int order, enum zone_type classzone_idx),

	TP_ARGS(nid, order, classzone_idx)
);

409 410 411 412
#endif /* _TRACE_COMPACTION_H */

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