• Jaewon Kim's avatar
    mm/vmscan: count layzfree pages and fix nr_isolated_* mismatch · 1f318a9b
    Jaewon Kim authored
    Fix an nr_isolate_* mismatch problem between cma and dirty lazyfree pages.
    
    If try_to_unmap_one is used for reclaim and it detects a dirty lazyfree
    page, then the lazyfree page is changed to a normal anon page having
    SwapBacked by commit 802a3a92 ("mm: reclaim MADV_FREE pages").  Even
    with the change, reclaim context correctly counts isolated files because
    it uses is_file_lru to distinguish file.  And the change to anon is not
    happened if try_to_unmap_one is used for migration.  So migration context
    like compaction also correctly counts isolated files even though it uses
    page_is_file_lru insted of is_file_lru.  Recently page_is_file_cache was
    renamed to page_is_file_lru by commit 9de4f22a ("mm: code cleanup for
    MADV_FREE").
    
    But the nr_isolate_* mismatch problem happens on cma alloc.  There is
    reclaim_clean_pages_from_list which is being used only by cma.  It was
    introduced by commit 02c6de8d ("mm: cma: discard clean pages during
    contiguous allocation instead of migration") to reclaim clean file pages
    without migration.  The cma alloc uses both reclaim_clean_pages_from_list
    and migrate_pages, and it uses page_is_file_lru to count isolated files.
    If there are dirty lazyfree pages allocated from cma memory region, the
    pages are counted as isolated file at the beginging but are counted as
    isolated anon after finished.
    
    Mem-Info:
    Node 0 active_anon:3045904kB inactive_anon:611448kB active_file:14892kB inactive_file:205636kB unevictable:10416kB isolated(anon):0kB isolated(file):37664kB mapped:630216kB dirty:384kB writeback:0kB shmem:42576kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
    
    Like log above, there were too much isolated files, 37664kB, which
    triggers too_many_isolated in reclaim even when there is no actually
    isolated file in system wide.  It could be reproducible by running two
    programs, writing on MADV_FREE page and doing cma alloc, respectively.
    Although isolated anon is 0, I found that the internal value of isolated
    anon was the negative value of isolated file.
    
    Fix this by compensating the isolated count for both LRU lists.  Count
    non-discarded lazyfree pages in shrink_page_list, then compensate the
    counted number in reclaim_clean_pages_from_list.
    Reported-by: default avatarYong-Taek Lee <ytk.lee@samsung.com>
    Suggested-by: default avatarMinchan Kim <minchan@kernel.org>
    Signed-off-by: default avatarJaewon Kim <jaewon31.kim@samsung.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarMinchan Kim <minchan@kernel.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Michal Nazarewicz <mina86@mina86.com>
    Cc: Shaohua Li <shli@fb.com>
    Link: http://lkml.kernel.org/r/20200426011718.30246-1-jaewon31.kim@samsung.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1f318a9b
vmscan.c 124 KB