Minchan Kim 21ee9f398b vmscan: add barrier to prevent evictable page in unevictable list
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: Minchan Kim <minchan.kim@gmail.com>
Acked-by: KOSAKI 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: Johannes Weiner <jweiner@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-10-31 17:30:50 -07:00
..
2011-07-25 20:57:14 -07:00
2011-05-26 09:20:31 -07:00
2011-10-31 17:30:49 -07:00
2011-07-25 20:57:09 -07:00
2011-07-26 16:49:47 -07:00
2011-10-31 17:30:47 -07:00
2011-07-26 16:49:47 -07:00
2011-07-20 20:47:46 -04:00
2011-10-31 17:30:44 -07:00
2011-10-31 17:30:50 -07:00
2011-10-31 17:30:50 -07:00
2011-05-26 09:20:31 -07:00
2011-10-31 17:30:48 -07:00
2011-07-25 20:57:09 -07:00
2011-10-31 17:30:44 -07:00
2011-07-26 16:49:47 -07:00
2011-10-31 17:30:47 -07:00
2011-07-25 20:57:07 -07:00
2011-10-31 17:30:50 -07:00
2011-05-25 08:39:05 -07:00