diff options
author | Kirill Tkhai <ktkhai@virtuozzo.com> | 2019-05-13 20:16:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-14 12:47:45 -0400 |
commit | 886cf1901db962cee5f8b82b9b260079a5e8a4eb (patch) | |
tree | 53edc7213da3403ed7b201d08e448719c352bc19 | |
parent | 63931eb97508cd67515dbcc049defaebd7b1fcd0 (diff) |
mm: move recent_rotated pages calculation to shrink_inactive_list()
Patch series "mm: Generalize putback functions"]
putback_inactive_pages() and move_active_pages_to_lru() are almost
similar, so this patchset merges them ina single function.
This patch (of 4):
The patch moves the calculation from putback_inactive_pages() to
shrink_inactive_list(). This makes putback_inactive_pages() looking more
similar to move_active_pages_to_lru().
To do that, we account activated pages in reclaim_stat::nr_activate.
Since a page may change its LRU type from anon to file cache inside
shrink_page_list() (see ClearPageSwapBacked()), we have to account pages
for the both types. So, nr_activate becomes an array.
Previously we used nr_activate to account PGACTIVATE events, but now we
account them into pgactivate variable (since they are about number of
pages in general, not about sum of hpage_nr_pages).
Link: http://lkml.kernel.org/r/155290127956.31489.3393586616054413298.stgit@localhost.localdomain
Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com>
Cc: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | Documentation/trace/postprocess/trace-vmscan-postprocess.pl | 7 | ||||
-rw-r--r-- | include/linux/vmstat.h | 2 | ||||
-rw-r--r-- | include/trace/events/vmscan.h | 13 | ||||
-rw-r--r-- | mm/vmscan.c | 15 |
4 files changed, 20 insertions, 17 deletions
diff --git a/Documentation/trace/postprocess/trace-vmscan-postprocess.pl b/Documentation/trace/postprocess/trace-vmscan-postprocess.pl index 66bfd8396877..995da15b16ca 100644 --- a/Documentation/trace/postprocess/trace-vmscan-postprocess.pl +++ b/Documentation/trace/postprocess/trace-vmscan-postprocess.pl | |||
@@ -113,7 +113,7 @@ my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)'; | |||
113 | my $regex_kswapd_sleep_default = 'nid=([0-9]*)'; | 113 | my $regex_kswapd_sleep_default = 'nid=([0-9]*)'; |
114 | my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; | 114 | my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; |
115 | my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) classzone_idx=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_skipped=([0-9]*) nr_taken=([0-9]*) lru=([a-z_]*)'; | 115 | my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) classzone_idx=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_skipped=([0-9]*) nr_taken=([0-9]*) lru=([a-z_]*)'; |
116 | my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) nr_dirty=([0-9]*) nr_writeback=([0-9]*) nr_congested=([0-9]*) nr_immediate=([0-9]*) nr_activate=([0-9]*) nr_ref_keep=([0-9]*) nr_unmap_fail=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)'; | 116 | my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) nr_dirty=([0-9]*) nr_writeback=([0-9]*) nr_congested=([0-9]*) nr_immediate=([0-9]*) nr_activate_anon=([0-9]*) nr_activate_file=([0-9]*) nr_ref_keep=([0-9]*) nr_unmap_fail=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)'; |
117 | my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; | 117 | my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; |
118 | my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; | 118 | my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; |
119 | 119 | ||
@@ -212,7 +212,8 @@ $regex_lru_shrink_inactive = generate_traceevent_regex( | |||
212 | "vmscan/mm_vmscan_lru_shrink_inactive", | 212 | "vmscan/mm_vmscan_lru_shrink_inactive", |
213 | $regex_lru_shrink_inactive_default, | 213 | $regex_lru_shrink_inactive_default, |
214 | "nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback", | 214 | "nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback", |
215 | "nr_congested", "nr_immediate", "nr_activate", "nr_ref_keep", | 215 | "nr_congested", "nr_immediate", "nr_activate_anon", |
216 | "nr_activate_file", "nr_ref_keep", | ||
216 | "nr_unmap_fail", "priority", "flags"); | 217 | "nr_unmap_fail", "priority", "flags"); |
217 | $regex_lru_shrink_active = generate_traceevent_regex( | 218 | $regex_lru_shrink_active = generate_traceevent_regex( |
218 | "vmscan/mm_vmscan_lru_shrink_active", | 219 | "vmscan/mm_vmscan_lru_shrink_active", |
@@ -407,7 +408,7 @@ EVENT_PROCESS: | |||
407 | } | 408 | } |
408 | 409 | ||
409 | my $nr_reclaimed = $3; | 410 | my $nr_reclaimed = $3; |
410 | my $flags = $12; | 411 | my $flags = $13; |
411 | my $file = 0; | 412 | my $file = 0; |
412 | if ($flags =~ /RECLAIM_WB_FILE/) { | 413 | if ($flags =~ /RECLAIM_WB_FILE/) { |
413 | $file = 1; | 414 | $file = 1; |
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 2db8d60981fe..bdeda4b079fe 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h | |||
@@ -26,7 +26,7 @@ struct reclaim_stat { | |||
26 | unsigned nr_congested; | 26 | unsigned nr_congested; |
27 | unsigned nr_writeback; | 27 | unsigned nr_writeback; |
28 | unsigned nr_immediate; | 28 | unsigned nr_immediate; |
29 | unsigned nr_activate; | 29 | unsigned nr_activate[2]; |
30 | unsigned nr_ref_keep; | 30 | unsigned nr_ref_keep; |
31 | unsigned nr_unmap_fail; | 31 | unsigned nr_unmap_fail; |
32 | }; | 32 | }; |
diff --git a/include/trace/events/vmscan.h b/include/trace/events/vmscan.h index e8709ab22d68..cb2add69301a 100644 --- a/include/trace/events/vmscan.h +++ b/include/trace/events/vmscan.h | |||
@@ -359,7 +359,8 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, | |||
359 | __field(unsigned long, nr_writeback) | 359 | __field(unsigned long, nr_writeback) |
360 | __field(unsigned long, nr_congested) | 360 | __field(unsigned long, nr_congested) |
361 | __field(unsigned long, nr_immediate) | 361 | __field(unsigned long, nr_immediate) |
362 | __field(unsigned long, nr_activate) | 362 | __field(unsigned int, nr_activate0) |
363 | __field(unsigned int, nr_activate1) | ||
363 | __field(unsigned long, nr_ref_keep) | 364 | __field(unsigned long, nr_ref_keep) |
364 | __field(unsigned long, nr_unmap_fail) | 365 | __field(unsigned long, nr_unmap_fail) |
365 | __field(int, priority) | 366 | __field(int, priority) |
@@ -374,20 +375,22 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, | |||
374 | __entry->nr_writeback = stat->nr_writeback; | 375 | __entry->nr_writeback = stat->nr_writeback; |
375 | __entry->nr_congested = stat->nr_congested; | 376 | __entry->nr_congested = stat->nr_congested; |
376 | __entry->nr_immediate = stat->nr_immediate; | 377 | __entry->nr_immediate = stat->nr_immediate; |
377 | __entry->nr_activate = stat->nr_activate; | 378 | __entry->nr_activate0 = stat->nr_activate[0]; |
379 | __entry->nr_activate1 = stat->nr_activate[1]; | ||
378 | __entry->nr_ref_keep = stat->nr_ref_keep; | 380 | __entry->nr_ref_keep = stat->nr_ref_keep; |
379 | __entry->nr_unmap_fail = stat->nr_unmap_fail; | 381 | __entry->nr_unmap_fail = stat->nr_unmap_fail; |
380 | __entry->priority = priority; | 382 | __entry->priority = priority; |
381 | __entry->reclaim_flags = trace_shrink_flags(file); | 383 | __entry->reclaim_flags = trace_shrink_flags(file); |
382 | ), | 384 | ), |
383 | 385 | ||
384 | 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", | 386 | TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s", |
385 | __entry->nid, | 387 | __entry->nid, |
386 | __entry->nr_scanned, __entry->nr_reclaimed, | 388 | __entry->nr_scanned, __entry->nr_reclaimed, |
387 | __entry->nr_dirty, __entry->nr_writeback, | 389 | __entry->nr_dirty, __entry->nr_writeback, |
388 | __entry->nr_congested, __entry->nr_immediate, | 390 | __entry->nr_congested, __entry->nr_immediate, |
389 | __entry->nr_activate, __entry->nr_ref_keep, | 391 | __entry->nr_activate0, __entry->nr_activate1, |
390 | __entry->nr_unmap_fail, __entry->priority, | 392 | __entry->nr_ref_keep, __entry->nr_unmap_fail, |
393 | __entry->priority, | ||
391 | show_reclaim_flags(__entry->reclaim_flags)) | 394 | show_reclaim_flags(__entry->reclaim_flags)) |
392 | ); | 395 | ); |
393 | 396 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index fd9de504e516..e6913e68db2e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1107,6 +1107,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
1107 | LIST_HEAD(ret_pages); | 1107 | LIST_HEAD(ret_pages); |
1108 | LIST_HEAD(free_pages); | 1108 | LIST_HEAD(free_pages); |
1109 | unsigned nr_reclaimed = 0; | 1109 | unsigned nr_reclaimed = 0; |
1110 | unsigned pgactivate = 0; | ||
1110 | 1111 | ||
1111 | memset(stat, 0, sizeof(*stat)); | 1112 | memset(stat, 0, sizeof(*stat)); |
1112 | cond_resched(); | 1113 | cond_resched(); |
@@ -1466,8 +1467,10 @@ activate_locked: | |||
1466 | try_to_free_swap(page); | 1467 | try_to_free_swap(page); |
1467 | VM_BUG_ON_PAGE(PageActive(page), page); | 1468 | VM_BUG_ON_PAGE(PageActive(page), page); |
1468 | if (!PageMlocked(page)) { | 1469 | if (!PageMlocked(page)) { |
1470 | int type = page_is_file_cache(page); | ||
1469 | SetPageActive(page); | 1471 | SetPageActive(page); |
1470 | stat->nr_activate++; | 1472 | pgactivate++; |
1473 | stat->nr_activate[type] += hpage_nr_pages(page); | ||
1471 | count_memcg_page_event(page, PGACTIVATE); | 1474 | count_memcg_page_event(page, PGACTIVATE); |
1472 | } | 1475 | } |
1473 | keep_locked: | 1476 | keep_locked: |
@@ -1482,7 +1485,7 @@ keep: | |||
1482 | free_unref_page_list(&free_pages); | 1485 | free_unref_page_list(&free_pages); |
1483 | 1486 | ||
1484 | list_splice(&ret_pages, page_list); | 1487 | list_splice(&ret_pages, page_list); |
1485 | count_vm_events(PGACTIVATE, stat->nr_activate); | 1488 | count_vm_events(PGACTIVATE, pgactivate); |
1486 | 1489 | ||
1487 | return nr_reclaimed; | 1490 | return nr_reclaimed; |
1488 | } | 1491 | } |
@@ -1807,7 +1810,6 @@ static int too_many_isolated(struct pglist_data *pgdat, int file, | |||
1807 | static noinline_for_stack void | 1810 | static noinline_for_stack void |
1808 | putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) | 1811 | putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) |
1809 | { | 1812 | { |
1810 | struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; | ||
1811 | struct pglist_data *pgdat = lruvec_pgdat(lruvec); | 1813 | struct pglist_data *pgdat = lruvec_pgdat(lruvec); |
1812 | LIST_HEAD(pages_to_free); | 1814 | LIST_HEAD(pages_to_free); |
1813 | 1815 | ||
@@ -1833,11 +1835,6 @@ putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) | |||
1833 | lru = page_lru(page); | 1835 | lru = page_lru(page); |
1834 | add_page_to_lru_list(page, lruvec, lru); | 1836 | add_page_to_lru_list(page, lruvec, lru); |
1835 | 1837 | ||
1836 | if (is_active_lru(lru)) { | ||
1837 | int file = is_file_lru(lru); | ||
1838 | int numpages = hpage_nr_pages(page); | ||
1839 | reclaim_stat->recent_rotated[file] += numpages; | ||
1840 | } | ||
1841 | if (put_page_testzero(page)) { | 1838 | if (put_page_testzero(page)) { |
1842 | __ClearPageLRU(page); | 1839 | __ClearPageLRU(page); |
1843 | __ClearPageActive(page); | 1840 | __ClearPageActive(page); |
@@ -1945,6 +1942,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, | |||
1945 | count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT, | 1942 | count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT, |
1946 | nr_reclaimed); | 1943 | nr_reclaimed); |
1947 | } | 1944 | } |
1945 | reclaim_stat->recent_rotated[0] = stat.nr_activate[0]; | ||
1946 | reclaim_stat->recent_rotated[1] = stat.nr_activate[1]; | ||
1948 | 1947 | ||
1949 | putback_inactive_pages(lruvec, &page_list); | 1948 | putback_inactive_pages(lruvec, &page_list); |
1950 | 1949 | ||