• V
    mm, compaction: make fast_isolate_freepages() stay within zone · 6effbeed
    Vlastimil Babka 提交于
    stable inclusion
    from stable-5.10.20
    commit 25b0eb2e33c9a3883a523d142681f5302bc80400
    bugzilla: 50608
    
    --------------------------------
    
    commit 6e2b7044 upstream.
    
    Compaction always operates on pages from a single given zone when
    isolating both pages to migrate and freepages.  Pageblock boundaries are
    intersected with zone boundaries to be safe in case zone starts or ends in
    the middle of pageblock.  The use of pageblock_pfn_to_page() protects
    against non-contiguous pageblocks.
    
    The functions fast_isolate_freepages() and fast_isolate_around() don't
    currently protect the fast freepage isolation thoroughly enough against
    these corner cases, and can result in freepage isolation operate outside
    of zone boundaries:
    
     - in fast_isolate_freepages() if we get a pfn from the first pageblock
       of a zone that starts in the middle of that pageblock, 'highest' can
       be a pfn outside of the zone.
    
       If we fail to isolate anything in this function, we may then call
       fast_isolate_around() on a pfn outside of the zone and there
       effectively do a set_pageblock_skip(page_to_pfn(highest)) which may
       currently hit a VM_BUG_ON() in some configurations
    
     - fast_isolate_around() checks only the zone end boundary and not
       beginning, nor that the pageblock is contiguous (with
       pageblock_pfn_to_page()) so it's possible that we end up calling
       isolate_freepages_block() on a range of pfn's from two different
       zones and end up e.g. isolating freepages under the wrong zone's
       lock.
    
    This patch should fix the above issues.
    
    Link: https://lkml.kernel.org/r/20210217173300.6394-1-vbabka@suse.cz
    Fixes: 5a811889 ("mm, compaction: use free lists to quickly locate a migration target")
    Signed-off-by: NVlastimil Babka <vbabka@suse.cz>
    Acked-by: NDavid Rientjes <rientjes@google.com>
    Acked-by: NMel Gorman <mgorman@techsingularity.net>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    6effbeed
compaction.c 80.5 KB