diff options
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 142 |
1 files changed, 70 insertions, 72 deletions
@@ -36,6 +36,11 @@ | |||
36 | * mapping->tree_lock (widely used, in set_page_dirty, | 36 | * mapping->tree_lock (widely used, in set_page_dirty, |
37 | * in arch-dependent flush_dcache_mmap_lock, | 37 | * in arch-dependent flush_dcache_mmap_lock, |
38 | * within inode_lock in __sync_single_inode) | 38 | * within inode_lock in __sync_single_inode) |
39 | * | ||
40 | * (code doesn't rely on that order so it could be switched around) | ||
41 | * ->tasklist_lock | ||
42 | * anon_vma->lock (memory_failure, collect_procs_anon) | ||
43 | * pte map lock | ||
39 | */ | 44 | */ |
40 | 45 | ||
41 | #include <linux/mm.h> | 46 | #include <linux/mm.h> |
@@ -191,7 +196,7 @@ void __init anon_vma_init(void) | |||
191 | * Getting a lock on a stable anon_vma from a page off the LRU is | 196 | * Getting a lock on a stable anon_vma from a page off the LRU is |
192 | * tricky: page_lock_anon_vma rely on RCU to guard against the races. | 197 | * tricky: page_lock_anon_vma rely on RCU to guard against the races. |
193 | */ | 198 | */ |
194 | static struct anon_vma *page_lock_anon_vma(struct page *page) | 199 | struct anon_vma *page_lock_anon_vma(struct page *page) |
195 | { | 200 | { |
196 | struct anon_vma *anon_vma; | 201 | struct anon_vma *anon_vma; |
197 | unsigned long anon_mapping; | 202 | unsigned long anon_mapping; |
@@ -211,7 +216,7 @@ out: | |||
211 | return NULL; | 216 | return NULL; |
212 | } | 217 | } |
213 | 218 | ||
214 | static void page_unlock_anon_vma(struct anon_vma *anon_vma) | 219 | void page_unlock_anon_vma(struct anon_vma *anon_vma) |
215 | { | 220 | { |
216 | spin_unlock(&anon_vma->lock); | 221 | spin_unlock(&anon_vma->lock); |
217 | rcu_read_unlock(); | 222 | rcu_read_unlock(); |
@@ -237,8 +242,8 @@ vma_address(struct page *page, struct vm_area_struct *vma) | |||
237 | } | 242 | } |
238 | 243 | ||
239 | /* | 244 | /* |
240 | * At what user virtual address is page expected in vma? checking that the | 245 | * At what user virtual address is page expected in vma? |
241 | * page matches the vma: currently only used on anon pages, by unuse_vma; | 246 | * checking that the page matches the vma. |
242 | */ | 247 | */ |
243 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | 248 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) |
244 | { | 249 | { |
@@ -311,7 +316,7 @@ pte_t *page_check_address(struct page *page, struct mm_struct *mm, | |||
311 | * if the page is not mapped into the page tables of this VMA. Only | 316 | * if the page is not mapped into the page tables of this VMA. Only |
312 | * valid for normal file or anonymous VMAs. | 317 | * valid for normal file or anonymous VMAs. |
313 | */ | 318 | */ |
314 | static int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma) | 319 | int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma) |
315 | { | 320 | { |
316 | unsigned long address; | 321 | unsigned long address; |
317 | pte_t *pte; | 322 | pte_t *pte; |
@@ -710,27 +715,6 @@ void page_add_file_rmap(struct page *page) | |||
710 | } | 715 | } |
711 | } | 716 | } |
712 | 717 | ||
713 | #ifdef CONFIG_DEBUG_VM | ||
714 | /** | ||
715 | * page_dup_rmap - duplicate pte mapping to a page | ||
716 | * @page: the page to add the mapping to | ||
717 | * @vma: the vm area being duplicated | ||
718 | * @address: the user virtual address mapped | ||
719 | * | ||
720 | * For copy_page_range only: minimal extract from page_add_file_rmap / | ||
721 | * page_add_anon_rmap, avoiding unnecessary tests (already checked) so it's | ||
722 | * quicker. | ||
723 | * | ||
724 | * The caller needs to hold the pte lock. | ||
725 | */ | ||
726 | void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long address) | ||
727 | { | ||
728 | if (PageAnon(page)) | ||
729 | __page_check_anon_rmap(page, vma, address); | ||
730 | atomic_inc(&page->_mapcount); | ||
731 | } | ||
732 | #endif | ||
733 | |||
734 | /** | 718 | /** |
735 | * page_remove_rmap - take down pte mapping from a page | 719 | * page_remove_rmap - take down pte mapping from a page |
736 | * @page: page to remove mapping from | 720 | * @page: page to remove mapping from |
@@ -739,34 +723,37 @@ void page_dup_rmap(struct page *page, struct vm_area_struct *vma, unsigned long | |||
739 | */ | 723 | */ |
740 | void page_remove_rmap(struct page *page) | 724 | void page_remove_rmap(struct page *page) |
741 | { | 725 | { |
742 | if (atomic_add_negative(-1, &page->_mapcount)) { | 726 | /* page still mapped by someone else? */ |
743 | /* | 727 | if (!atomic_add_negative(-1, &page->_mapcount)) |
744 | * Now that the last pte has gone, s390 must transfer dirty | 728 | return; |
745 | * flag from storage key to struct page. We can usually skip | 729 | |
746 | * this if the page is anon, so about to be freed; but perhaps | 730 | /* |
747 | * not if it's in swapcache - there might be another pte slot | 731 | * Now that the last pte has gone, s390 must transfer dirty |
748 | * containing the swap entry, but page not yet written to swap. | 732 | * flag from storage key to struct page. We can usually skip |
749 | */ | 733 | * this if the page is anon, so about to be freed; but perhaps |
750 | if ((!PageAnon(page) || PageSwapCache(page)) && | 734 | * not if it's in swapcache - there might be another pte slot |
751 | page_test_dirty(page)) { | 735 | * containing the swap entry, but page not yet written to swap. |
752 | page_clear_dirty(page); | 736 | */ |
753 | set_page_dirty(page); | 737 | if ((!PageAnon(page) || PageSwapCache(page)) && page_test_dirty(page)) { |
754 | } | 738 | page_clear_dirty(page); |
755 | if (PageAnon(page)) | 739 | set_page_dirty(page); |
756 | mem_cgroup_uncharge_page(page); | 740 | } |
757 | __dec_zone_page_state(page, | 741 | if (PageAnon(page)) { |
758 | PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED); | 742 | mem_cgroup_uncharge_page(page); |
759 | mem_cgroup_update_mapped_file_stat(page, -1); | 743 | __dec_zone_page_state(page, NR_ANON_PAGES); |
760 | /* | 744 | } else { |
761 | * It would be tidy to reset the PageAnon mapping here, | 745 | __dec_zone_page_state(page, NR_FILE_MAPPED); |
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 | } | 746 | } |
747 | mem_cgroup_update_mapped_file_stat(page, -1); | ||
748 | /* | ||
749 | * It would be tidy to reset the PageAnon mapping here, | ||
750 | * but that might overwrite a racing page_add_anon_rmap | ||
751 | * which increments mapcount after us but sets mapping | ||
752 | * before us: so leave the reset to free_hot_cold_page, | ||
753 | * and remember that it's only reliable while mapped. | ||
754 | * Leaving it set also helps swapoff to reinstate ptes | ||
755 | * faster for those pages still in swapcache. | ||
756 | */ | ||
770 | } | 757 | } |
771 | 758 | ||
772 | /* | 759 | /* |
@@ -774,7 +761,7 @@ void page_remove_rmap(struct page *page) | |||
774 | * repeatedly from either try_to_unmap_anon or try_to_unmap_file. | 761 | * repeatedly from either try_to_unmap_anon or try_to_unmap_file. |
775 | */ | 762 | */ |
776 | static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | 763 | static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, |
777 | int migration) | 764 | enum ttu_flags flags) |
778 | { | 765 | { |
779 | struct mm_struct *mm = vma->vm_mm; | 766 | struct mm_struct *mm = vma->vm_mm; |
780 | unsigned long address; | 767 | unsigned long address; |
@@ -796,11 +783,13 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
796 | * If it's recently referenced (perhaps page_referenced | 783 | * If it's recently referenced (perhaps page_referenced |
797 | * skipped over this mm) then we should reactivate it. | 784 | * skipped over this mm) then we should reactivate it. |
798 | */ | 785 | */ |
799 | if (!migration) { | 786 | if (!(flags & TTU_IGNORE_MLOCK)) { |
800 | if (vma->vm_flags & VM_LOCKED) { | 787 | if (vma->vm_flags & VM_LOCKED) { |
801 | ret = SWAP_MLOCK; | 788 | ret = SWAP_MLOCK; |
802 | goto out_unmap; | 789 | goto out_unmap; |
803 | } | 790 | } |
791 | } | ||
792 | if (!(flags & TTU_IGNORE_ACCESS)) { | ||
804 | if (ptep_clear_flush_young_notify(vma, address, pte)) { | 793 | if (ptep_clear_flush_young_notify(vma, address, pte)) { |
805 | ret = SWAP_FAIL; | 794 | ret = SWAP_FAIL; |
806 | goto out_unmap; | 795 | goto out_unmap; |
@@ -818,7 +807,14 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
818 | /* Update high watermark before we lower rss */ | 807 | /* Update high watermark before we lower rss */ |
819 | update_hiwater_rss(mm); | 808 | update_hiwater_rss(mm); |
820 | 809 | ||
821 | if (PageAnon(page)) { | 810 | if (PageHWPoison(page) && !(flags & TTU_IGNORE_HWPOISON)) { |
811 | if (PageAnon(page)) | ||
812 | dec_mm_counter(mm, anon_rss); | ||
813 | else | ||
814 | dec_mm_counter(mm, file_rss); | ||
815 | set_pte_at(mm, address, pte, | ||
816 | swp_entry_to_pte(make_hwpoison_entry(page))); | ||
817 | } else if (PageAnon(page)) { | ||
822 | swp_entry_t entry = { .val = page_private(page) }; | 818 | swp_entry_t entry = { .val = page_private(page) }; |
823 | 819 | ||
824 | if (PageSwapCache(page)) { | 820 | if (PageSwapCache(page)) { |
@@ -840,12 +836,12 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
840 | * pte. do_swap_page() will wait until the migration | 836 | * pte. do_swap_page() will wait until the migration |
841 | * pte is removed and then restart fault handling. | 837 | * pte is removed and then restart fault handling. |
842 | */ | 838 | */ |
843 | BUG_ON(!migration); | 839 | BUG_ON(TTU_ACTION(flags) != TTU_MIGRATION); |
844 | entry = make_migration_entry(page, pte_write(pteval)); | 840 | entry = make_migration_entry(page, pte_write(pteval)); |
845 | } | 841 | } |
846 | set_pte_at(mm, address, pte, swp_entry_to_pte(entry)); | 842 | set_pte_at(mm, address, pte, swp_entry_to_pte(entry)); |
847 | BUG_ON(pte_file(*pte)); | 843 | BUG_ON(pte_file(*pte)); |
848 | } else if (PAGE_MIGRATION && migration) { | 844 | } else if (PAGE_MIGRATION && (TTU_ACTION(flags) == TTU_MIGRATION)) { |
849 | /* Establish migration entry for a file page */ | 845 | /* Establish migration entry for a file page */ |
850 | swp_entry_t entry; | 846 | swp_entry_t entry; |
851 | entry = make_migration_entry(page, pte_write(pteval)); | 847 | entry = make_migration_entry(page, pte_write(pteval)); |
@@ -1014,12 +1010,13 @@ static int try_to_mlock_page(struct page *page, struct vm_area_struct *vma) | |||
1014 | * vm_flags for that VMA. That should be OK, because that vma shouldn't be | 1010 | * vm_flags for that VMA. That should be OK, because that vma shouldn't be |
1015 | * 'LOCKED. | 1011 | * 'LOCKED. |
1016 | */ | 1012 | */ |
1017 | static int try_to_unmap_anon(struct page *page, int unlock, int migration) | 1013 | static int try_to_unmap_anon(struct page *page, enum ttu_flags flags) |
1018 | { | 1014 | { |
1019 | struct anon_vma *anon_vma; | 1015 | struct anon_vma *anon_vma; |
1020 | struct vm_area_struct *vma; | 1016 | struct vm_area_struct *vma; |
1021 | unsigned int mlocked = 0; | 1017 | unsigned int mlocked = 0; |
1022 | int ret = SWAP_AGAIN; | 1018 | int ret = SWAP_AGAIN; |
1019 | int unlock = TTU_ACTION(flags) == TTU_MUNLOCK; | ||
1023 | 1020 | ||
1024 | if (MLOCK_PAGES && unlikely(unlock)) | 1021 | if (MLOCK_PAGES && unlikely(unlock)) |
1025 | ret = SWAP_SUCCESS; /* default for try_to_munlock() */ | 1022 | ret = SWAP_SUCCESS; /* default for try_to_munlock() */ |
@@ -1035,7 +1032,7 @@ static int try_to_unmap_anon(struct page *page, int unlock, int migration) | |||
1035 | continue; /* must visit all unlocked vmas */ | 1032 | continue; /* must visit all unlocked vmas */ |
1036 | ret = SWAP_MLOCK; /* saw at least one mlocked vma */ | 1033 | ret = SWAP_MLOCK; /* saw at least one mlocked vma */ |
1037 | } else { | 1034 | } else { |
1038 | ret = try_to_unmap_one(page, vma, migration); | 1035 | ret = try_to_unmap_one(page, vma, flags); |
1039 | if (ret == SWAP_FAIL || !page_mapped(page)) | 1036 | if (ret == SWAP_FAIL || !page_mapped(page)) |
1040 | break; | 1037 | break; |
1041 | } | 1038 | } |
@@ -1059,8 +1056,7 @@ static int try_to_unmap_anon(struct page *page, int unlock, int migration) | |||
1059 | /** | 1056 | /** |
1060 | * try_to_unmap_file - unmap/unlock file page using the object-based rmap method | 1057 | * try_to_unmap_file - unmap/unlock file page using the object-based rmap method |
1061 | * @page: the page to unmap/unlock | 1058 | * @page: the page to unmap/unlock |
1062 | * @unlock: request for unlock rather than unmap [unlikely] | 1059 | * @flags: action and flags |
1063 | * @migration: unmapping for migration - ignored if @unlock | ||
1064 | * | 1060 | * |
1065 | * Find all the mappings of a page using the mapping pointer and the vma chains | 1061 | * Find all the mappings of a page using the mapping pointer and the vma chains |
1066 | * contained in the address_space struct it points to. | 1062 | * contained in the address_space struct it points to. |
@@ -1072,7 +1068,7 @@ static int try_to_unmap_anon(struct page *page, int unlock, int migration) | |||
1072 | * vm_flags for that VMA. That should be OK, because that vma shouldn't be | 1068 | * vm_flags for that VMA. That should be OK, because that vma shouldn't be |
1073 | * 'LOCKED. | 1069 | * 'LOCKED. |
1074 | */ | 1070 | */ |
1075 | static int try_to_unmap_file(struct page *page, int unlock, int migration) | 1071 | static int try_to_unmap_file(struct page *page, enum ttu_flags flags) |
1076 | { | 1072 | { |
1077 | struct address_space *mapping = page->mapping; | 1073 | struct address_space *mapping = page->mapping; |
1078 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 1074 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
@@ -1084,6 +1080,7 @@ static int try_to_unmap_file(struct page *page, int unlock, int migration) | |||
1084 | unsigned long max_nl_size = 0; | 1080 | unsigned long max_nl_size = 0; |
1085 | unsigned int mapcount; | 1081 | unsigned int mapcount; |
1086 | unsigned int mlocked = 0; | 1082 | unsigned int mlocked = 0; |
1083 | int unlock = TTU_ACTION(flags) == TTU_MUNLOCK; | ||
1087 | 1084 | ||
1088 | if (MLOCK_PAGES && unlikely(unlock)) | 1085 | if (MLOCK_PAGES && unlikely(unlock)) |
1089 | ret = SWAP_SUCCESS; /* default for try_to_munlock() */ | 1086 | ret = SWAP_SUCCESS; /* default for try_to_munlock() */ |
@@ -1096,7 +1093,7 @@ static int try_to_unmap_file(struct page *page, int unlock, int migration) | |||
1096 | continue; /* must visit all vmas */ | 1093 | continue; /* must visit all vmas */ |
1097 | ret = SWAP_MLOCK; | 1094 | ret = SWAP_MLOCK; |
1098 | } else { | 1095 | } else { |
1099 | ret = try_to_unmap_one(page, vma, migration); | 1096 | ret = try_to_unmap_one(page, vma, flags); |
1100 | if (ret == SWAP_FAIL || !page_mapped(page)) | 1097 | if (ret == SWAP_FAIL || !page_mapped(page)) |
1101 | goto out; | 1098 | goto out; |
1102 | } | 1099 | } |
@@ -1121,7 +1118,8 @@ static int try_to_unmap_file(struct page *page, int unlock, int migration) | |||
1121 | ret = SWAP_MLOCK; /* leave mlocked == 0 */ | 1118 | ret = SWAP_MLOCK; /* leave mlocked == 0 */ |
1122 | goto out; /* no need to look further */ | 1119 | goto out; /* no need to look further */ |
1123 | } | 1120 | } |
1124 | if (!MLOCK_PAGES && !migration && (vma->vm_flags & VM_LOCKED)) | 1121 | if (!MLOCK_PAGES && !(flags & TTU_IGNORE_MLOCK) && |
1122 | (vma->vm_flags & VM_LOCKED)) | ||
1125 | continue; | 1123 | continue; |
1126 | cursor = (unsigned long) vma->vm_private_data; | 1124 | cursor = (unsigned long) vma->vm_private_data; |
1127 | if (cursor > max_nl_cursor) | 1125 | if (cursor > max_nl_cursor) |
@@ -1155,7 +1153,7 @@ static int try_to_unmap_file(struct page *page, int unlock, int migration) | |||
1155 | do { | 1153 | do { |
1156 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, | 1154 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, |
1157 | shared.vm_set.list) { | 1155 | shared.vm_set.list) { |
1158 | if (!MLOCK_PAGES && !migration && | 1156 | if (!MLOCK_PAGES && !(flags & TTU_IGNORE_MLOCK) && |
1159 | (vma->vm_flags & VM_LOCKED)) | 1157 | (vma->vm_flags & VM_LOCKED)) |
1160 | continue; | 1158 | continue; |
1161 | cursor = (unsigned long) vma->vm_private_data; | 1159 | cursor = (unsigned long) vma->vm_private_data; |
@@ -1195,7 +1193,7 @@ out: | |||
1195 | /** | 1193 | /** |
1196 | * try_to_unmap - try to remove all page table mappings to a page | 1194 | * try_to_unmap - try to remove all page table mappings to a page |
1197 | * @page: the page to get unmapped | 1195 | * @page: the page to get unmapped |
1198 | * @migration: migration flag | 1196 | * @flags: action and flags |
1199 | * | 1197 | * |
1200 | * Tries to remove all the page table entries which are mapping this | 1198 | * Tries to remove all the page table entries which are mapping this |
1201 | * page, used in the pageout path. Caller must hold the page lock. | 1199 | * page, used in the pageout path. Caller must hold the page lock. |
@@ -1206,16 +1204,16 @@ out: | |||
1206 | * SWAP_FAIL - the page is unswappable | 1204 | * SWAP_FAIL - the page is unswappable |
1207 | * SWAP_MLOCK - page is mlocked. | 1205 | * SWAP_MLOCK - page is mlocked. |
1208 | */ | 1206 | */ |
1209 | int try_to_unmap(struct page *page, int migration) | 1207 | int try_to_unmap(struct page *page, enum ttu_flags flags) |
1210 | { | 1208 | { |
1211 | int ret; | 1209 | int ret; |
1212 | 1210 | ||
1213 | BUG_ON(!PageLocked(page)); | 1211 | BUG_ON(!PageLocked(page)); |
1214 | 1212 | ||
1215 | if (PageAnon(page)) | 1213 | if (PageAnon(page)) |
1216 | ret = try_to_unmap_anon(page, 0, migration); | 1214 | ret = try_to_unmap_anon(page, flags); |
1217 | else | 1215 | else |
1218 | ret = try_to_unmap_file(page, 0, migration); | 1216 | ret = try_to_unmap_file(page, flags); |
1219 | if (ret != SWAP_MLOCK && !page_mapped(page)) | 1217 | if (ret != SWAP_MLOCK && !page_mapped(page)) |
1220 | ret = SWAP_SUCCESS; | 1218 | ret = SWAP_SUCCESS; |
1221 | return ret; | 1219 | return ret; |
@@ -1240,8 +1238,8 @@ int try_to_munlock(struct page *page) | |||
1240 | VM_BUG_ON(!PageLocked(page) || PageLRU(page)); | 1238 | VM_BUG_ON(!PageLocked(page) || PageLRU(page)); |
1241 | 1239 | ||
1242 | if (PageAnon(page)) | 1240 | if (PageAnon(page)) |
1243 | return try_to_unmap_anon(page, 1, 0); | 1241 | return try_to_unmap_anon(page, TTU_MUNLOCK); |
1244 | else | 1242 | else |
1245 | return try_to_unmap_file(page, 1, 0); | 1243 | return try_to_unmap_file(page, TTU_MUNLOCK); |
1246 | } | 1244 | } |
1247 | 1245 | ||