• Alex,Shi's avatar
    kswapd: assign new_order and new_classzone_idx after wakeup in sleeping · f0dfcde0
    Alex,Shi authored
    There 2 places to read pgdat in kswapd.  One is return from a successful
    balance, another is waked up from kswapd sleeping.  The new_order and
    new_classzone_idx represent the balance input order and classzone_idx.
    
    But current new_order and new_classzone_idx are not assigned after
    kswapd_try_to_sleep(), that will cause a bug in the following scenario.
    
    1: after a successful balance, kswapd goes to sleep, and new_order = 0;
       new_classzone_idx = __MAX_NR_ZONES - 1;
    
    2: kswapd waked up with order = 3 and classzone_idx = ZONE_NORMAL
    
    3: in the balance_pgdat() running, a new balance wakeup happened with
       order = 5, and classzone_idx = ZONE_NORMAL
    
    4: the first wakeup(order = 3) finished successufly, return order = 3
       but, the new_order is still 0, so, this balancing will be treated as a
       failed balance.  And then the second tighter balancing will be missed.
    
    So, to avoid the above problem, the new_order and new_classzone_idx need
    to be assigned for later successful comparison.
    Signed-off-by: default avatarAlex Shi <alex.shi@intel.com>
    Acked-by: default avatarMel Gorman <mgorman@suse.de>
    Reviewed-by: default avatarMinchan Kim <minchan.kim@gmail.com>
    Tested-by: default avatarPádraig Brady <P@draigBrady.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f0dfcde0
vmscan.c 99.4 KB