Commit 1265e3a6 authored by Michal Hocko's avatar Michal Hocko Committed by Linus Torvalds

mm, vmscan: show the number of skipped pages in mm_vmscan_lru_isolate

mm_vmscan_lru_isolate shows the number of requested, scanned and taken
pages.  This is mostly OK but on 32b systems the number of scanned pages
is quite misleading because it includes both the scanned and skipped
pages.  Moreover the skipped part is scaled based on the number of taken
pages.  Let's report the exact numbers without any additional logic and
add the number of skipped pages.

This should make the reported data much more easier to interpret.

Link: http://lkml.kernel.org/r/20170104101942.4860-4-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
Acked-by: default avatarMinchan Kim <minchan@kernel.org>
Acked-by: default avatarMel Gorman <mgorman@suse.de>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9d998b4f
...@@ -274,17 +274,19 @@ TRACE_EVENT(mm_vmscan_lru_isolate, ...@@ -274,17 +274,19 @@ TRACE_EVENT(mm_vmscan_lru_isolate,
int order, int order,
unsigned long nr_requested, unsigned long nr_requested,
unsigned long nr_scanned, unsigned long nr_scanned,
unsigned long nr_skipped,
unsigned long nr_taken, unsigned long nr_taken,
isolate_mode_t isolate_mode, isolate_mode_t isolate_mode,
int file), int file),
TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_taken, isolate_mode, file), TP_ARGS(classzone_idx, order, nr_requested, nr_scanned, nr_skipped, nr_taken, isolate_mode, file),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(int, classzone_idx) __field(int, classzone_idx)
__field(int, order) __field(int, order)
__field(unsigned long, nr_requested) __field(unsigned long, nr_requested)
__field(unsigned long, nr_scanned) __field(unsigned long, nr_scanned)
__field(unsigned long, nr_skipped)
__field(unsigned long, nr_taken) __field(unsigned long, nr_taken)
__field(isolate_mode_t, isolate_mode) __field(isolate_mode_t, isolate_mode)
__field(int, file) __field(int, file)
...@@ -295,17 +297,19 @@ TRACE_EVENT(mm_vmscan_lru_isolate, ...@@ -295,17 +297,19 @@ TRACE_EVENT(mm_vmscan_lru_isolate,
__entry->order = order; __entry->order = order;
__entry->nr_requested = nr_requested; __entry->nr_requested = nr_requested;
__entry->nr_scanned = nr_scanned; __entry->nr_scanned = nr_scanned;
__entry->nr_skipped = nr_skipped;
__entry->nr_taken = nr_taken; __entry->nr_taken = nr_taken;
__entry->isolate_mode = isolate_mode; __entry->isolate_mode = isolate_mode;
__entry->file = file; __entry->file = file;
), ),
TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_taken=%lu file=%d", TP_printk("isolate_mode=%d classzone=%d order=%d nr_requested=%lu nr_scanned=%lu nr_skipped=%lu nr_taken=%lu file=%d",
__entry->isolate_mode, __entry->isolate_mode,
__entry->classzone_idx, __entry->classzone_idx,
__entry->order, __entry->order,
__entry->nr_requested, __entry->nr_requested,
__entry->nr_scanned, __entry->nr_scanned,
__entry->nr_skipped,
__entry->nr_taken, __entry->nr_taken,
__entry->file) __entry->file)
); );
......
...@@ -1437,6 +1437,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, ...@@ -1437,6 +1437,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
unsigned long nr_taken = 0; unsigned long nr_taken = 0;
unsigned long nr_zone_taken[MAX_NR_ZONES] = { 0 }; unsigned long nr_zone_taken[MAX_NR_ZONES] = { 0 };
unsigned long nr_skipped[MAX_NR_ZONES] = { 0, }; unsigned long nr_skipped[MAX_NR_ZONES] = { 0, };
unsigned long skipped = 0, total_skipped = 0;
unsigned long scan, nr_pages; unsigned long scan, nr_pages;
LIST_HEAD(pages_skipped); LIST_HEAD(pages_skipped);
...@@ -1488,14 +1489,13 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, ...@@ -1488,14 +1489,13 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
*/ */
if (!list_empty(&pages_skipped)) { if (!list_empty(&pages_skipped)) {
int zid; int zid;
unsigned long total_skipped = 0;
for (zid = 0; zid < MAX_NR_ZONES; zid++) { for (zid = 0; zid < MAX_NR_ZONES; zid++) {
if (!nr_skipped[zid]) if (!nr_skipped[zid])
continue; continue;
__count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]); __count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]);
total_skipped += nr_skipped[zid]; skipped += nr_skipped[zid];
} }
/* /*
...@@ -1503,13 +1503,14 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, ...@@ -1503,13 +1503,14 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
* close to unreclaimable. If the LRU list is empty, account * close to unreclaimable. If the LRU list is empty, account
* skipped pages as a full scan. * skipped pages as a full scan.
*/ */
scan += list_empty(src) ? total_skipped : total_skipped >> 2; total_skipped = list_empty(src) ? skipped : skipped >> 2;
list_splice(&pages_skipped, src); list_splice(&pages_skipped, src);
} }
*nr_scanned = scan; *nr_scanned = scan + total_skipped;
trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan, trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan,
nr_taken, mode, is_file_lru(lru)); scan, skipped, nr_taken, mode,
is_file_lru(lru));
update_lru_sizes(lruvec, lru, nr_zone_taken); update_lru_sizes(lruvec, lru, nr_zone_taken);
return nr_taken; return nr_taken;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment