diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5e8eadd71bac..b9b6bef90169 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -582,6 +582,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
582 | BUG_ON(!PageLocked(page)); | 582 | BUG_ON(!PageLocked(page)); |
583 | BUG_ON(mapping != page_mapping(page)); | 583 | BUG_ON(mapping != page_mapping(page)); |
584 | 584 | ||
585 | again: | ||
585 | spin_lock_irq(&mapping->tree_lock); | 586 | spin_lock_irq(&mapping->tree_lock); |
586 | /* | 587 | /* |
587 | * The non racy check for a busy page. | 588 | * The non racy check for a busy page. |
@@ -640,7 +641,11 @@ static int __remove_mapping(struct address_space *mapping, struct page *page, | |||
640 | if (reclaimed && page_is_file_cache(page) && | 641 | if (reclaimed && page_is_file_cache(page) && |
641 | !mapping_exiting(mapping)) | 642 | !mapping_exiting(mapping)) |
642 | shadow = workingset_eviction(mapping, page); | 643 | shadow = workingset_eviction(mapping, page); |
643 | __delete_from_page_cache(page, shadow); | 644 | if (PageReplicated(page)) { |
645 | if (reclaim_replicated_page(mapping, page)) | ||
646 | goto again; | ||
647 | } else | ||
648 | __delete_from_page_cache(page, shadow); | ||
644 | spin_unlock_irq(&mapping->tree_lock); | 649 | spin_unlock_irq(&mapping->tree_lock); |
645 | 650 | ||
646 | if (freepage != NULL) | 651 | if (freepage != NULL) |