aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c7
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
585again:
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)