diff options
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 159 |
1 files changed, 60 insertions, 99 deletions
@@ -127,12 +127,7 @@ static void anon_vma_chain_link(struct vm_area_struct *vma, | |||
127 | avc->vma = vma; | 127 | avc->vma = vma; |
128 | avc->anon_vma = anon_vma; | 128 | avc->anon_vma = anon_vma; |
129 | list_add(&avc->same_vma, &vma->anon_vma_chain); | 129 | list_add(&avc->same_vma, &vma->anon_vma_chain); |
130 | 130 | anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); | |
131 | /* | ||
132 | * It's critical to add new vmas to the tail of the anon_vma, | ||
133 | * see comment in huge_memory.c:__split_huge_page(). | ||
134 | */ | ||
135 | list_add_tail(&avc->same_anon_vma, &anon_vma->head); | ||
136 | } | 131 | } |
137 | 132 | ||
138 | /** | 133 | /** |
@@ -269,51 +264,6 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src) | |||
269 | } | 264 | } |
270 | 265 | ||
271 | /* | 266 | /* |
272 | * Some rmap walk that needs to find all ptes/hugepmds without false | ||
273 | * negatives (like migrate and split_huge_page) running concurrent | ||
274 | * with operations that copy or move pagetables (like mremap() and | ||
275 | * fork()) to be safe. They depend on the anon_vma "same_anon_vma" | ||
276 | * list to be in a certain order: the dst_vma must be placed after the | ||
277 | * src_vma in the list. This is always guaranteed by fork() but | ||
278 | * mremap() needs to call this function to enforce it in case the | ||
279 | * dst_vma isn't newly allocated and chained with the anon_vma_clone() | ||
280 | * function but just an extension of a pre-existing vma through | ||
281 | * vma_merge. | ||
282 | * | ||
283 | * NOTE: the same_anon_vma list can still be changed by other | ||
284 | * processes while mremap runs because mremap doesn't hold the | ||
285 | * anon_vma mutex to prevent modifications to the list while it | ||
286 | * runs. All we need to enforce is that the relative order of this | ||
287 | * process vmas isn't changing (we don't care about other vmas | ||
288 | * order). Each vma corresponds to an anon_vma_chain structure so | ||
289 | * there's no risk that other processes calling anon_vma_moveto_tail() | ||
290 | * and changing the same_anon_vma list under mremap() will screw with | ||
291 | * the relative order of this process vmas in the list, because we | ||
292 | * they can't alter the order of any vma that belongs to this | ||
293 | * process. And there can't be another anon_vma_moveto_tail() running | ||
294 | * concurrently with mremap() coming from this process because we hold | ||
295 | * the mmap_sem for the whole mremap(). fork() ordering dependency | ||
296 | * also shouldn't be affected because fork() only cares that the | ||
297 | * parent vmas are placed in the list before the child vmas and | ||
298 | * anon_vma_moveto_tail() won't reorder vmas from either the fork() | ||
299 | * parent or child. | ||
300 | */ | ||
301 | void anon_vma_moveto_tail(struct vm_area_struct *dst) | ||
302 | { | ||
303 | struct anon_vma_chain *pavc; | ||
304 | struct anon_vma *root = NULL; | ||
305 | |||
306 | list_for_each_entry_reverse(pavc, &dst->anon_vma_chain, same_vma) { | ||
307 | struct anon_vma *anon_vma = pavc->anon_vma; | ||
308 | VM_BUG_ON(pavc->vma != dst); | ||
309 | root = lock_anon_vma_root(root, anon_vma); | ||
310 | list_del(&pavc->same_anon_vma); | ||
311 | list_add_tail(&pavc->same_anon_vma, &anon_vma->head); | ||
312 | } | ||
313 | unlock_anon_vma_root(root); | ||
314 | } | ||
315 | |||
316 | /* | ||
317 | * Attach vma to its own anon_vma, as well as to the anon_vmas that | 267 | * Attach vma to its own anon_vma, as well as to the anon_vmas that |
318 | * the corresponding VMA in the parent process is attached to. | 268 | * the corresponding VMA in the parent process is attached to. |
319 | * Returns 0 on success, non-zero on failure. | 269 | * Returns 0 on success, non-zero on failure. |
@@ -381,13 +331,13 @@ void unlink_anon_vmas(struct vm_area_struct *vma) | |||
381 | struct anon_vma *anon_vma = avc->anon_vma; | 331 | struct anon_vma *anon_vma = avc->anon_vma; |
382 | 332 | ||
383 | root = lock_anon_vma_root(root, anon_vma); | 333 | root = lock_anon_vma_root(root, anon_vma); |
384 | list_del(&avc->same_anon_vma); | 334 | anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); |
385 | 335 | ||
386 | /* | 336 | /* |
387 | * Leave empty anon_vmas on the list - we'll need | 337 | * Leave empty anon_vmas on the list - we'll need |
388 | * to free them outside the lock. | 338 | * to free them outside the lock. |
389 | */ | 339 | */ |
390 | if (list_empty(&anon_vma->head)) | 340 | if (RB_EMPTY_ROOT(&anon_vma->rb_root)) |
391 | continue; | 341 | continue; |
392 | 342 | ||
393 | list_del(&avc->same_vma); | 343 | list_del(&avc->same_vma); |
@@ -416,7 +366,7 @@ static void anon_vma_ctor(void *data) | |||
416 | 366 | ||
417 | mutex_init(&anon_vma->mutex); | 367 | mutex_init(&anon_vma->mutex); |
418 | atomic_set(&anon_vma->refcount, 0); | 368 | atomic_set(&anon_vma->refcount, 0); |
419 | INIT_LIST_HEAD(&anon_vma->head); | 369 | anon_vma->rb_root = RB_ROOT; |
420 | } | 370 | } |
421 | 371 | ||
422 | void __init anon_vma_init(void) | 372 | void __init anon_vma_init(void) |
@@ -560,22 +510,26 @@ void page_unlock_anon_vma(struct anon_vma *anon_vma) | |||
560 | 510 | ||
561 | /* | 511 | /* |
562 | * At what user virtual address is page expected in @vma? | 512 | * At what user virtual address is page expected in @vma? |
563 | * Returns virtual address or -EFAULT if page's index/offset is not | ||
564 | * within the range mapped the @vma. | ||
565 | */ | 513 | */ |
566 | inline unsigned long | 514 | static inline unsigned long |
567 | vma_address(struct page *page, struct vm_area_struct *vma) | 515 | __vma_address(struct page *page, struct vm_area_struct *vma) |
568 | { | 516 | { |
569 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 517 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
570 | unsigned long address; | ||
571 | 518 | ||
572 | if (unlikely(is_vm_hugetlb_page(vma))) | 519 | if (unlikely(is_vm_hugetlb_page(vma))) |
573 | pgoff = page->index << huge_page_order(page_hstate(page)); | 520 | pgoff = page->index << huge_page_order(page_hstate(page)); |
574 | address = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | 521 | |
575 | if (unlikely(address < vma->vm_start || address >= vma->vm_end)) { | 522 | return vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); |
576 | /* page should be within @vma mapping range */ | 523 | } |
577 | return -EFAULT; | 524 | |
578 | } | 525 | inline unsigned long |
526 | vma_address(struct page *page, struct vm_area_struct *vma) | ||
527 | { | ||
528 | unsigned long address = __vma_address(page, vma); | ||
529 | |||
530 | /* page should be within @vma mapping range */ | ||
531 | VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); | ||
532 | |||
579 | return address; | 533 | return address; |
580 | } | 534 | } |
581 | 535 | ||
@@ -585,6 +539,7 @@ vma_address(struct page *page, struct vm_area_struct *vma) | |||
585 | */ | 539 | */ |
586 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | 540 | unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) |
587 | { | 541 | { |
542 | unsigned long address; | ||
588 | if (PageAnon(page)) { | 543 | if (PageAnon(page)) { |
589 | struct anon_vma *page__anon_vma = page_anon_vma(page); | 544 | struct anon_vma *page__anon_vma = page_anon_vma(page); |
590 | /* | 545 | /* |
@@ -600,7 +555,10 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | |||
600 | return -EFAULT; | 555 | return -EFAULT; |
601 | } else | 556 | } else |
602 | return -EFAULT; | 557 | return -EFAULT; |
603 | return vma_address(page, vma); | 558 | address = __vma_address(page, vma); |
559 | if (unlikely(address < vma->vm_start || address >= vma->vm_end)) | ||
560 | return -EFAULT; | ||
561 | return address; | ||
604 | } | 562 | } |
605 | 563 | ||
606 | /* | 564 | /* |
@@ -674,8 +632,8 @@ int page_mapped_in_vma(struct page *page, struct vm_area_struct *vma) | |||
674 | pte_t *pte; | 632 | pte_t *pte; |
675 | spinlock_t *ptl; | 633 | spinlock_t *ptl; |
676 | 634 | ||
677 | address = vma_address(page, vma); | 635 | address = __vma_address(page, vma); |
678 | if (address == -EFAULT) /* out of vma range */ | 636 | if (unlikely(address < vma->vm_start || address >= vma->vm_end)) |
679 | return 0; | 637 | return 0; |
680 | pte = page_check_address(page, vma->vm_mm, address, &ptl, 1); | 638 | pte = page_check_address(page, vma->vm_mm, address, &ptl, 1); |
681 | if (!pte) /* the page is not in this mm */ | 639 | if (!pte) /* the page is not in this mm */ |
@@ -769,6 +727,7 @@ static int page_referenced_anon(struct page *page, | |||
769 | { | 727 | { |
770 | unsigned int mapcount; | 728 | unsigned int mapcount; |
771 | struct anon_vma *anon_vma; | 729 | struct anon_vma *anon_vma; |
730 | pgoff_t pgoff; | ||
772 | struct anon_vma_chain *avc; | 731 | struct anon_vma_chain *avc; |
773 | int referenced = 0; | 732 | int referenced = 0; |
774 | 733 | ||
@@ -777,11 +736,10 @@ static int page_referenced_anon(struct page *page, | |||
777 | return referenced; | 736 | return referenced; |
778 | 737 | ||
779 | mapcount = page_mapcount(page); | 738 | mapcount = page_mapcount(page); |
780 | list_for_each_entry(avc, &anon_vma->head, same_anon_vma) { | 739 | pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
740 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { | ||
781 | struct vm_area_struct *vma = avc->vma; | 741 | struct vm_area_struct *vma = avc->vma; |
782 | unsigned long address = vma_address(page, vma); | 742 | unsigned long address = vma_address(page, vma); |
783 | if (address == -EFAULT) | ||
784 | continue; | ||
785 | /* | 743 | /* |
786 | * If we are reclaiming on behalf of a cgroup, skip | 744 | * If we are reclaiming on behalf of a cgroup, skip |
787 | * counting on behalf of references from different | 745 | * counting on behalf of references from different |
@@ -820,7 +778,6 @@ static int page_referenced_file(struct page *page, | |||
820 | struct address_space *mapping = page->mapping; | 778 | struct address_space *mapping = page->mapping; |
821 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 779 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
822 | struct vm_area_struct *vma; | 780 | struct vm_area_struct *vma; |
823 | struct prio_tree_iter iter; | ||
824 | int referenced = 0; | 781 | int referenced = 0; |
825 | 782 | ||
826 | /* | 783 | /* |
@@ -846,10 +803,8 @@ static int page_referenced_file(struct page *page, | |||
846 | */ | 803 | */ |
847 | mapcount = page_mapcount(page); | 804 | mapcount = page_mapcount(page); |
848 | 805 | ||
849 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 806 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
850 | unsigned long address = vma_address(page, vma); | 807 | unsigned long address = vma_address(page, vma); |
851 | if (address == -EFAULT) | ||
852 | continue; | ||
853 | /* | 808 | /* |
854 | * If we are reclaiming on behalf of a cgroup, skip | 809 | * If we are reclaiming on behalf of a cgroup, skip |
855 | * counting on behalf of references from different | 810 | * counting on behalf of references from different |
@@ -929,7 +884,7 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma, | |||
929 | pte_t entry; | 884 | pte_t entry; |
930 | 885 | ||
931 | flush_cache_page(vma, address, pte_pfn(*pte)); | 886 | flush_cache_page(vma, address, pte_pfn(*pte)); |
932 | entry = ptep_clear_flush_notify(vma, address, pte); | 887 | entry = ptep_clear_flush(vma, address, pte); |
933 | entry = pte_wrprotect(entry); | 888 | entry = pte_wrprotect(entry); |
934 | entry = pte_mkclean(entry); | 889 | entry = pte_mkclean(entry); |
935 | set_pte_at(mm, address, pte, entry); | 890 | set_pte_at(mm, address, pte, entry); |
@@ -937,6 +892,9 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma, | |||
937 | } | 892 | } |
938 | 893 | ||
939 | pte_unmap_unlock(pte, ptl); | 894 | pte_unmap_unlock(pte, ptl); |
895 | |||
896 | if (ret) | ||
897 | mmu_notifier_invalidate_page(mm, address); | ||
940 | out: | 898 | out: |
941 | return ret; | 899 | return ret; |
942 | } | 900 | } |
@@ -945,17 +903,14 @@ static int page_mkclean_file(struct address_space *mapping, struct page *page) | |||
945 | { | 903 | { |
946 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 904 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
947 | struct vm_area_struct *vma; | 905 | struct vm_area_struct *vma; |
948 | struct prio_tree_iter iter; | ||
949 | int ret = 0; | 906 | int ret = 0; |
950 | 907 | ||
951 | BUG_ON(PageAnon(page)); | 908 | BUG_ON(PageAnon(page)); |
952 | 909 | ||
953 | mutex_lock(&mapping->i_mmap_mutex); | 910 | mutex_lock(&mapping->i_mmap_mutex); |
954 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 911 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
955 | if (vma->vm_flags & VM_SHARED) { | 912 | if (vma->vm_flags & VM_SHARED) { |
956 | unsigned long address = vma_address(page, vma); | 913 | unsigned long address = vma_address(page, vma); |
957 | if (address == -EFAULT) | ||
958 | continue; | ||
959 | ret += page_mkclean_one(page, vma, address); | 914 | ret += page_mkclean_one(page, vma, address); |
960 | } | 915 | } |
961 | } | 916 | } |
@@ -1128,7 +1083,7 @@ void page_add_new_anon_rmap(struct page *page, | |||
1128 | else | 1083 | else |
1129 | __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); | 1084 | __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); |
1130 | __page_set_anon_rmap(page, vma, address, 1); | 1085 | __page_set_anon_rmap(page, vma, address, 1); |
1131 | if (page_evictable(page, vma)) | 1086 | if (!mlocked_vma_newpage(vma, page)) |
1132 | lru_cache_add_lru(page, LRU_ACTIVE_ANON); | 1087 | lru_cache_add_lru(page, LRU_ACTIVE_ANON); |
1133 | else | 1088 | else |
1134 | add_page_to_unevictable_list(page); | 1089 | add_page_to_unevictable_list(page); |
@@ -1203,7 +1158,10 @@ void page_remove_rmap(struct page *page) | |||
1203 | } else { | 1158 | } else { |
1204 | __dec_zone_page_state(page, NR_FILE_MAPPED); | 1159 | __dec_zone_page_state(page, NR_FILE_MAPPED); |
1205 | mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_MAPPED); | 1160 | mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_MAPPED); |
1161 | mem_cgroup_end_update_page_stat(page, &locked, &flags); | ||
1206 | } | 1162 | } |
1163 | if (unlikely(PageMlocked(page))) | ||
1164 | clear_page_mlock(page); | ||
1207 | /* | 1165 | /* |
1208 | * It would be tidy to reset the PageAnon mapping here, | 1166 | * It would be tidy to reset the PageAnon mapping here, |
1209 | * but that might overwrite a racing page_add_anon_rmap | 1167 | * but that might overwrite a racing page_add_anon_rmap |
@@ -1213,6 +1171,7 @@ void page_remove_rmap(struct page *page) | |||
1213 | * Leaving it set also helps swapoff to reinstate ptes | 1171 | * Leaving it set also helps swapoff to reinstate ptes |
1214 | * faster for those pages still in swapcache. | 1172 | * faster for those pages still in swapcache. |
1215 | */ | 1173 | */ |
1174 | return; | ||
1216 | out: | 1175 | out: |
1217 | if (!anon) | 1176 | if (!anon) |
1218 | mem_cgroup_end_update_page_stat(page, &locked, &flags); | 1177 | mem_cgroup_end_update_page_stat(page, &locked, &flags); |
@@ -1256,7 +1215,7 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
1256 | 1215 | ||
1257 | /* Nuke the page table entry. */ | 1216 | /* Nuke the page table entry. */ |
1258 | flush_cache_page(vma, address, page_to_pfn(page)); | 1217 | flush_cache_page(vma, address, page_to_pfn(page)); |
1259 | pteval = ptep_clear_flush_notify(vma, address, pte); | 1218 | pteval = ptep_clear_flush(vma, address, pte); |
1260 | 1219 | ||
1261 | /* Move the dirty bit to the physical page now the pte is gone. */ | 1220 | /* Move the dirty bit to the physical page now the pte is gone. */ |
1262 | if (pte_dirty(pteval)) | 1221 | if (pte_dirty(pteval)) |
@@ -1318,6 +1277,8 @@ int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
1318 | 1277 | ||
1319 | out_unmap: | 1278 | out_unmap: |
1320 | pte_unmap_unlock(pte, ptl); | 1279 | pte_unmap_unlock(pte, ptl); |
1280 | if (ret != SWAP_FAIL) | ||
1281 | mmu_notifier_invalidate_page(mm, address); | ||
1321 | out: | 1282 | out: |
1322 | return ret; | 1283 | return ret; |
1323 | 1284 | ||
@@ -1382,6 +1343,8 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1382 | spinlock_t *ptl; | 1343 | spinlock_t *ptl; |
1383 | struct page *page; | 1344 | struct page *page; |
1384 | unsigned long address; | 1345 | unsigned long address; |
1346 | unsigned long mmun_start; /* For mmu_notifiers */ | ||
1347 | unsigned long mmun_end; /* For mmu_notifiers */ | ||
1385 | unsigned long end; | 1348 | unsigned long end; |
1386 | int ret = SWAP_AGAIN; | 1349 | int ret = SWAP_AGAIN; |
1387 | int locked_vma = 0; | 1350 | int locked_vma = 0; |
@@ -1405,6 +1368,10 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1405 | if (!pmd_present(*pmd)) | 1368 | if (!pmd_present(*pmd)) |
1406 | return ret; | 1369 | return ret; |
1407 | 1370 | ||
1371 | mmun_start = address; | ||
1372 | mmun_end = end; | ||
1373 | mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); | ||
1374 | |||
1408 | /* | 1375 | /* |
1409 | * If we can acquire the mmap_sem for read, and vma is VM_LOCKED, | 1376 | * If we can acquire the mmap_sem for read, and vma is VM_LOCKED, |
1410 | * keep the sem while scanning the cluster for mlocking pages. | 1377 | * keep the sem while scanning the cluster for mlocking pages. |
@@ -1438,7 +1405,7 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1438 | 1405 | ||
1439 | /* Nuke the page table entry. */ | 1406 | /* Nuke the page table entry. */ |
1440 | flush_cache_page(vma, address, pte_pfn(*pte)); | 1407 | flush_cache_page(vma, address, pte_pfn(*pte)); |
1441 | pteval = ptep_clear_flush_notify(vma, address, pte); | 1408 | pteval = ptep_clear_flush(vma, address, pte); |
1442 | 1409 | ||
1443 | /* If nonlinear, store the file page offset in the pte. */ | 1410 | /* If nonlinear, store the file page offset in the pte. */ |
1444 | if (page->index != linear_page_index(vma, address)) | 1411 | if (page->index != linear_page_index(vma, address)) |
@@ -1454,6 +1421,7 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1454 | (*mapcount)--; | 1421 | (*mapcount)--; |
1455 | } | 1422 | } |
1456 | pte_unmap_unlock(pte - 1, ptl); | 1423 | pte_unmap_unlock(pte - 1, ptl); |
1424 | mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); | ||
1457 | if (locked_vma) | 1425 | if (locked_vma) |
1458 | up_read(&vma->vm_mm->mmap_sem); | 1426 | up_read(&vma->vm_mm->mmap_sem); |
1459 | return ret; | 1427 | return ret; |
@@ -1492,6 +1460,7 @@ bool is_vma_temporary_stack(struct vm_area_struct *vma) | |||
1492 | static int try_to_unmap_anon(struct page *page, enum ttu_flags flags) | 1460 | static int try_to_unmap_anon(struct page *page, enum ttu_flags flags) |
1493 | { | 1461 | { |
1494 | struct anon_vma *anon_vma; | 1462 | struct anon_vma *anon_vma; |
1463 | pgoff_t pgoff; | ||
1495 | struct anon_vma_chain *avc; | 1464 | struct anon_vma_chain *avc; |
1496 | int ret = SWAP_AGAIN; | 1465 | int ret = SWAP_AGAIN; |
1497 | 1466 | ||
@@ -1499,7 +1468,8 @@ static int try_to_unmap_anon(struct page *page, enum ttu_flags flags) | |||
1499 | if (!anon_vma) | 1468 | if (!anon_vma) |
1500 | return ret; | 1469 | return ret; |
1501 | 1470 | ||
1502 | list_for_each_entry(avc, &anon_vma->head, same_anon_vma) { | 1471 | pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
1472 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { | ||
1503 | struct vm_area_struct *vma = avc->vma; | 1473 | struct vm_area_struct *vma = avc->vma; |
1504 | unsigned long address; | 1474 | unsigned long address; |
1505 | 1475 | ||
@@ -1516,8 +1486,6 @@ static int try_to_unmap_anon(struct page *page, enum ttu_flags flags) | |||
1516 | continue; | 1486 | continue; |
1517 | 1487 | ||
1518 | address = vma_address(page, vma); | 1488 | address = vma_address(page, vma); |
1519 | if (address == -EFAULT) | ||
1520 | continue; | ||
1521 | ret = try_to_unmap_one(page, vma, address, flags); | 1489 | ret = try_to_unmap_one(page, vma, address, flags); |
1522 | if (ret != SWAP_AGAIN || !page_mapped(page)) | 1490 | if (ret != SWAP_AGAIN || !page_mapped(page)) |
1523 | break; | 1491 | break; |
@@ -1547,7 +1515,6 @@ static int try_to_unmap_file(struct page *page, enum ttu_flags flags) | |||
1547 | struct address_space *mapping = page->mapping; | 1515 | struct address_space *mapping = page->mapping; |
1548 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 1516 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
1549 | struct vm_area_struct *vma; | 1517 | struct vm_area_struct *vma; |
1550 | struct prio_tree_iter iter; | ||
1551 | int ret = SWAP_AGAIN; | 1518 | int ret = SWAP_AGAIN; |
1552 | unsigned long cursor; | 1519 | unsigned long cursor; |
1553 | unsigned long max_nl_cursor = 0; | 1520 | unsigned long max_nl_cursor = 0; |
@@ -1555,10 +1522,8 @@ static int try_to_unmap_file(struct page *page, enum ttu_flags flags) | |||
1555 | unsigned int mapcount; | 1522 | unsigned int mapcount; |
1556 | 1523 | ||
1557 | mutex_lock(&mapping->i_mmap_mutex); | 1524 | mutex_lock(&mapping->i_mmap_mutex); |
1558 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 1525 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
1559 | unsigned long address = vma_address(page, vma); | 1526 | unsigned long address = vma_address(page, vma); |
1560 | if (address == -EFAULT) | ||
1561 | continue; | ||
1562 | ret = try_to_unmap_one(page, vma, address, flags); | 1527 | ret = try_to_unmap_one(page, vma, address, flags); |
1563 | if (ret != SWAP_AGAIN || !page_mapped(page)) | 1528 | if (ret != SWAP_AGAIN || !page_mapped(page)) |
1564 | goto out; | 1529 | goto out; |
@@ -1576,7 +1541,7 @@ static int try_to_unmap_file(struct page *page, enum ttu_flags flags) | |||
1576 | goto out; | 1541 | goto out; |
1577 | 1542 | ||
1578 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, | 1543 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, |
1579 | shared.vm_set.list) { | 1544 | shared.nonlinear) { |
1580 | cursor = (unsigned long) vma->vm_private_data; | 1545 | cursor = (unsigned long) vma->vm_private_data; |
1581 | if (cursor > max_nl_cursor) | 1546 | if (cursor > max_nl_cursor) |
1582 | max_nl_cursor = cursor; | 1547 | max_nl_cursor = cursor; |
@@ -1608,7 +1573,7 @@ static int try_to_unmap_file(struct page *page, enum ttu_flags flags) | |||
1608 | 1573 | ||
1609 | do { | 1574 | do { |
1610 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, | 1575 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, |
1611 | shared.vm_set.list) { | 1576 | shared.nonlinear) { |
1612 | cursor = (unsigned long) vma->vm_private_data; | 1577 | cursor = (unsigned long) vma->vm_private_data; |
1613 | while ( cursor < max_nl_cursor && | 1578 | while ( cursor < max_nl_cursor && |
1614 | cursor < vma->vm_end - vma->vm_start) { | 1579 | cursor < vma->vm_end - vma->vm_start) { |
@@ -1631,7 +1596,7 @@ static int try_to_unmap_file(struct page *page, enum ttu_flags flags) | |||
1631 | * in locked vmas). Reset cursor on all unreserved nonlinear | 1596 | * in locked vmas). Reset cursor on all unreserved nonlinear |
1632 | * vmas, now forgetting on which ones it had fallen behind. | 1597 | * vmas, now forgetting on which ones it had fallen behind. |
1633 | */ | 1598 | */ |
1634 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.vm_set.list) | 1599 | list_for_each_entry(vma, &mapping->i_mmap_nonlinear, shared.nonlinear) |
1635 | vma->vm_private_data = NULL; | 1600 | vma->vm_private_data = NULL; |
1636 | out: | 1601 | out: |
1637 | mutex_unlock(&mapping->i_mmap_mutex); | 1602 | mutex_unlock(&mapping->i_mmap_mutex); |
@@ -1716,6 +1681,7 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, | |||
1716 | struct vm_area_struct *, unsigned long, void *), void *arg) | 1681 | struct vm_area_struct *, unsigned long, void *), void *arg) |
1717 | { | 1682 | { |
1718 | struct anon_vma *anon_vma; | 1683 | struct anon_vma *anon_vma; |
1684 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | ||
1719 | struct anon_vma_chain *avc; | 1685 | struct anon_vma_chain *avc; |
1720 | int ret = SWAP_AGAIN; | 1686 | int ret = SWAP_AGAIN; |
1721 | 1687 | ||
@@ -1729,11 +1695,9 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, | |||
1729 | if (!anon_vma) | 1695 | if (!anon_vma) |
1730 | return ret; | 1696 | return ret; |
1731 | anon_vma_lock(anon_vma); | 1697 | anon_vma_lock(anon_vma); |
1732 | list_for_each_entry(avc, &anon_vma->head, same_anon_vma) { | 1698 | anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { |
1733 | struct vm_area_struct *vma = avc->vma; | 1699 | struct vm_area_struct *vma = avc->vma; |
1734 | unsigned long address = vma_address(page, vma); | 1700 | unsigned long address = vma_address(page, vma); |
1735 | if (address == -EFAULT) | ||
1736 | continue; | ||
1737 | ret = rmap_one(page, vma, address, arg); | 1701 | ret = rmap_one(page, vma, address, arg); |
1738 | if (ret != SWAP_AGAIN) | 1702 | if (ret != SWAP_AGAIN) |
1739 | break; | 1703 | break; |
@@ -1748,16 +1712,13 @@ static int rmap_walk_file(struct page *page, int (*rmap_one)(struct page *, | |||
1748 | struct address_space *mapping = page->mapping; | 1712 | struct address_space *mapping = page->mapping; |
1749 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); | 1713 | pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); |
1750 | struct vm_area_struct *vma; | 1714 | struct vm_area_struct *vma; |
1751 | struct prio_tree_iter iter; | ||
1752 | int ret = SWAP_AGAIN; | 1715 | int ret = SWAP_AGAIN; |
1753 | 1716 | ||
1754 | if (!mapping) | 1717 | if (!mapping) |
1755 | return ret; | 1718 | return ret; |
1756 | mutex_lock(&mapping->i_mmap_mutex); | 1719 | mutex_lock(&mapping->i_mmap_mutex); |
1757 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 1720 | vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) { |
1758 | unsigned long address = vma_address(page, vma); | 1721 | unsigned long address = vma_address(page, vma); |
1759 | if (address == -EFAULT) | ||
1760 | continue; | ||
1761 | ret = rmap_one(page, vma, address, arg); | 1722 | ret = rmap_one(page, vma, address, arg); |
1762 | if (ret != SWAP_AGAIN) | 1723 | if (ret != SWAP_AGAIN) |
1763 | break; | 1724 | break; |