aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/rmap.c57
1 files changed, 30 insertions, 27 deletions
diff --git a/mm/rmap.c b/mm/rmap.c
index 0895b5c7cbff..1406e67f9613 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -739,34 +739,37 @@ void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long
739 */ 739 */
740void page_remove_rmap(struct page *page) 740void page_remove_rmap(struct page *page)
741{ 741{
742 if (atomic_add_negative(-1, &page->_mapcount)) { 742 /* page still mapped by someone else? */
743 /* 743 if (!atomic_add_negative(-1, &page->_mapcount))
744 * Now that the last pte has gone, s390 must transfer dirty 744 return;
745 * flag from storage key to struct page. We can usually skip 745
746 * this if the page is anon, so about to be freed; but perhaps 746 /*
747 * not if it's in swapcache - there might be another pte slot 747 * Now that the last pte has gone, s390 must transfer dirty
748 * containing the swap entry, but page not yet written to swap. 748 * flag from storage key to struct page. We can usually skip
749 */ 749 * this if the page is anon, so about to be freed; but perhaps
750 if ((!PageAnon(page) || PageSwapCache(page)) && 750 * not if it's in swapcache - there might be another pte slot
751 page_test_dirty(page)) { 751 * containing the swap entry, but page not yet written to swap.
752 page_clear_dirty(page); 752 */
753 set_page_dirty(page); 753 if ((!PageAnon(page) || PageSwapCache(page)) && page_test_dirty(page)) {
754 } 754 page_clear_dirty(page);
755 if (PageAnon(page)) 755 set_page_dirty(page);
756 mem_cgroup_uncharge_page(page);
757 __dec_zone_page_state(page,
758 PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED);
759 mem_cgroup_update_mapped_file_stat(page, -1);
760 /*
761 * It would be tidy to reset the PageAnon mapping here,
762 * but that might overwrite a racing page_add_anon_rmap
763 * which increments mapcount after us but sets mapping
764 * before us: so leave the reset to free_hot_cold_page,
765 * and remember that it's only reliable while mapped.
766 * Leaving it set also helps swapoff to reinstate ptes
767 * faster for those pages still in swapcache.
768 */
769 } 756 }
757 if (PageAnon(page)) {
758 mem_cgroup_uncharge_page(page);
759 __dec_zone_page_state(page, NR_ANON_PAGES);
760 } else {
761 __dec_zone_page_state(page, NR_FILE_MAPPED);
762 }
763 mem_cgroup_update_mapped_file_stat(page, -1);
764 /*
765 * It would be tidy to reset the PageAnon mapping here,
766 * but that might overwrite a racing page_add_anon_rmap
767 * which increments mapcount after us but sets mapping
768 * before us: so leave the reset to free_hot_cold_page,
769 * and remember that it's only reliable while mapped.
770 * Leaving it set also helps swapoff to reinstate ptes
771 * faster for those pages still in swapcache.
772 */
770} 773}
771 774
772/* 775/*