• NARIBAYASHI Akira's avatar
    mm, compaction: fix fast_isolate_around() to stay within boundaries · be21b32a
    NARIBAYASHI Akira authored
    Depending on the memory configuration, isolate_freepages_block() may scan
    pages out of the target range and causes panic.
    
    Panic can occur on systems with multiple zones in a single pageblock.
    
    The reason it is rare is that it only happens in special
    configurations.  Depending on how many similar systems there are, it
    may be a good idea to fix this problem for older kernels as well.
    
    The problem is that pfn as argument of fast_isolate_around() could be out
    of the target range.  Therefore we should consider the case where pfn <
    start_pfn, and also the case where end_pfn < pfn.
    
    This problem should have been addressd by the commit 6e2b7044 ("mm,
    compaction: make fast_isolate_freepages() stay within zone") but there was
    an oversight.
    
     Case1: pfn < start_pfn
    
      <at memory compaction for node Y>
      |  node X's zone  | node Y's zone
      +-----------------+------------------------------...
       pageblock    ^   ^     ^
      +-----------+-----------+-----------+-----------+...
                    ^   ^     ^
                    ^   ^      end_pfn
                    ^    start_pfn = cc->zone->zone_start_pfn
                     pfn
                    <---------> scanned range by "Scan After"
    
     Case2: end_pfn < pfn
    
      <at memory compaction for node X>
      |  node X's zone  | node Y's zone
      +-----------------+------------------------------...
       pageblock  ^     ^   ^
      +-----------+-----------+-----------+-----------+...
                  ^     ^   ^
                  ^     ^    pfn
                  ^      end_pfn
                   start_pfn
                  <---------> scanned range by "Scan Before"
    
    It seems that there is no good reason to skip nr_isolated pages just after
    given pfn.  So let perform simple scan from start to end instead of
    dividing the scan into "Before" and "After".
    
    Link: https://lkml.kernel.org/r/20221026112438.236336-1-a.naribayashi@fujitsu.com
    Fixes: 6e2b7044 ("mm, compaction: make fast_isolate_freepages() stay within zone").
    Signed-off-by: default avatarNARIBAYASHI Akira <a.naribayashi@fujitsu.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    be21b32a
compaction.c 83.8 KB