• Johannes Weiner's avatar
    mm: exclude reserved pages from dirtyable memory · ab8fabd4
    Johannes Weiner authored
    Per-zone dirty limits try to distribute page cache pages allocated for
    writing across zones in proportion to the individual zone sizes, to reduce
    the likelihood of reclaim having to write back individual pages from the
    LRU lists in order to make progress.
    
    This patch:
    
    The amount of dirtyable pages should not include the full number of free
    pages: there is a number of reserved pages that the page allocator and
    kswapd always try to keep free.
    
    The closer (reclaimable pages - dirty pages) is to the number of reserved
    pages, the more likely it becomes for reclaim to run into dirty pages:
    
           +----------+ ---
           |   anon   |  |
           +----------+  |
           |          |  |
           |          |  -- dirty limit new    -- flusher new
           |   file   |  |                     |
           |          |  |                     |
           |          |  -- dirty limit old    -- flusher old
           |          |                        |
           +----------+                       --- reclaim
           | reserved |
           +----------+
           |  kernel  |
           +----------+
    
    This patch introduces a per-zone dirty reserve that takes both the lowmem
    reserve as well as the high watermark of the zone into account, and a
    global sum of those per-zone values that is subtracted from the global
    amount of dirtyable pages.  The lowmem reserve is unavailable to page
    cache allocations and kswapd tries to keep the high watermark free.  We
    don't want to end up in a situation where reclaim has to clean pages in
    order to balance zones.
    
    Not treating reserved pages as dirtyable on a global level is only a
    conceptual fix.  In reality, dirty pages are not distributed equally
    across zones and reclaim runs into dirty pages on a regular basis.
    
    But it is important to get this right before tackling the problem on a
    per-zone level, where the distance between reclaim and the dirty pages is
    mostly much smaller in absolute numbers.
    
    [akpm@linux-foundation.org: fix highmem build]
    Signed-off-by: default avatarJohannes Weiner <jweiner@redhat.com>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
    Reviewed-by: default avatarMinchan Kim <minchan.kim@gmail.com>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Wu Fengguang <fengguang.wu@intel.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Shaohua Li <shaohua.li@intel.com>
    Cc: Chris Mason <chris.mason@oracle.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ab8fabd4
page_alloc.c 153 KB