• Cody P Schafer's avatar
    mm/page_alloc: factor out setting of pcp->high and pcp->batch · 4008bab7
    Cody P Schafer authored
    "Problems" with the current code:
    
    1: there is a lack of synchronization in setting ->high and ->batch in
       percpu_pagelist_fraction_sysctl_handler()
    
    2: stop_machine() in zone_pcp_update() is unnecissary.
    
    3: zone_pcp_update() does not consider the case where
       percpu_pagelist_fraction is non-zero
    
    To fix:
    
    1: add memory barriers, a safe ->batch value, an update side mutex when
       updating ->high and ->batch, and use ACCESS_ONCE() for ->batch users
       that expect a stable value.
    
    2: avoid draining pages in zone_pcp_update(), rely upon the memory
       barriers added to fix #1
    
    3: factor out quite a few functions, and then call the appropriate one.
    
    Note that it results in a change to the behavior of zone_pcp_update(),
    which is used by memory_hotplug.  I'm rather certain that I've diserned
    (and preserved) the essential behavior (changing ->high and ->batch), and
    only eliminated unneeded actions (draining the per cpu pages), but this
    may not be the case.
    
    Further note that the draining of pages that previously took place in
    zone_pcp_update() occured after repeated draining when attempting to
    offline a page, and after the offline has "succeeded".  It appears that
    the draining was added to zone_pcp_update() to avoid refactoring
    setup_pageset() into 2 funtions.
    
    This patch:
    
    Creates pageset_set_batch() for use in setup_pageset().
    pageset_set_batch() imitates the functionality of
    setup_pagelist_highmark(), but uses the boot time
    (percpu_pagelist_fraction == 0) calculations for determining ->high based
    on ->batch.
    Signed-off-by: default avatarCody P Schafer <cody@linux.vnet.ibm.com>
    Cc: Gilad Ben-Yossef <gilad@benyossef.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Pekka Enberg <penberg@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4008bab7
page_alloc.c 172 KB