• Minchan Kim's avatar
    vmscan: add barrier to prevent evictable page in unevictable list · 21ee9f39
    Minchan Kim authored
    When a race between putback_lru_page() and shmem_lock with lock=0 happens,
    progrom execution order is as follows, but clear_bit in processor #1 could
    be reordered right before spin_unlock of processor #1.  Then, the page
    would be stranded on the unevictable list.
    
    spin_lock
    SetPageLRU
    spin_unlock
                                    clear_bit(AS_UNEVICTABLE)
                                    spin_lock
                                    if PageLRU()
                                            if !test_bit(AS_UNEVICTABLE)
                                            	move evictable list
    smp_mb
    if !test_bit(AS_UNEVICTABLE)
            move evictable list
                                    spin_unlock
    
    But, pagevec_lookup() in scan_mapping_unevictable_pages() has
    rcu_read_[un]lock() so it could protect reordering before reaching
    test_bit(AS_UNEVICTABLE) on processor #1 so this problem never happens.
    But it's a unexpected side effect and we should solve this problem
    properly.
    
    This patch adds a barrier after mapping_clear_unevictable.
    
    I didn't meet this problem but just found during review.
    Signed-off-by: default avatarMinchan Kim <minchan.kim@gmail.com>
    Acked-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
    Acked-by: default avatarJohannes Weiner <jweiner@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    21ee9f39
shmem.c 63.8 KB