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

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>

authored by

Kirill Tkhai and committed by
Linus Torvalds
886cf190 63931eb9

+20 -17
+4 -3
Documentation/trace/postprocess/trace-vmscan-postprocess.pl
··· 113 113 my $regex_kswapd_sleep_default = 'nid=([0-9]*)'; 114 114 my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; 115 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 117 my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; 118 118 my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; 119 119 ··· 212 212 "vmscan/mm_vmscan_lru_shrink_inactive", 213 213 $regex_lru_shrink_inactive_default, 214 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 217 "nr_unmap_fail", "priority", "flags"); 217 218 $regex_lru_shrink_active = generate_traceevent_regex( 218 219 "vmscan/mm_vmscan_lru_shrink_active", ··· 408 407 } 409 408 410 409 my $nr_reclaimed = $3; 411 - my $flags = $12; 410 + my $flags = $13; 412 411 my $file = 0; 413 412 if ($flags =~ /RECLAIM_WB_FILE/) { 414 413 $file = 1;
+1 -1
include/linux/vmstat.h
··· 26 26 unsigned nr_congested; 27 27 unsigned nr_writeback; 28 28 unsigned nr_immediate; 29 - unsigned nr_activate; 29 + unsigned nr_activate[2]; 30 30 unsigned nr_ref_keep; 31 31 unsigned nr_unmap_fail; 32 32 };
+8 -5
include/trace/events/vmscan.h
··· 359 359 __field(unsigned long, nr_writeback) 360 360 __field(unsigned long, nr_congested) 361 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 364 __field(unsigned long, nr_ref_keep) 364 365 __field(unsigned long, nr_unmap_fail) 365 366 __field(int, priority) ··· 375 374 __entry->nr_writeback = stat->nr_writeback; 376 375 __entry->nr_congested = stat->nr_congested; 377 376 __entry->nr_immediate = stat->nr_immediate; 378 - __entry->nr_activate = stat->nr_activate; 377 + __entry->nr_activate0 = stat->nr_activate[0]; 378 + __entry->nr_activate1 = stat->nr_activate[1]; 379 379 __entry->nr_ref_keep = stat->nr_ref_keep; 380 380 __entry->nr_unmap_fail = stat->nr_unmap_fail; 381 381 __entry->priority = priority; 382 382 __entry->reclaim_flags = trace_shrink_flags(file); 383 383 ), 384 384 385 - 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", 385 + 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", 386 386 __entry->nid, 387 387 __entry->nr_scanned, __entry->nr_reclaimed, 388 388 __entry->nr_dirty, __entry->nr_writeback, 389 389 __entry->nr_congested, __entry->nr_immediate, 390 - __entry->nr_activate, __entry->nr_ref_keep, 391 - __entry->nr_unmap_fail, __entry->priority, 390 + __entry->nr_activate0, __entry->nr_activate1, 391 + __entry->nr_ref_keep, __entry->nr_unmap_fail, 392 + __entry->priority, 392 393 show_reclaim_flags(__entry->reclaim_flags)) 393 394 ); 394 395
+7 -8
mm/vmscan.c
··· 1107 1107 LIST_HEAD(ret_pages); 1108 1108 LIST_HEAD(free_pages); 1109 1109 unsigned nr_reclaimed = 0; 1110 + unsigned pgactivate = 0; 1110 1111 1111 1112 memset(stat, 0, sizeof(*stat)); 1112 1113 cond_resched(); ··· 1467 1466 try_to_free_swap(page); 1468 1467 VM_BUG_ON_PAGE(PageActive(page), page); 1469 1468 if (!PageMlocked(page)) { 1469 + int type = page_is_file_cache(page); 1470 1470 SetPageActive(page); 1471 - stat->nr_activate++; 1471 + pgactivate++; 1472 + stat->nr_activate[type] += hpage_nr_pages(page); 1472 1473 count_memcg_page_event(page, PGACTIVATE); 1473 1474 } 1474 1475 keep_locked: ··· 1485 1482 free_unref_page_list(&free_pages); 1486 1483 1487 1484 list_splice(&ret_pages, page_list); 1488 - count_vm_events(PGACTIVATE, stat->nr_activate); 1485 + count_vm_events(PGACTIVATE, pgactivate); 1489 1486 1490 1487 return nr_reclaimed; 1491 1488 } ··· 1810 1807 static noinline_for_stack void 1811 1808 putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) 1812 1809 { 1813 - struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat; 1814 1810 struct pglist_data *pgdat = lruvec_pgdat(lruvec); 1815 1811 LIST_HEAD(pages_to_free); 1816 1812 ··· 1835 1833 lru = page_lru(page); 1836 1834 add_page_to_lru_list(page, lruvec, lru); 1837 1835 1838 - if (is_active_lru(lru)) { 1839 - int file = is_file_lru(lru); 1840 - int numpages = hpage_nr_pages(page); 1841 - reclaim_stat->recent_rotated[file] += numpages; 1842 - } 1843 1836 if (put_page_testzero(page)) { 1844 1837 __ClearPageLRU(page); 1845 1838 __ClearPageActive(page); ··· 1942 1945 count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT, 1943 1946 nr_reclaimed); 1944 1947 } 1948 + reclaim_stat->recent_rotated[0] = stat.nr_activate[0]; 1949 + reclaim_stat->recent_rotated[1] = stat.nr_activate[1]; 1945 1950 1946 1951 putback_inactive_pages(lruvec, &page_list); 1947 1952