• Laura Abbott's avatar
    mm: use aligned zone start for pfn_to_bitidx calculation · c060f943
    Laura Abbott authored
    The current calculation in pfn_to_bitidx assumes that (pfn -
    zone->zone_start_pfn) >> pageblock_order will return the same bit for
    all pfn in a pageblock.  If zone_start_pfn is not aligned to
    pageblock_nr_pages, this may not always be correct.
    
    Consider the following with pageblock order = 10, zone start 2MB:
    
      pfn     | pfn - zone start | (pfn - zone start) >> page block order
      ----------------------------------------------------------------
      0x26000 | 0x25e00	   |  0x97
      0x26100 | 0x25f00	   |  0x97
      0x26200 | 0x26000	   |  0x98
      0x26300 | 0x26100	   |  0x98
    
    This means that calling {get,set}_pageblock_migratetype on a single page
    will not set the migratetype for the full block.  Fix this by rounding
    down zone_start_pfn when doing the bitidx calculation.
    
    For our use case, the effects of this bug were mostly tied to the fact
    that CMA allocations would either take a long time or fail to happen.
    Depending on the driver using CMA, this could result in anything from
    visual glitches to application failures.
    Signed-off-by: default avatarLaura Abbott <lauraa@codeaurora.org>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c060f943
page_alloc.c 170 KB