Skip to content

Commit 5bccd16

Browse files
Michal Hockotorvalds
authored andcommitted
mm, vmscan: enhance mm_vmscan_lru_shrink_inactive tracepoint
mm_vmscan_lru_shrink_inactive will currently report the number of scanned and reclaimed pages. This doesn't give us an idea how the reclaim went except for the overall effectiveness though. Export and show other counters which will tell us why we couldn't reclaim some pages. - nr_dirty, nr_writeback, nr_congested and nr_immediate tells us how many pages are blocked due to IO - nr_activate tells us how many pages were moved to the active list - nr_ref_keep reports how many pages are kept on the LRU due to references (mostly for the file pages which are about to go for another round through the inactive list) - nr_unmap_fail - how many pages failed to unmap All these are rather low level so they might change in future but the tracepoint is already implementation specific so no tools should be depending on its stability. Link: http://lkml.kernel.org/r/20170104101942.4860-7-mhocko@kernel.org Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com> Acked-by: Mel Gorman <mgorman@suse.de> Acked-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 3c710c1 commit 5bccd16

2 files changed

Lines changed: 40 additions & 3 deletions

File tree

include/trace/events/vmscan.h

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,14 +340,27 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
340340

341341
TP_PROTO(int nid,
342342
unsigned long nr_scanned, unsigned long nr_reclaimed,
343+
unsigned long nr_dirty, unsigned long nr_writeback,
344+
unsigned long nr_congested, unsigned long nr_immediate,
345+
unsigned long nr_activate, unsigned long nr_ref_keep,
346+
unsigned long nr_unmap_fail,
343347
int priority, int file),
344348

345-
TP_ARGS(nid, nr_scanned, nr_reclaimed, priority, file),
349+
TP_ARGS(nid, nr_scanned, nr_reclaimed, nr_dirty, nr_writeback,
350+
nr_congested, nr_immediate, nr_activate, nr_ref_keep,
351+
nr_unmap_fail, priority, file),
346352

347353
TP_STRUCT__entry(
348354
__field(int, nid)
349355
__field(unsigned long, nr_scanned)
350356
__field(unsigned long, nr_reclaimed)
357+
__field(unsigned long, nr_dirty)
358+
__field(unsigned long, nr_writeback)
359+
__field(unsigned long, nr_congested)
360+
__field(unsigned long, nr_immediate)
361+
__field(unsigned long, nr_activate)
362+
__field(unsigned long, nr_ref_keep)
363+
__field(unsigned long, nr_unmap_fail)
351364
__field(int, priority)
352365
__field(int, reclaim_flags)
353366
),
@@ -356,14 +369,24 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
356369
__entry->nid = nid;
357370
__entry->nr_scanned = nr_scanned;
358371
__entry->nr_reclaimed = nr_reclaimed;
372+
__entry->nr_dirty = nr_dirty;
373+
__entry->nr_writeback = nr_writeback;
374+
__entry->nr_congested = nr_congested;
375+
__entry->nr_immediate = nr_immediate;
376+
__entry->nr_activate = nr_activate;
377+
__entry->nr_ref_keep = nr_ref_keep;
378+
__entry->nr_unmap_fail = nr_unmap_fail;
359379
__entry->priority = priority;
360380
__entry->reclaim_flags = trace_shrink_flags(file);
361381
),
362382

363-
TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld priority=%d flags=%s",
383+
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",
364384
__entry->nid,
365385
__entry->nr_scanned, __entry->nr_reclaimed,
366-
__entry->priority,
386+
__entry->nr_dirty, __entry->nr_writeback,
387+
__entry->nr_congested, __entry->nr_immediate,
388+
__entry->nr_activate, __entry->nr_ref_keep,
389+
__entry->nr_unmap_fail, __entry->priority,
367390
show_reclaim_flags(__entry->reclaim_flags))
368391
);
369392

mm/vmscan.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,9 @@ struct reclaim_stat {
918918
unsigned nr_congested;
919919
unsigned nr_writeback;
920920
unsigned nr_immediate;
921+
unsigned nr_activate;
922+
unsigned nr_ref_keep;
923+
unsigned nr_unmap_fail;
921924
};
922925

923926
/*
@@ -939,6 +942,8 @@ static unsigned long shrink_page_list(struct list_head *page_list,
939942
unsigned nr_reclaimed = 0;
940943
unsigned nr_writeback = 0;
941944
unsigned nr_immediate = 0;
945+
unsigned nr_ref_keep = 0;
946+
unsigned nr_unmap_fail = 0;
942947

943948
cond_resched();
944949

@@ -1077,6 +1082,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
10771082
case PAGEREF_ACTIVATE:
10781083
goto activate_locked;
10791084
case PAGEREF_KEEP:
1085+
nr_ref_keep++;
10801086
goto keep_locked;
10811087
case PAGEREF_RECLAIM:
10821088
case PAGEREF_RECLAIM_CLEAN:
@@ -1114,6 +1120,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
11141120
(ttu_flags | TTU_BATCH_FLUSH | TTU_LZFREE) :
11151121
(ttu_flags | TTU_BATCH_FLUSH))) {
11161122
case SWAP_FAIL:
1123+
nr_unmap_fail++;
11171124
goto activate_locked;
11181125
case SWAP_AGAIN:
11191126
goto keep_locked;
@@ -1286,6 +1293,9 @@ static unsigned long shrink_page_list(struct list_head *page_list,
12861293
stat->nr_unqueued_dirty = nr_unqueued_dirty;
12871294
stat->nr_writeback = nr_writeback;
12881295
stat->nr_immediate = nr_immediate;
1296+
stat->nr_activate = pgactivate;
1297+
stat->nr_ref_keep = nr_ref_keep;
1298+
stat->nr_unmap_fail = nr_unmap_fail;
12891299
}
12901300
return nr_reclaimed;
12911301
}
@@ -1834,6 +1844,10 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
18341844

18351845
trace_mm_vmscan_lru_shrink_inactive(pgdat->node_id,
18361846
nr_scanned, nr_reclaimed,
1847+
stat.nr_dirty, stat.nr_writeback,
1848+
stat.nr_congested, stat.nr_immediate,
1849+
stat.nr_activate, stat.nr_ref_keep,
1850+
stat.nr_unmap_fail,
18371851
sc->priority, file);
18381852
return nr_reclaimed;
18391853
}

0 commit comments

Comments
 (0)