Эх сурвалжийг харах

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: Rik van Riel <riel@redhat.com>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Johannes Weiner <hannes@saeurebad.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Johannes Weiner 16 жил өмнө
parent
commit
2a1dc50974
1 өөрчлөгдсөн 1 нэмэгдсэн , 1 устгасан
  1. 1 1
      mm/vmscan.c

+ 1 - 1
mm/vmscan.c

@@ -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,
 
 
 	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);