Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm, vmscan: add classzone information to tracepoints

This is convenient when tracking down why the skip count is high because
it'll show what classzone kswapd woke up at and what zones are being
isolated.

Link: http://lkml.kernel.org/r/1467970510-21195-29-git-send-email-mgorman@techsingularity.net
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rik van Riel <riel@surriel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Mel Gorman and committed by
Linus Torvalds
e5146b12 84c7a777

+40 -25
+31 -20
include/trace/events/vmscan.h
··· 55 55 56 56 TRACE_EVENT(mm_vmscan_kswapd_wake, 57 57 58 - TP_PROTO(int nid, int order), 58 + TP_PROTO(int nid, int zid, int order), 59 59 60 - TP_ARGS(nid, order), 60 + TP_ARGS(nid, zid, order), 61 61 62 62 TP_STRUCT__entry( 63 63 __field( int, nid ) 64 + __field( int, zid ) 64 65 __field( int, order ) 65 66 ), 66 67 67 68 TP_fast_assign( 68 69 __entry->nid = nid; 70 + __entry->zid = zid; 69 71 __entry->order = order; 70 72 ), 71 73 72 - TP_printk("nid=%d order=%d", __entry->nid, __entry->order) 74 + TP_printk("nid=%d zid=%d order=%d", __entry->nid, __entry->zid, __entry->order) 73 75 ); 74 76 75 77 TRACE_EVENT(mm_vmscan_wakeup_kswapd, ··· 100 98 101 99 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_begin_template, 102 100 103 - TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), 101 + TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx), 104 102 105 - TP_ARGS(order, may_writepage, gfp_flags), 103 + TP_ARGS(order, may_writepage, gfp_flags, classzone_idx), 106 104 107 105 TP_STRUCT__entry( 108 106 __field( int, order ) 109 107 __field( int, may_writepage ) 110 108 __field( gfp_t, gfp_flags ) 109 + __field( int, classzone_idx ) 111 110 ), 112 111 113 112 TP_fast_assign( 114 113 __entry->order = order; 115 114 __entry->may_writepage = may_writepage; 116 115 __entry->gfp_flags = gfp_flags; 116 + __entry->classzone_idx = classzone_idx; 117 117 ), 118 118 119 - TP_printk("order=%d may_writepage=%d gfp_flags=%s", 119 + TP_printk("order=%d may_writepage=%d gfp_flags=%s classzone_idx=%d", 120 120 __entry->order, 121 121 __entry->may_writepage, 122 - show_gfp_flags(__entry->gfp_flags)) 122 + show_gfp_flags(__entry->gfp_flags), 123 + __entry->classzone_idx) 123 124 ); 124 125 125 126 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_direct_reclaim_begin, 126 127 127 - TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), 128 + TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx), 128 129 129 - TP_ARGS(order, may_writepage, gfp_flags) 130 + TP_ARGS(order, may_writepage, gfp_flags, classzone_idx) 130 131 ); 131 132 132 133 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_reclaim_begin, 133 134 134 - TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), 135 + TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx), 135 136 136 - TP_ARGS(order, may_writepage, gfp_flags) 137 + TP_ARGS(order, may_writepage, gfp_flags, classzone_idx) 137 138 ); 138 139 139 140 DEFINE_EVENT(mm_vmscan_direct_reclaim_begin_template, mm_vmscan_memcg_softlimit_reclaim_begin, 140 141 141 - TP_PROTO(int order, int may_writepage, gfp_t gfp_flags), 142 + TP_PROTO(int order, int may_writepage, gfp_t gfp_flags, int classzone_idx), 142 143 143 - TP_ARGS(order, may_writepage, gfp_flags) 144 + TP_ARGS(order, may_writepage, gfp_flags, classzone_idx) 144 145 ); 145 146 146 147 DECLARE_EVENT_CLASS(mm_vmscan_direct_reclaim_end_template, ··· 271 266 272 267 DECLARE_EVENT_CLASS(mm_vmscan_lru_isolate_template, 273 268 274 - TP_PROTO(int order, 269 + TP_PROTO(int classzone_idx, 270 + int order, 275 271 unsigned long nr_requested, 276 272 unsigned long nr_scanned, 277 273 unsigned long nr_taken, 278 274 isolate_mode_t isolate_mode, 279 275 int file), 280 276 281 - TP_ARGS(order, nr_requested, nr_scanned, nr_taken, isolate_mode, file), 277 + TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_taken, isolate_mode, file), 282 278 283 279 TP_STRUCT__entry( 280 + __field(int, classzone_idx) 284 281 __field(int, order) 285 282 __field(unsigned long, nr_requested) 286 283 __field(unsigned long, nr_scanned) ··· 292 285 ), 293 286 294 287 TP_fast_assign( 288 + __entry->classzone_idx = classzone_idx; 295 289 __entry->order = order; 296 290 __entry->nr_requested = nr_requested; 297 291 __entry->nr_scanned = nr_scanned; ··· 301 293 __entry->file = file; 302 294 ), 303 295 304 - TP_printk("isolate_mode=%d order=%d nr_requested=%lu nr_scanned=%lu nr_taken=%lu file=%d", 296 + TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_taken=%lu file=%d", 305 297 __entry->isolate_mode, 298 + __entry->classzone_idx, 306 299 __entry->order, 307 300 __entry->nr_requested, 308 301 __entry->nr_scanned, ··· 313 304 314 305 DEFINE_EVENT(mm_vmscan_lru_isolate_template, mm_vmscan_lru_isolate, 315 306 316 - TP_PROTO(int order, 307 + TP_PROTO(int classzone_idx, 308 + int order, 317 309 unsigned long nr_requested, 318 310 unsigned long nr_scanned, 319 311 unsigned long nr_taken, 320 312 isolate_mode_t isolate_mode, 321 313 int file), 322 314 323 - TP_ARGS(order, nr_requested, nr_scanned, nr_taken, isolate_mode, file) 315 + TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_taken, isolate_mode, file) 324 316 325 317 ); 326 318 327 319 DEFINE_EVENT(mm_vmscan_lru_isolate_template, mm_vmscan_memcg_isolate, 328 320 329 - TP_PROTO(int order, 321 + TP_PROTO(int classzone_idx, 322 + int order, 330 323 unsigned long nr_requested, 331 324 unsigned long nr_scanned, 332 325 unsigned long nr_taken, 333 326 isolate_mode_t isolate_mode, 334 327 int file), 335 328 336 - TP_ARGS(order, nr_requested, nr_scanned, nr_taken, isolate_mode, file) 329 + TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_taken, isolate_mode, file) 337 330 338 331 ); 339 332
+9 -5
mm/vmscan.c
··· 1439 1439 if (!list_empty(&pages_skipped)) 1440 1440 list_splice(&pages_skipped, src); 1441 1441 *nr_scanned = scan; 1442 - trace_mm_vmscan_lru_isolate(sc->order, nr_to_scan, scan, 1442 + trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan, 1443 1443 nr_taken, mode, is_file_lru(lru)); 1444 1444 for (scan = 0; scan < MAX_NR_ZONES; scan++) { 1445 1445 nr_pages = nr_zone_taken[scan]; ··· 2889 2889 2890 2890 trace_mm_vmscan_direct_reclaim_begin(order, 2891 2891 sc.may_writepage, 2892 - gfp_mask); 2892 + gfp_mask, 2893 + sc.reclaim_idx); 2893 2894 2894 2895 nr_reclaimed = do_try_to_free_pages(zonelist, &sc); 2895 2896 ··· 2921 2920 2922 2921 trace_mm_vmscan_memcg_softlimit_reclaim_begin(sc.order, 2923 2922 sc.may_writepage, 2924 - sc.gfp_mask); 2923 + sc.gfp_mask, 2924 + sc.reclaim_idx); 2925 2925 2926 2926 /* 2927 2927 * NOTE: Although we can get the priority field, using it ··· 2970 2968 2971 2969 trace_mm_vmscan_memcg_reclaim_begin(0, 2972 2970 sc.may_writepage, 2973 - sc.gfp_mask); 2971 + sc.gfp_mask, 2972 + sc.reclaim_idx); 2974 2973 2975 2974 nr_reclaimed = do_try_to_free_pages(zonelist, &sc); 2976 2975 ··· 3389 3386 * but kcompactd is woken to compact for the original 3390 3387 * request (alloc_order). 3391 3388 */ 3392 - trace_mm_vmscan_kswapd_wake(pgdat->node_id, alloc_order); 3389 + trace_mm_vmscan_kswapd_wake(pgdat->node_id, classzone_idx, 3390 + alloc_order); 3393 3391 reclaim_order = balance_pgdat(pgdat, alloc_order, classzone_idx); 3394 3392 if (reclaim_order < alloc_order) 3395 3393 goto kswapd_try_sleep;