• Zi Yan's avatar
    mm: fix a potential infinite loop in start_isolate_page_range() · 88ee1343
    Zi Yan authored
    In isolate_single_pageblock() called by start_isolate_page_range(), there
    are some pageblock isolation issues causing a potential infinite loop when
    isolating a page range.  This is reported by Qian Cai.
    
    1. the pageblock was isolated by just changing pageblock migratetype
       without checking unmovable pages. Calling set_migratetype_isolate() to
       isolate pageblock properly.
    2. an off-by-one error caused migrating pages unnecessarily, since the page
       is not crossing pageblock boundary.
    3. migrating a compound page across pageblock boundary then splitting the
       free page later has a small race window that the free page might be
       allocated again, so that the code will try again, causing an potential
       infinite loop. Temporarily set the to-be-migrated page's pageblock to
       MIGRATE_ISOLATE to prevent that and bail out early if no free page is
       found after page migration.
    
    An additional fix to split_free_page() aims to avoid crashing in
    __free_one_page().  When the free page is split at the specified
    split_pfn_offset, free_page_order should check both the first bit of
    free_page_pfn and the last bit of split_pfn_offset and use the smaller
    one.  For example, if free_page_pfn=0x10000, split_pfn_offset=0xc000,
    free_page_order should first be 0x8000 then 0x4000, instead of 0x4000 then
    0x8000, which the original algorithm did.
    
    [akpm@linux-foundation.org: suppress min() warning]
    Link: https://lkml.kernel.org/r/20220524194756.1698351-1-zi.yan@sent.com
    Fixes: b2c9e2fb
    
     ("mm: make alloc_contig_range work at pageblock granularity")
    Signed-off-by: default avatarZi Yan <ziy@nvidia.com>
    Reported-by: default avatarQian Cai <quic_qiancai@quicinc.com>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Eric Ren <renzhengeek@gmail.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Mike Rapoport <rppt@linux.ibm.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Oscar Salvador <osalvador@suse.de>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    88ee1343
page_alloc.c 265 KB