• Srivatsa S. Bhat's avatar
    mm/page_allo.c: restructure free-page stealing code and fix a bug · fef903ef
    Srivatsa S. Bhat authored
    The free-page stealing code in __rmqueue_fallback() is somewhat hard to
    follow, and has an incredible amount of subtlety hidden inside!
    
    First off, there is a minor bug in the reporting of change-of-ownership of
    pageblocks.  Under some conditions, we try to move upto
    'pageblock_nr_pages' no.  of pages to the preferred allocation list.  But
    we change the ownership of that pageblock to the preferred type only if we
    manage to successfully move atleast half of that pageblock (or if
    page_group_by_mobility_disabled is set).
    
    However, the current code ignores the latter part and sets the
    'migratetype' variable to the preferred type, irrespective of whether we
    actually changed the pageblock migratetype of that block or not.  So, the
    page_alloc_extfrag tracepoint can end up printing incorrect info (i.e.,
    'change_ownership' might be shown as 1 when it must have been 0).
    
    So fixing this involves moving the update of the 'migratetype' variable to
    the right place.  But looking closer, we observe that the 'migratetype'
    variable is used subsequently for checks such as "is_migrate_cma()".
    Obviously the intent there is to check if the *fallback* type is
    MIGRATE_CMA, but since we already set the 'migratetype' variable to
    start_migratetype, we end up checking if the *preferred* type is
    MIGRATE_CMA!!
    
    To make things more interesting, this actually doesn't cause a bug in
    practice, because we never change *anything* if the fallback type is CMA.
    
    So, restructure the code in such a way that it is trivial to understand
    what is going on, and also fix the above mentioned bug.  And while at it,
    also add a comment explaining the subtlety behind the migratetype used in
    the call to expand().
    
    [akpm@linux-foundation.org: remove unneeded `inline', small coding-style fix]
    Signed-off-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Cody P Schafer <cody@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fef903ef
page_alloc.c 177 KB