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