Commit 2a1dc509 authored by Johannes Weiner's avatar Johannes Weiner Committed by Linus Torvalds

vmscan: protect zone rotation stats by lru lock

The zone's rotation statistics must not be accessed without the
corresponding LRU lock held.  Fix an unprotected write in
shrink_active_list().
Acked-by: default avatarRik van Riel <riel@redhat.com>
Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: default avatarJohannes Weiner <hannes@saeurebad.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 33b07db9
...@@ -1248,6 +1248,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, ...@@ -1248,6 +1248,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
list_add(&page->lru, &l_inactive); list_add(&page->lru, &l_inactive);
} }
spin_lock_irq(&zone->lru_lock);
/* /*
* Count referenced pages from currently used mappings as * Count referenced pages from currently used mappings as
* rotated, even though they are moved to the inactive list. * rotated, even though they are moved to the inactive list.
...@@ -1263,7 +1264,6 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, ...@@ -1263,7 +1264,6 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
pgmoved = 0; pgmoved = 0;
lru = LRU_BASE + file * LRU_FILE; lru = LRU_BASE + file * LRU_FILE;
spin_lock_irq(&zone->lru_lock);
while (!list_empty(&l_inactive)) { while (!list_empty(&l_inactive)) {
page = lru_to_page(&l_inactive); page = lru_to_page(&l_inactive);
prefetchw_prev_lru_page(page, &l_inactive, flags); prefetchw_prev_lru_page(page, &l_inactive, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment