summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Tkhai <ktkhai@virtuozzo.com>2019-05-13 20:16:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-05-14 12:47:45 -0400
commit886cf1901db962cee5f8b82b9b260079a5e8a4eb (patch)
tree53edc7213da3403ed7b201d08e448719c352bc19
parent63931eb97508cd67515dbcc049defaebd7b1fcd0 (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.pl7
-rw-r--r--include/linux/vmstat.h2
-rw-r--r--include/trace/events/vmscan.h13
-rw-r--r--mm/vmscan.c15
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]*)';
113my $regex_kswapd_sleep_default = 'nid=([0-9]*)'; 113my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
114my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; 114my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)';
115my $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_]*)'; 115my $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_]*)';
116my $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_|]*)'; 116my $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_|]*)';
117my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; 117my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
118my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; 118my $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 }
1473keep_locked: 1476keep_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,
1807static noinline_for_stack void 1810static noinline_for_stack void
1808putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) 1811putback_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