Commit 886cf190 authored by Kirill Tkhai's avatar Kirill Tkhai Committed by Linus Torvalds

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.localdomainSigned-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
Reviewed-by: default avatarDaniel Jordan <daniel.m.jordan@oracle.com>
Cc: Michal Hocko <mhocko@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 63931eb9
...@@ -113,7 +113,7 @@ my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)'; ...@@ -113,7 +113,7 @@ my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)';
my $regex_kswapd_sleep_default = 'nid=([0-9]*)'; my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)'; my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)';
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_]*)'; 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_]*)';
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_|]*)'; 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_|]*)';
my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)'; my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)'; my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
...@@ -212,7 +212,8 @@ $regex_lru_shrink_inactive = generate_traceevent_regex( ...@@ -212,7 +212,8 @@ $regex_lru_shrink_inactive = generate_traceevent_regex(
"vmscan/mm_vmscan_lru_shrink_inactive", "vmscan/mm_vmscan_lru_shrink_inactive",
$regex_lru_shrink_inactive_default, $regex_lru_shrink_inactive_default,
"nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback", "nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback",
"nr_congested", "nr_immediate", "nr_activate", "nr_ref_keep", "nr_congested", "nr_immediate", "nr_activate_anon",
"nr_activate_file", "nr_ref_keep",
"nr_unmap_fail", "priority", "flags"); "nr_unmap_fail", "priority", "flags");
$regex_lru_shrink_active = generate_traceevent_regex( $regex_lru_shrink_active = generate_traceevent_regex(
"vmscan/mm_vmscan_lru_shrink_active", "vmscan/mm_vmscan_lru_shrink_active",
...@@ -407,7 +408,7 @@ EVENT_PROCESS: ...@@ -407,7 +408,7 @@ EVENT_PROCESS:
} }
my $nr_reclaimed = $3; my $nr_reclaimed = $3;
my $flags = $12; my $flags = $13;
my $file = 0; my $file = 0;
if ($flags =~ /RECLAIM_WB_FILE/) { if ($flags =~ /RECLAIM_WB_FILE/) {
$file = 1; $file = 1;
......
...@@ -26,7 +26,7 @@ struct reclaim_stat { ...@@ -26,7 +26,7 @@ struct reclaim_stat {
unsigned nr_congested; unsigned nr_congested;
unsigned nr_writeback; unsigned nr_writeback;
unsigned nr_immediate; unsigned nr_immediate;
unsigned nr_activate; unsigned nr_activate[2];
unsigned nr_ref_keep; unsigned nr_ref_keep;
unsigned nr_unmap_fail; unsigned nr_unmap_fail;
}; };
......
...@@ -359,7 +359,8 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, ...@@ -359,7 +359,8 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
__field(unsigned long, nr_writeback) __field(unsigned long, nr_writeback)
__field(unsigned long, nr_congested) __field(unsigned long, nr_congested)
__field(unsigned long, nr_immediate) __field(unsigned long, nr_immediate)
__field(unsigned long, nr_activate) __field(unsigned int, nr_activate0)
__field(unsigned int, nr_activate1)
__field(unsigned long, nr_ref_keep) __field(unsigned long, nr_ref_keep)
__field(unsigned long, nr_unmap_fail) __field(unsigned long, nr_unmap_fail)
__field(int, priority) __field(int, priority)
...@@ -374,20 +375,22 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive, ...@@ -374,20 +375,22 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
__entry->nr_writeback = stat->nr_writeback; __entry->nr_writeback = stat->nr_writeback;
__entry->nr_congested = stat->nr_congested; __entry->nr_congested = stat->nr_congested;
__entry->nr_immediate = stat->nr_immediate; __entry->nr_immediate = stat->nr_immediate;
__entry->nr_activate = stat->nr_activate; __entry->nr_activate0 = stat->nr_activate[0];
__entry->nr_activate1 = stat->nr_activate[1];
__entry->nr_ref_keep = stat->nr_ref_keep; __entry->nr_ref_keep = stat->nr_ref_keep;
__entry->nr_unmap_fail = stat->nr_unmap_fail; __entry->nr_unmap_fail = stat->nr_unmap_fail;
__entry->priority = priority; __entry->priority = priority;
__entry->reclaim_flags = trace_shrink_flags(file); __entry->reclaim_flags = trace_shrink_flags(file);
), ),
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", 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",
__entry->nid, __entry->nid,
__entry->nr_scanned, __entry->nr_reclaimed, __entry->nr_scanned, __entry->nr_reclaimed,
__entry->nr_dirty, __entry->nr_writeback, __entry->nr_dirty, __entry->nr_writeback,
__entry->nr_congested, __entry->nr_immediate, __entry->nr_congested, __entry->nr_immediate,
__entry->nr_activate, __entry->nr_ref_keep, __entry->nr_activate0, __entry->nr_activate1,
__entry->nr_unmap_fail, __entry->priority, __entry->nr_ref_keep, __entry->nr_unmap_fail,
__entry->priority,
show_reclaim_flags(__entry->reclaim_flags)) show_reclaim_flags(__entry->reclaim_flags))
); );
......
...@@ -1107,6 +1107,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, ...@@ -1107,6 +1107,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
LIST_HEAD(ret_pages); LIST_HEAD(ret_pages);
LIST_HEAD(free_pages); LIST_HEAD(free_pages);
unsigned nr_reclaimed = 0; unsigned nr_reclaimed = 0;
unsigned pgactivate = 0;
memset(stat, 0, sizeof(*stat)); memset(stat, 0, sizeof(*stat));
cond_resched(); cond_resched();
...@@ -1466,8 +1467,10 @@ static unsigned long shrink_page_list(struct list_head *page_list, ...@@ -1466,8 +1467,10 @@ static unsigned long shrink_page_list(struct list_head *page_list,
try_to_free_swap(page); try_to_free_swap(page);
VM_BUG_ON_PAGE(PageActive(page), page); VM_BUG_ON_PAGE(PageActive(page), page);
if (!PageMlocked(page)) { if (!PageMlocked(page)) {
int type = page_is_file_cache(page);
SetPageActive(page); SetPageActive(page);
stat->nr_activate++; pgactivate++;
stat->nr_activate[type] += hpage_nr_pages(page);
count_memcg_page_event(page, PGACTIVATE); count_memcg_page_event(page, PGACTIVATE);
} }
keep_locked: keep_locked:
...@@ -1482,7 +1485,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, ...@@ -1482,7 +1485,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
free_unref_page_list(&free_pages); free_unref_page_list(&free_pages);
list_splice(&ret_pages, page_list); list_splice(&ret_pages, page_list);
count_vm_events(PGACTIVATE, stat->nr_activate); count_vm_events(PGACTIVATE, pgactivate);
return nr_reclaimed; return nr_reclaimed;
} }
...@@ -1807,7 +1810,6 @@ static int too_many_isolated(struct pglist_data *pgdat, int file, ...@@ -1807,7 +1810,6 @@ static int too_many_isolated(struct pglist_data *pgdat, int file,
static noinline_for_stack void static noinline_for_stack void
putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list)
{ {
struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat;
struct pglist_data *pgdat = lruvec_pgdat(lruvec); struct pglist_data *pgdat = lruvec_pgdat(lruvec);
LIST_HEAD(pages_to_free); LIST_HEAD(pages_to_free);
...@@ -1833,11 +1835,6 @@ putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list) ...@@ -1833,11 +1835,6 @@ putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list)
lru = page_lru(page); lru = page_lru(page);
add_page_to_lru_list(page, lruvec, lru); add_page_to_lru_list(page, lruvec, lru);
if (is_active_lru(lru)) {
int file = is_file_lru(lru);
int numpages = hpage_nr_pages(page);
reclaim_stat->recent_rotated[file] += numpages;
}
if (put_page_testzero(page)) { if (put_page_testzero(page)) {
__ClearPageLRU(page); __ClearPageLRU(page);
__ClearPageActive(page); __ClearPageActive(page);
...@@ -1945,6 +1942,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, ...@@ -1945,6 +1942,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT, count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT,
nr_reclaimed); nr_reclaimed);
} }
reclaim_stat->recent_rotated[0] = stat.nr_activate[0];
reclaim_stat->recent_rotated[1] = stat.nr_activate[1];
putback_inactive_pages(lruvec, &page_list); putback_inactive_pages(lruvec, &page_list);
......
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