• Joonsoo Kim's avatar
    mm/compaction: fix invalid free_pfn and compact_cached_free_pfn · 623446e4
    Joonsoo Kim authored
    free_pfn and compact_cached_free_pfn are the pointer that remember
    restart position of freepage scanner.  When they are reset or invalid,
    we set them to zone_end_pfn because freepage scanner works in reverse
    direction.  But, because zone range is defined as [zone_start_pfn,
    zone_end_pfn), zone_end_pfn is invalid to access.  Therefore, we should
    not store it to free_pfn and compact_cached_free_pfn.  Instead, we need
    to store zone_end_pfn - 1 to them.  There is one more thing we should
    consider.  Freepage scanner scan reversely by pageblock unit.  If
    free_pfn and compact_cached_free_pfn are set to middle of pageblock, it
    regards that sitiation as that it already scans front part of pageblock
    so we lose opportunity to scan there.  To fix-up, this patch do
    round_down() to guarantee that reset position will be pageblock aligned.
    
    Note that thanks to the current pageblock_pfn_to_page() implementation,
    actual access to zone_end_pfn doesn't happen until now.  But, following
    patch will change pageblock_pfn_to_page() so this patch is needed from
    now on.
    Signed-off-by: default avatarJoonsoo Kim <iamjoonsoo.kim@lge.com>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: Aaron Lu <aaron.lu@intel.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Rik van Riel <riel@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    623446e4
compaction.c 48.3 KB