• Johannes Weiner's avatar
    vmscan: order evictable rescue in LRU putback · 6a7b9548
    Johannes Weiner authored
    Isolators putting a page back to the LRU do not hold the page lock, and if
    the page is mlocked, another thread might munlock it concurrently.
    
    Expecting this, the putback code re-checks the evictability of a page when
    it just moved it to the unevictable list in order to correct its decision.
    
    The problem, however, is that ordering is not garuanteed between setting
    PG_lru when moving the page to the list and checking PG_mlocked
    afterwards:
    
    	#0:				#1
    
    	spin_lock()
    					if (TestClearPageMlocked())
    					  if (PageLRU())
    					    move to evictable list
    	SetPageLRU()
    	spin_unlock()
    	if (!PageMlocked())
    	  move to evictable list
    
    The PageMlocked() check may get reordered before SetPageLRU() in #0,
    resulting in #0 not moving the still mlocked page, and in #1 failing to
    isolate and move the page as well.  The page is now stranded on the
    unevictable list.
    
    The race condition is very unlikely.  The consequence currently is one
    page falling off the reclaim grid and eventually getting freed with
    PG_unevictable set, which triggers a warning in the page allocator.
    
    TestClearPageMlocked() in #1 already provides full memory barrier
    semantics.
    
    This patch adds an explicit full barrier to force ordering between
    SetPageLRU() and PageMlocked() so that either one of the competitors
    rescues the page.
    Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Reviewed-by: default avatarRik van Riel <riel@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6a7b9548
vmscan.c 80.7 KB