summaryrefslogtreecommitdiffstats
path: root/mm/migrate.c
diff options
context:
space:
mode:
authorMing Ling <ming.ling@spreadtrum.com>2016-12-12 19:42:26 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-12-12 21:55:07 -0500
commit6afcf8ef0ca0a69d014f8edb613d94821f0ae700 (patch)
tree0efd242ae2444b808e4f81aed28f4688bedeb133 /mm/migrate.c
parent6d8409580bee356ce418dcb94260b24dda639934 (diff)
mm, compaction: fix NR_ISOLATED_* stats for pfn based migration
Since commit bda807d44454 ("mm: migrate: support non-lru movable page migration") isolate_migratepages_block) can isolate !PageLRU pages which would acct_isolated account as NR_ISOLATED_*. Accounting these non-lru pages NR_ISOLATED_{ANON,FILE} doesn't make any sense and it can misguide heuristics based on those counters such as pgdat_reclaimable_pages resp. too_many_isolated which would lead to unexpected stalls during the direct reclaim without any good reason. Note that __alloc_contig_migrate_range can isolate a lot of pages at once. On mobile devices such as 512M ram android Phone, it may use a big zram swap. In some cases zram(zsmalloc) uses too many non-lru but migratedable pages, such as: MemTotal: 468148 kB Normal free:5620kB Free swap:4736kB Total swap:409596kB ZRAM: 164616kB(zsmalloc non-lru pages) active_anon:60700kB inactive_anon:60744kB active_file:34420kB inactive_file:37532kB Fix this by only accounting lru pages to NR_ISOLATED_* in isolate_migratepages_block right after they were isolated and we still know they were on LRU. Drop acct_isolated because it is called after the fact and we've lost that information. Batching per-cpu counter doesn't make much improvement anyway. Also make sure that we uncharge only LRU pages when putting them back on the LRU in putback_movable_pages resp. when unmap_and_move migrates the page. [mhocko@suse.com: replace acct_isolated() with direct counting] Fixes: bda807d44454 ("mm: migrate: support non-lru movable page migration") Link: http://lkml.kernel.org/r/20161019080240.9682-1-mhocko@kernel.org Signed-off-by: Ming Ling <ming.ling@spreadtrum.com> Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Minchan Kim <minchan@kernel.org> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Mel Gorman <mgorman@suse.de> Cc: Joonsoo Kim <js1304@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/migrate.c')
-rw-r--r--mm/migrate.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/mm/migrate.c b/mm/migrate.c
index 99250aee1ac1..66ce6b490b13 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -168,8 +168,6 @@ void putback_movable_pages(struct list_head *l)
168 continue; 168 continue;
169 } 169 }
170 list_del(&page->lru); 170 list_del(&page->lru);
171 dec_node_page_state(page, NR_ISOLATED_ANON +
172 page_is_file_cache(page));
173 /* 171 /*
174 * We isolated non-lru movable page so here we can use 172 * We isolated non-lru movable page so here we can use
175 * __PageMovable because LRU page's mapping cannot have 173 * __PageMovable because LRU page's mapping cannot have
@@ -186,6 +184,8 @@ void putback_movable_pages(struct list_head *l)
186 put_page(page); 184 put_page(page);
187 } else { 185 } else {
188 putback_lru_page(page); 186 putback_lru_page(page);
187 dec_node_page_state(page, NR_ISOLATED_ANON +
188 page_is_file_cache(page));
189 } 189 }
190 } 190 }
191} 191}
@@ -1121,8 +1121,15 @@ out:
1121 * restored. 1121 * restored.
1122 */ 1122 */
1123 list_del(&page->lru); 1123 list_del(&page->lru);
1124 dec_node_page_state(page, NR_ISOLATED_ANON + 1124
1125 page_is_file_cache(page)); 1125 /*
1126 * Compaction can migrate also non-LRU pages which are
1127 * not accounted to NR_ISOLATED_*. They can be recognized
1128 * as __PageMovable
1129 */
1130 if (likely(!__PageMovable(page)))
1131 dec_node_page_state(page, NR_ISOLATED_ANON +
1132 page_is_file_cache(page));
1126 } 1133 }
1127 1134
1128 /* 1135 /*