1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/migrate.h>
17#include <linux/export.h>
18#include <linux/swap.h>
19#include <linux/swapops.h>
20#include <linux/pagemap.h>
21#include <linux/buffer_head.h>
22#include <linux/mm_inline.h>
23#include <linux/nsproxy.h>
24#include <linux/pagevec.h>
25#include <linux/ksm.h>
26#include <linux/rmap.h>
27#include <linux/topology.h>
28#include <linux/cpu.h>
29#include <linux/cpuset.h>
30#include <linux/writeback.h>
31#include <linux/mempolicy.h>
32#include <linux/vmalloc.h>
33#include <linux/security.h>
34#include <linux/backing-dev.h>
35#include <linux/compaction.h>
36#include <linux/syscalls.h>
37#include <linux/compat.h>
38#include <linux/hugetlb.h>
39#include <linux/hugetlb_cgroup.h>
40#include <linux/gfp.h>
41#include <linux/pagewalk.h>
42#include <linux/pfn_t.h>
43#include <linux/memremap.h>
44#include <linux/userfaultfd_k.h>
45#include <linux/balloon_compaction.h>
46#include <linux/mmu_notifier.h>
47#include <linux/page_idle.h>
48#include <linux/page_owner.h>
49#include <linux/sched/mm.h>
50#include <linux/ptrace.h>
51#include <linux/oom.h>
52
53#include <asm/tlbflush.h>
54
55#define CREATE_TRACE_POINTS
56#include <trace/events/migrate.h>
57
58#include "internal.h"
59
60
61
62
63
64
65int migrate_prep(void)
66{
67
68
69
70
71
72
73 lru_add_drain_all();
74
75 return 0;
76}
77
78
79int migrate_prep_local(void)
80{
81 lru_add_drain();
82
83 return 0;
84}
85
86int isolate_movable_page(struct page *page, isolate_mode_t mode)
87{
88 struct address_space *mapping;
89
90
91
92
93
94
95
96
97
98
99 if (unlikely(!get_page_unless_zero(page)))
100 goto out;
101
102
103
104
105
106
107 if (unlikely(!__PageMovable(page)))
108 goto out_putpage;
109
110
111
112
113
114
115
116
117
118
119
120 if (unlikely(!trylock_page(page)))
121 goto out_putpage;
122
123 if (!PageMovable(page) || PageIsolated(page))
124 goto out_no_isolated;
125
126 mapping = page_mapping(page);
127 VM_BUG_ON_PAGE(!mapping, page);
128
129 if (!mapping->a_ops->isolate_page(page, mode))
130 goto out_no_isolated;
131
132
133 WARN_ON_ONCE(PageIsolated(page));
134 __SetPageIsolated(page);
135 unlock_page(page);
136
137 return 0;
138
139out_no_isolated:
140 unlock_page(page);
141out_putpage:
142 put_page(page);
143out:
144 return -EBUSY;
145}
146
147
148void putback_movable_page(struct page *page)
149{
150 struct address_space *mapping;
151
152 VM_BUG_ON_PAGE(!PageLocked(page), page);
153 VM_BUG_ON_PAGE(!PageMovable(page), page);
154 VM_BUG_ON_PAGE(!PageIsolated(page), page);
155
156 mapping = page_mapping(page);
157 mapping->a_ops->putback_page(page);
158 __ClearPageIsolated(page);
159}
160
161
162
163
164
165
166
167
168
169void putback_movable_pages(struct list_head *l)
170{
171 struct page *page;
172 struct page *page2;
173
174 list_for_each_entry_safe(page, page2, l, lru) {
175 if (unlikely(PageHuge(page))) {
176 putback_active_hugepage(page);
177 continue;
178 }
179 list_del(&page->lru);
180
181
182
183
184
185 if (unlikely(__PageMovable(page))) {
186 VM_BUG_ON_PAGE(!PageIsolated(page), page);
187 lock_page(page);
188 if (PageMovable(page))
189 putback_movable_page(page);
190 else
191 __ClearPageIsolated(page);
192 unlock_page(page);
193 put_page(page);
194 } else {
195 mod_node_page_state(page_pgdat(page), NR_ISOLATED_ANON +
196 page_is_file_lru(page), -hpage_nr_pages(page));
197 putback_lru_page(page);
198 }
199 }
200}
201
202
203
204
205static bool remove_migration_pte(struct page *page, struct vm_area_struct *vma,
206 unsigned long addr, void *old)
207{
208 struct page_vma_mapped_walk pvmw = {
209 .page = old,
210 .vma = vma,
211 .address = addr,
212 .flags = PVMW_SYNC | PVMW_MIGRATION,
213 };
214 struct page *new;
215 pte_t pte;
216 swp_entry_t entry;
217
218 VM_BUG_ON_PAGE(PageTail(page), page);
219 while (page_vma_mapped_walk(&pvmw)) {
220 if (PageKsm(page))
221 new = page;
222 else
223 new = page - pvmw.page->index +
224 linear_page_index(vma, pvmw.address);
225
226#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
227
228 if (!pvmw.pte) {
229 VM_BUG_ON_PAGE(PageHuge(page) || !PageTransCompound(page), page);
230 remove_migration_pmd(&pvmw, new);
231 continue;
232 }
233#endif
234
235 get_page(new);
236 pte = pte_mkold(mk_pte(new, READ_ONCE(vma->vm_page_prot)));
237 if (pte_swp_soft_dirty(*pvmw.pte))
238 pte = pte_mksoft_dirty(pte);
239
240
241
242
243 entry = pte_to_swp_entry(*pvmw.pte);
244 if (is_write_migration_entry(entry))
245 pte = maybe_mkwrite(pte, vma);
246 else if (pte_swp_uffd_wp(*pvmw.pte))
247 pte = pte_mkuffd_wp(pte);
248
249 if (unlikely(is_zone_device_page(new))) {
250 if (is_device_private_page(new)) {
251 entry = make_device_private_entry(new, pte_write(pte));
252 pte = swp_entry_to_pte(entry);
253 if (pte_swp_uffd_wp(*pvmw.pte))
254 pte = pte_mkuffd_wp(pte);
255 }
256 }
257
258#ifdef CONFIG_HUGETLB_PAGE
259 if (PageHuge(new)) {
260 pte = pte_mkhuge(pte);
261 pte = arch_make_huge_pte(pte, vma, new, 0);
262 set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte);
263 if (PageAnon(new))
264 hugepage_add_anon_rmap(new, vma, pvmw.address);
265 else
266 page_dup_rmap(new, true);
267 } else
268#endif
269 {
270 set_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte);
271
272 if (PageAnon(new))
273 page_add_anon_rmap(new, vma, pvmw.address, false);
274 else
275 page_add_file_rmap(new, false);
276 }
277 if (vma->vm_flags & VM_LOCKED && !PageTransCompound(new))
278 mlock_vma_page(new);
279
280 if (PageTransHuge(page) && PageMlocked(page))
281 clear_page_mlock(page);
282
283
284 update_mmu_cache(vma, pvmw.address, pvmw.pte);
285 }
286
287 return true;
288}
289
290
291
292
293
294void remove_migration_ptes(struct page *old, struct page *new, bool locked)
295{
296 struct rmap_walk_control rwc = {
297 .rmap_one = remove_migration_pte,
298 .arg = old,
299 };
300
301 if (locked)
302 rmap_walk_locked(new, &rwc);
303 else
304 rmap_walk(new, &rwc);
305}
306
307
308
309
310
311
312void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep,
313 spinlock_t *ptl)
314{
315 pte_t pte;
316 swp_entry_t entry;
317 struct page *page;
318
319 spin_lock(ptl);
320 pte = *ptep;
321 if (!is_swap_pte(pte))
322 goto out;
323
324 entry = pte_to_swp_entry(pte);
325 if (!is_migration_entry(entry))
326 goto out;
327
328 page = migration_entry_to_page(entry);
329
330
331
332
333
334
335 if (!get_page_unless_zero(page))
336 goto out;
337 pte_unmap_unlock(ptep, ptl);
338 put_and_wait_on_page_locked(page);
339 return;
340out:
341 pte_unmap_unlock(ptep, ptl);
342}
343
344void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd,
345 unsigned long address)
346{
347 spinlock_t *ptl = pte_lockptr(mm, pmd);
348 pte_t *ptep = pte_offset_map(pmd, address);
349 __migration_entry_wait(mm, ptep, ptl);
350}
351
352void migration_entry_wait_huge(struct vm_area_struct *vma,
353 struct mm_struct *mm, pte_t *pte)
354{
355 spinlock_t *ptl = huge_pte_lockptr(hstate_vma(vma), mm, pte);
356 __migration_entry_wait(mm, pte, ptl);
357}
358
359#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
360void pmd_migration_entry_wait(struct mm_struct *mm, pmd_t *pmd)
361{
362 spinlock_t *ptl;
363 struct page *page;
364
365 ptl = pmd_lock(mm, pmd);
366 if (!is_pmd_migration_entry(*pmd))
367 goto unlock;
368 page = migration_entry_to_page(pmd_to_swp_entry(*pmd));
369 if (!get_page_unless_zero(page))
370 goto unlock;
371 spin_unlock(ptl);
372 put_and_wait_on_page_locked(page);
373 return;
374unlock:
375 spin_unlock(ptl);
376}
377#endif
378
379static int expected_page_refs(struct address_space *mapping, struct page *page)
380{
381 int expected_count = 1;
382
383
384
385
386
387 expected_count += is_device_private_page(page);
388 if (mapping)
389 expected_count += hpage_nr_pages(page) + page_has_private(page);
390
391 return expected_count;
392}
393
394
395
396
397
398
399
400
401
402int migrate_page_move_mapping(struct address_space *mapping,
403 struct page *newpage, struct page *page, int extra_count)
404{
405 XA_STATE(xas, &mapping->i_pages, page_index(page));
406 struct zone *oldzone, *newzone;
407 int dirty;
408 int expected_count = expected_page_refs(mapping, page) + extra_count;
409
410 if (!mapping) {
411
412 if (page_count(page) != expected_count)
413 return -EAGAIN;
414
415
416 newpage->index = page->index;
417 newpage->mapping = page->mapping;
418 if (PageSwapBacked(page))
419 __SetPageSwapBacked(newpage);
420
421 return MIGRATEPAGE_SUCCESS;
422 }
423
424 oldzone = page_zone(page);
425 newzone = page_zone(newpage);
426
427 xas_lock_irq(&xas);
428 if (page_count(page) != expected_count || xas_load(&xas) != page) {
429 xas_unlock_irq(&xas);
430 return -EAGAIN;
431 }
432
433 if (!page_ref_freeze(page, expected_count)) {
434 xas_unlock_irq(&xas);
435 return -EAGAIN;
436 }
437
438
439
440
441
442 newpage->index = page->index;
443 newpage->mapping = page->mapping;
444 page_ref_add(newpage, hpage_nr_pages(page));
445 if (PageSwapBacked(page)) {
446 __SetPageSwapBacked(newpage);
447 if (PageSwapCache(page)) {
448 SetPageSwapCache(newpage);
449 set_page_private(newpage, page_private(page));
450 }
451 } else {
452 VM_BUG_ON_PAGE(PageSwapCache(page), page);
453 }
454
455
456 dirty = PageDirty(page);
457 if (dirty) {
458 ClearPageDirty(page);
459 SetPageDirty(newpage);
460 }
461
462 xas_store(&xas, newpage);
463 if (PageTransHuge(page)) {
464 int i;
465
466 for (i = 1; i < HPAGE_PMD_NR; i++) {
467 xas_next(&xas);
468 xas_store(&xas, newpage);
469 }
470 }
471
472
473
474
475
476
477 page_ref_unfreeze(page, expected_count - hpage_nr_pages(page));
478
479 xas_unlock(&xas);
480
481
482
483
484
485
486
487
488
489
490
491
492 if (newzone != oldzone) {
493 struct lruvec *old_lruvec, *new_lruvec;
494 struct mem_cgroup *memcg;
495
496 memcg = page_memcg(page);
497 old_lruvec = mem_cgroup_lruvec(memcg, oldzone->zone_pgdat);
498 new_lruvec = mem_cgroup_lruvec(memcg, newzone->zone_pgdat);
499
500 __dec_lruvec_state(old_lruvec, NR_FILE_PAGES);
501 __inc_lruvec_state(new_lruvec, NR_FILE_PAGES);
502 if (PageSwapBacked(page) && !PageSwapCache(page)) {
503 __dec_lruvec_state(old_lruvec, NR_SHMEM);
504 __inc_lruvec_state(new_lruvec, NR_SHMEM);
505 }
506 if (dirty && mapping_cap_account_dirty(mapping)) {
507 __dec_node_state(oldzone->zone_pgdat, NR_FILE_DIRTY);
508 __dec_zone_state(oldzone, NR_ZONE_WRITE_PENDING);
509 __inc_node_state(newzone->zone_pgdat, NR_FILE_DIRTY);
510 __inc_zone_state(newzone, NR_ZONE_WRITE_PENDING);
511 }
512 }
513 local_irq_enable();
514
515 return MIGRATEPAGE_SUCCESS;
516}
517EXPORT_SYMBOL(migrate_page_move_mapping);
518
519
520
521
522
523int migrate_huge_page_move_mapping(struct address_space *mapping,
524 struct page *newpage, struct page *page)
525{
526 XA_STATE(xas, &mapping->i_pages, page_index(page));
527 int expected_count;
528
529 xas_lock_irq(&xas);
530 expected_count = 2 + page_has_private(page);
531 if (page_count(page) != expected_count || xas_load(&xas) != page) {
532 xas_unlock_irq(&xas);
533 return -EAGAIN;
534 }
535
536 if (!page_ref_freeze(page, expected_count)) {
537 xas_unlock_irq(&xas);
538 return -EAGAIN;
539 }
540
541 newpage->index = page->index;
542 newpage->mapping = page->mapping;
543
544 get_page(newpage);
545
546 xas_store(&xas, newpage);
547
548 page_ref_unfreeze(page, expected_count - 1);
549
550 xas_unlock_irq(&xas);
551
552 return MIGRATEPAGE_SUCCESS;
553}
554
555
556
557
558
559
560static void __copy_gigantic_page(struct page *dst, struct page *src,
561 int nr_pages)
562{
563 int i;
564 struct page *dst_base = dst;
565 struct page *src_base = src;
566
567 for (i = 0; i < nr_pages; ) {
568 cond_resched();
569 copy_highpage(dst, src);
570
571 i++;
572 dst = mem_map_next(dst, dst_base, i);
573 src = mem_map_next(src, src_base, i);
574 }
575}
576
577static void copy_huge_page(struct page *dst, struct page *src)
578{
579 int i;
580 int nr_pages;
581
582 if (PageHuge(src)) {
583
584 struct hstate *h = page_hstate(src);
585 nr_pages = pages_per_huge_page(h);
586
587 if (unlikely(nr_pages > MAX_ORDER_NR_PAGES)) {
588 __copy_gigantic_page(dst, src, nr_pages);
589 return;
590 }
591 } else {
592
593 BUG_ON(!PageTransHuge(src));
594 nr_pages = hpage_nr_pages(src);
595 }
596
597 for (i = 0; i < nr_pages; i++) {
598 cond_resched();
599 copy_highpage(dst + i, src + i);
600 }
601}
602
603
604
605
606void migrate_page_states(struct page *newpage, struct page *page)
607{
608 int cpupid;
609
610 if (PageError(page))
611 SetPageError(newpage);
612 if (PageReferenced(page))
613 SetPageReferenced(newpage);
614 if (PageUptodate(page))
615 SetPageUptodate(newpage);
616 if (TestClearPageActive(page)) {
617 VM_BUG_ON_PAGE(PageUnevictable(page), page);
618 SetPageActive(newpage);
619 } else if (TestClearPageUnevictable(page))
620 SetPageUnevictable(newpage);
621 if (PageWorkingset(page))
622 SetPageWorkingset(newpage);
623 if (PageChecked(page))
624 SetPageChecked(newpage);
625 if (PageMappedToDisk(page))
626 SetPageMappedToDisk(newpage);
627
628
629 if (PageDirty(page))
630 SetPageDirty(newpage);
631
632 if (page_is_young(page))
633 set_page_young(newpage);
634 if (page_is_idle(page))
635 set_page_idle(newpage);
636
637
638
639
640
641 cpupid = page_cpupid_xchg_last(page, -1);
642 page_cpupid_xchg_last(newpage, cpupid);
643
644 ksm_migrate_page(newpage, page);
645
646
647
648
649 if (PageSwapCache(page))
650 ClearPageSwapCache(page);
651 ClearPagePrivate(page);
652 set_page_private(page, 0);
653
654
655
656
657
658 if (PageWriteback(newpage))
659 end_page_writeback(newpage);
660
661
662
663
664
665
666 if (PageReadahead(page))
667 SetPageReadahead(newpage);
668
669 copy_page_owner(page, newpage);
670
671 mem_cgroup_migrate(page, newpage);
672}
673EXPORT_SYMBOL(migrate_page_states);
674
675void migrate_page_copy(struct page *newpage, struct page *page)
676{
677 if (PageHuge(page) || PageTransHuge(page))
678 copy_huge_page(newpage, page);
679 else
680 copy_highpage(newpage, page);
681
682 migrate_page_states(newpage, page);
683}
684EXPORT_SYMBOL(migrate_page_copy);
685
686
687
688
689
690
691
692
693
694
695
696int migrate_page(struct address_space *mapping,
697 struct page *newpage, struct page *page,
698 enum migrate_mode mode)
699{
700 int rc;
701
702 BUG_ON(PageWriteback(page));
703
704 rc = migrate_page_move_mapping(mapping, newpage, page, 0);
705
706 if (rc != MIGRATEPAGE_SUCCESS)
707 return rc;
708
709 if (mode != MIGRATE_SYNC_NO_COPY)
710 migrate_page_copy(newpage, page);
711 else
712 migrate_page_states(newpage, page);
713 return MIGRATEPAGE_SUCCESS;
714}
715EXPORT_SYMBOL(migrate_page);
716
717#ifdef CONFIG_BLOCK
718
719static bool buffer_migrate_lock_buffers(struct buffer_head *head,
720 enum migrate_mode mode)
721{
722 struct buffer_head *bh = head;
723
724
725 if (mode != MIGRATE_ASYNC) {
726 do {
727 lock_buffer(bh);
728 bh = bh->b_this_page;
729
730 } while (bh != head);
731
732 return true;
733 }
734
735
736 do {
737 if (!trylock_buffer(bh)) {
738
739
740
741
742 struct buffer_head *failed_bh = bh;
743 bh = head;
744 while (bh != failed_bh) {
745 unlock_buffer(bh);
746 bh = bh->b_this_page;
747 }
748 return false;
749 }
750
751 bh = bh->b_this_page;
752 } while (bh != head);
753 return true;
754}
755
756static int __buffer_migrate_page(struct address_space *mapping,
757 struct page *newpage, struct page *page, enum migrate_mode mode,
758 bool check_refs)
759{
760 struct buffer_head *bh, *head;
761 int rc;
762 int expected_count;
763
764 if (!page_has_buffers(page))
765 return migrate_page(mapping, newpage, page, mode);
766
767
768 expected_count = expected_page_refs(mapping, page);
769 if (page_count(page) != expected_count)
770 return -EAGAIN;
771
772 head = page_buffers(page);
773 if (!buffer_migrate_lock_buffers(head, mode))
774 return -EAGAIN;
775
776 if (check_refs) {
777 bool busy;
778 bool invalidated = false;
779
780recheck_buffers:
781 busy = false;
782 spin_lock(&mapping->private_lock);
783 bh = head;
784 do {
785 if (atomic_read(&bh->b_count)) {
786 busy = true;
787 break;
788 }
789 bh = bh->b_this_page;
790 } while (bh != head);
791 if (busy) {
792 if (invalidated) {
793 rc = -EAGAIN;
794 goto unlock_buffers;
795 }
796 spin_unlock(&mapping->private_lock);
797 invalidate_bh_lrus();
798 invalidated = true;
799 goto recheck_buffers;
800 }
801 }
802
803 rc = migrate_page_move_mapping(mapping, newpage, page, 0);
804 if (rc != MIGRATEPAGE_SUCCESS)
805 goto unlock_buffers;
806
807 attach_page_private(newpage, detach_page_private(page));
808
809 bh = head;
810 do {
811 set_bh_page(bh, newpage, bh_offset(bh));
812 bh = bh->b_this_page;
813
814 } while (bh != head);
815
816 if (mode != MIGRATE_SYNC_NO_COPY)
817 migrate_page_copy(newpage, page);
818 else
819 migrate_page_states(newpage, page);
820
821 rc = MIGRATEPAGE_SUCCESS;
822unlock_buffers:
823 if (check_refs)
824 spin_unlock(&mapping->private_lock);
825 bh = head;
826 do {
827 unlock_buffer(bh);
828 bh = bh->b_this_page;
829
830 } while (bh != head);
831
832 return rc;
833}
834
835
836
837
838
839
840int buffer_migrate_page(struct address_space *mapping,
841 struct page *newpage, struct page *page, enum migrate_mode mode)
842{
843 return __buffer_migrate_page(mapping, newpage, page, mode, false);
844}
845EXPORT_SYMBOL(buffer_migrate_page);
846
847
848
849
850
851
852
853int buffer_migrate_page_norefs(struct address_space *mapping,
854 struct page *newpage, struct page *page, enum migrate_mode mode)
855{
856 return __buffer_migrate_page(mapping, newpage, page, mode, true);
857}
858#endif
859
860
861
862
863static int writeout(struct address_space *mapping, struct page *page)
864{
865 struct writeback_control wbc = {
866 .sync_mode = WB_SYNC_NONE,
867 .nr_to_write = 1,
868 .range_start = 0,
869 .range_end = LLONG_MAX,
870 .for_reclaim = 1
871 };
872 int rc;
873
874 if (!mapping->a_ops->writepage)
875
876 return -EINVAL;
877
878 if (!clear_page_dirty_for_io(page))
879
880 return -EAGAIN;
881
882
883
884
885
886
887
888
889
890 remove_migration_ptes(page, page, false);
891
892 rc = mapping->a_ops->writepage(page, &wbc);
893
894 if (rc != AOP_WRITEPAGE_ACTIVATE)
895
896 lock_page(page);
897
898 return (rc < 0) ? -EIO : -EAGAIN;
899}
900
901
902
903
904static int fallback_migrate_page(struct address_space *mapping,
905 struct page *newpage, struct page *page, enum migrate_mode mode)
906{
907 if (PageDirty(page)) {
908
909 switch (mode) {
910 case MIGRATE_SYNC:
911 case MIGRATE_SYNC_NO_COPY:
912 break;
913 default:
914 return -EBUSY;
915 }
916 return writeout(mapping, page);
917 }
918
919
920
921
922
923 if (page_has_private(page) &&
924 !try_to_release_page(page, GFP_KERNEL))
925 return mode == MIGRATE_SYNC ? -EAGAIN : -EBUSY;
926
927 return migrate_page(mapping, newpage, page, mode);
928}
929
930
931
932
933
934
935
936
937
938
939
940
941static int move_to_new_page(struct page *newpage, struct page *page,
942 enum migrate_mode mode)
943{
944 struct address_space *mapping;
945 int rc = -EAGAIN;
946 bool is_lru = !__PageMovable(page);
947
948 VM_BUG_ON_PAGE(!PageLocked(page), page);
949 VM_BUG_ON_PAGE(!PageLocked(newpage), newpage);
950
951 mapping = page_mapping(page);
952
953 if (likely(is_lru)) {
954 if (!mapping)
955 rc = migrate_page(mapping, newpage, page, mode);
956 else if (mapping->a_ops->migratepage)
957
958
959
960
961
962
963
964 rc = mapping->a_ops->migratepage(mapping, newpage,
965 page, mode);
966 else
967 rc = fallback_migrate_page(mapping, newpage,
968 page, mode);
969 } else {
970
971
972
973
974 VM_BUG_ON_PAGE(!PageIsolated(page), page);
975 if (!PageMovable(page)) {
976 rc = MIGRATEPAGE_SUCCESS;
977 __ClearPageIsolated(page);
978 goto out;
979 }
980
981 rc = mapping->a_ops->migratepage(mapping, newpage,
982 page, mode);
983 WARN_ON_ONCE(rc == MIGRATEPAGE_SUCCESS &&
984 !PageIsolated(page));
985 }
986
987
988
989
990
991 if (rc == MIGRATEPAGE_SUCCESS) {
992 if (__PageMovable(page)) {
993 VM_BUG_ON_PAGE(!PageIsolated(page), page);
994
995
996
997
998
999 __ClearPageIsolated(page);
1000 }
1001
1002
1003
1004
1005
1006
1007 if (!PageMappingFlags(page))
1008 page->mapping = NULL;
1009
1010 if (likely(!is_zone_device_page(newpage)))
1011 flush_dcache_page(newpage);
1012
1013 }
1014out:
1015 return rc;
1016}
1017
1018static int __unmap_and_move(struct page *page, struct page *newpage,
1019 int force, enum migrate_mode mode)
1020{
1021 int rc = -EAGAIN;
1022 int page_was_mapped = 0;
1023 struct anon_vma *anon_vma = NULL;
1024 bool is_lru = !__PageMovable(page);
1025
1026 if (!trylock_page(page)) {
1027 if (!force || mode == MIGRATE_ASYNC)
1028 goto out;
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043 if (current->flags & PF_MEMALLOC)
1044 goto out;
1045
1046 lock_page(page);
1047 }
1048
1049 if (PageWriteback(page)) {
1050
1051
1052
1053
1054
1055
1056 switch (mode) {
1057 case MIGRATE_SYNC:
1058 case MIGRATE_SYNC_NO_COPY:
1059 break;
1060 default:
1061 rc = -EBUSY;
1062 goto out_unlock;
1063 }
1064 if (!force)
1065 goto out_unlock;
1066 wait_on_page_writeback(page);
1067 }
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083 if (PageAnon(page) && !PageKsm(page))
1084 anon_vma = page_get_anon_vma(page);
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094 if (unlikely(!trylock_page(newpage)))
1095 goto out_unlock;
1096
1097 if (unlikely(!is_lru)) {
1098 rc = move_to_new_page(newpage, page, mode);
1099 goto out_unlock_both;
1100 }
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114 if (!page->mapping) {
1115 VM_BUG_ON_PAGE(PageAnon(page), page);
1116 if (page_has_private(page)) {
1117 try_to_free_buffers(page);
1118 goto out_unlock_both;
1119 }
1120 } else if (page_mapped(page)) {
1121
1122 VM_BUG_ON_PAGE(PageAnon(page) && !PageKsm(page) && !anon_vma,
1123 page);
1124 try_to_unmap(page,
1125 TTU_MIGRATION|TTU_IGNORE_MLOCK|TTU_IGNORE_ACCESS);
1126 page_was_mapped = 1;
1127 }
1128
1129 if (!page_mapped(page))
1130 rc = move_to_new_page(newpage, page, mode);
1131
1132 if (page_was_mapped)
1133 remove_migration_ptes(page,
1134 rc == MIGRATEPAGE_SUCCESS ? newpage : page, false);
1135
1136out_unlock_both:
1137 unlock_page(newpage);
1138out_unlock:
1139
1140 if (anon_vma)
1141 put_anon_vma(anon_vma);
1142 unlock_page(page);
1143out:
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153 if (rc == MIGRATEPAGE_SUCCESS) {
1154 if (unlikely(!is_lru))
1155 put_page(newpage);
1156 else
1157 putback_lru_page(newpage);
1158 }
1159
1160 return rc;
1161}
1162
1163
1164
1165
1166
1167static int unmap_and_move(new_page_t get_new_page,
1168 free_page_t put_new_page,
1169 unsigned long private, struct page *page,
1170 int force, enum migrate_mode mode,
1171 enum migrate_reason reason)
1172{
1173 int rc = MIGRATEPAGE_SUCCESS;
1174 struct page *newpage = NULL;
1175
1176 if (!thp_migration_supported() && PageTransHuge(page))
1177 return -ENOMEM;
1178
1179 if (page_count(page) == 1) {
1180
1181 ClearPageActive(page);
1182 ClearPageUnevictable(page);
1183 if (unlikely(__PageMovable(page))) {
1184 lock_page(page);
1185 if (!PageMovable(page))
1186 __ClearPageIsolated(page);
1187 unlock_page(page);
1188 }
1189 goto out;
1190 }
1191
1192 newpage = get_new_page(page, private);
1193 if (!newpage)
1194 return -ENOMEM;
1195
1196 rc = __unmap_and_move(page, newpage, force, mode);
1197 if (rc == MIGRATEPAGE_SUCCESS)
1198 set_page_owner_migrate_reason(newpage, reason);
1199
1200out:
1201 if (rc != -EAGAIN) {
1202
1203
1204
1205
1206
1207 list_del(&page->lru);
1208
1209
1210
1211
1212
1213
1214 if (likely(!__PageMovable(page)))
1215 mod_node_page_state(page_pgdat(page), NR_ISOLATED_ANON +
1216 page_is_file_lru(page), -hpage_nr_pages(page));
1217 }
1218
1219
1220
1221
1222
1223
1224 if (rc == MIGRATEPAGE_SUCCESS) {
1225 put_page(page);
1226 if (reason == MR_MEMORY_FAILURE) {
1227
1228
1229
1230
1231
1232 if (set_hwpoison_free_buddy_page(page))
1233 num_poisoned_pages_inc();
1234 }
1235 } else {
1236 if (rc != -EAGAIN) {
1237 if (likely(!__PageMovable(page))) {
1238 putback_lru_page(page);
1239 goto put_new;
1240 }
1241
1242 lock_page(page);
1243 if (PageMovable(page))
1244 putback_movable_page(page);
1245 else
1246 __ClearPageIsolated(page);
1247 unlock_page(page);
1248 put_page(page);
1249 }
1250put_new:
1251 if (put_new_page)
1252 put_new_page(newpage, private);
1253 else
1254 put_page(newpage);
1255 }
1256
1257 return rc;
1258}
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278static int unmap_and_move_huge_page(new_page_t get_new_page,
1279 free_page_t put_new_page, unsigned long private,
1280 struct page *hpage, int force,
1281 enum migrate_mode mode, int reason)
1282{
1283 int rc = -EAGAIN;
1284 int page_was_mapped = 0;
1285 struct page *new_hpage;
1286 struct anon_vma *anon_vma = NULL;
1287 struct address_space *mapping = NULL;
1288
1289
1290
1291
1292
1293
1294
1295
1296 if (!hugepage_migration_supported(page_hstate(hpage))) {
1297 putback_active_hugepage(hpage);
1298 return -ENOSYS;
1299 }
1300
1301 new_hpage = get_new_page(hpage, private);
1302 if (!new_hpage)
1303 return -ENOMEM;
1304
1305 if (!trylock_page(hpage)) {
1306 if (!force)
1307 goto out;
1308 switch (mode) {
1309 case MIGRATE_SYNC:
1310 case MIGRATE_SYNC_NO_COPY:
1311 break;
1312 default:
1313 goto out;
1314 }
1315 lock_page(hpage);
1316 }
1317
1318
1319
1320
1321
1322
1323 if (page_private(hpage) && !page_mapping(hpage)) {
1324 rc = -EBUSY;
1325 goto out_unlock;
1326 }
1327
1328 if (PageAnon(hpage))
1329 anon_vma = page_get_anon_vma(hpage);
1330
1331 if (unlikely(!trylock_page(new_hpage)))
1332 goto put_anon;
1333
1334 if (page_mapped(hpage)) {
1335
1336
1337
1338
1339
1340
1341 mapping = hugetlb_page_mapping_lock_write(hpage);
1342 if (unlikely(!mapping))
1343 goto unlock_put_anon;
1344
1345 try_to_unmap(hpage,
1346 TTU_MIGRATION|TTU_IGNORE_MLOCK|TTU_IGNORE_ACCESS|
1347 TTU_RMAP_LOCKED);
1348 page_was_mapped = 1;
1349
1350
1351
1352
1353 }
1354
1355 if (!page_mapped(hpage))
1356 rc = move_to_new_page(new_hpage, hpage, mode);
1357
1358 if (page_was_mapped) {
1359 remove_migration_ptes(hpage,
1360 rc == MIGRATEPAGE_SUCCESS ? new_hpage : hpage, true);
1361 i_mmap_unlock_write(mapping);
1362 }
1363
1364unlock_put_anon:
1365 unlock_page(new_hpage);
1366
1367put_anon:
1368 if (anon_vma)
1369 put_anon_vma(anon_vma);
1370
1371 if (rc == MIGRATEPAGE_SUCCESS) {
1372 move_hugetlb_state(hpage, new_hpage, reason);
1373 put_new_page = NULL;
1374 }
1375
1376out_unlock:
1377 unlock_page(hpage);
1378out:
1379 if (rc != -EAGAIN)
1380 putback_active_hugepage(hpage);
1381
1382
1383
1384
1385
1386
1387 if (put_new_page)
1388 put_new_page(new_hpage, private);
1389 else
1390 putback_active_hugepage(new_hpage);
1391
1392 return rc;
1393}
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416int migrate_pages(struct list_head *from, new_page_t get_new_page,
1417 free_page_t put_new_page, unsigned long private,
1418 enum migrate_mode mode, int reason)
1419{
1420 int retry = 1;
1421 int nr_failed = 0;
1422 int nr_succeeded = 0;
1423 int pass = 0;
1424 struct page *page;
1425 struct page *page2;
1426 int swapwrite = current->flags & PF_SWAPWRITE;
1427 int rc;
1428
1429 if (!swapwrite)
1430 current->flags |= PF_SWAPWRITE;
1431
1432 for(pass = 0; pass < 10 && retry; pass++) {
1433 retry = 0;
1434
1435 list_for_each_entry_safe(page, page2, from, lru) {
1436retry:
1437 cond_resched();
1438
1439 if (PageHuge(page))
1440 rc = unmap_and_move_huge_page(get_new_page,
1441 put_new_page, private, page,
1442 pass > 2, mode, reason);
1443 else
1444 rc = unmap_and_move(get_new_page, put_new_page,
1445 private, page, pass > 2, mode,
1446 reason);
1447
1448 switch(rc) {
1449 case -ENOMEM:
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461 if (PageTransHuge(page) && !PageHuge(page)) {
1462 lock_page(page);
1463 rc = split_huge_page_to_list(page, from);
1464 unlock_page(page);
1465 if (!rc) {
1466 list_safe_reset_next(page, page2, lru);
1467 goto retry;
1468 }
1469 }
1470 nr_failed++;
1471 goto out;
1472 case -EAGAIN:
1473 retry++;
1474 break;
1475 case MIGRATEPAGE_SUCCESS:
1476 nr_succeeded++;
1477 break;
1478 default:
1479
1480
1481
1482
1483
1484
1485 nr_failed++;
1486 break;
1487 }
1488 }
1489 }
1490 nr_failed += retry;
1491 rc = nr_failed;
1492out:
1493 if (nr_succeeded)
1494 count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded);
1495 if (nr_failed)
1496 count_vm_events(PGMIGRATE_FAIL, nr_failed);
1497 trace_mm_migrate_pages(nr_succeeded, nr_failed, mode, reason);
1498
1499 if (!swapwrite)
1500 current->flags &= ~PF_SWAPWRITE;
1501
1502 return rc;
1503}
1504
1505#ifdef CONFIG_NUMA
1506
1507static int store_status(int __user *status, int start, int value, int nr)
1508{
1509 while (nr-- > 0) {
1510 if (put_user(value, status + start))
1511 return -EFAULT;
1512 start++;
1513 }
1514
1515 return 0;
1516}
1517
1518static int do_move_pages_to_node(struct mm_struct *mm,
1519 struct list_head *pagelist, int node)
1520{
1521 int err;
1522
1523 err = migrate_pages(pagelist, alloc_new_node_page, NULL, node,
1524 MIGRATE_SYNC, MR_SYSCALL);
1525 if (err)
1526 putback_movable_pages(pagelist);
1527 return err;
1528}
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539static int add_page_for_migration(struct mm_struct *mm, unsigned long addr,
1540 int node, struct list_head *pagelist, bool migrate_all)
1541{
1542 struct vm_area_struct *vma;
1543 struct page *page;
1544 unsigned int follflags;
1545 int err;
1546
1547 mmap_read_lock(mm);
1548 err = -EFAULT;
1549 vma = find_vma(mm, addr);
1550 if (!vma || addr < vma->vm_start || !vma_migratable(vma))
1551 goto out;
1552
1553
1554 follflags = FOLL_GET | FOLL_DUMP;
1555 page = follow_page(vma, addr, follflags);
1556
1557 err = PTR_ERR(page);
1558 if (IS_ERR(page))
1559 goto out;
1560
1561 err = -ENOENT;
1562 if (!page)
1563 goto out;
1564
1565 err = 0;
1566 if (page_to_nid(page) == node)
1567 goto out_putpage;
1568
1569 err = -EACCES;
1570 if (page_mapcount(page) > 1 && !migrate_all)
1571 goto out_putpage;
1572
1573 if (PageHuge(page)) {
1574 if (PageHead(page)) {
1575 isolate_huge_page(page, pagelist);
1576 err = 1;
1577 }
1578 } else {
1579 struct page *head;
1580
1581 head = compound_head(page);
1582 err = isolate_lru_page(head);
1583 if (err)
1584 goto out_putpage;
1585
1586 err = 1;
1587 list_add_tail(&head->lru, pagelist);
1588 mod_node_page_state(page_pgdat(head),
1589 NR_ISOLATED_ANON + page_is_file_lru(head),
1590 hpage_nr_pages(head));
1591 }
1592out_putpage:
1593
1594
1595
1596
1597
1598 put_page(page);
1599out:
1600 mmap_read_unlock(mm);
1601 return err;
1602}
1603
1604static int move_pages_and_store_status(struct mm_struct *mm, int node,
1605 struct list_head *pagelist, int __user *status,
1606 int start, int i, unsigned long nr_pages)
1607{
1608 int err;
1609
1610 if (list_empty(pagelist))
1611 return 0;
1612
1613 err = do_move_pages_to_node(mm, pagelist, node);
1614 if (err) {
1615
1616
1617
1618
1619
1620
1621
1622
1623 if (err > 0)
1624 err += nr_pages - i - 1;
1625 return err;
1626 }
1627 return store_status(status, start, node, i - start);
1628}
1629
1630
1631
1632
1633
1634static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
1635 unsigned long nr_pages,
1636 const void __user * __user *pages,
1637 const int __user *nodes,
1638 int __user *status, int flags)
1639{
1640 int current_node = NUMA_NO_NODE;
1641 LIST_HEAD(pagelist);
1642 int start, i;
1643 int err = 0, err1;
1644
1645 migrate_prep();
1646
1647 for (i = start = 0; i < nr_pages; i++) {
1648 const void __user *p;
1649 unsigned long addr;
1650 int node;
1651
1652 err = -EFAULT;
1653 if (get_user(p, pages + i))
1654 goto out_flush;
1655 if (get_user(node, nodes + i))
1656 goto out_flush;
1657 addr = (unsigned long)untagged_addr(p);
1658
1659 err = -ENODEV;
1660 if (node < 0 || node >= MAX_NUMNODES)
1661 goto out_flush;
1662 if (!node_state(node, N_MEMORY))
1663 goto out_flush;
1664
1665 err = -EACCES;
1666 if (!node_isset(node, task_nodes))
1667 goto out_flush;
1668
1669 if (current_node == NUMA_NO_NODE) {
1670 current_node = node;
1671 start = i;
1672 } else if (node != current_node) {
1673 err = move_pages_and_store_status(mm, current_node,
1674 &pagelist, status, start, i, nr_pages);
1675 if (err)
1676 goto out;
1677 start = i;
1678 current_node = node;
1679 }
1680
1681
1682
1683
1684
1685 err = add_page_for_migration(mm, addr, current_node,
1686 &pagelist, flags & MPOL_MF_MOVE_ALL);
1687
1688 if (err > 0) {
1689
1690 continue;
1691 }
1692
1693
1694
1695
1696
1697 err = store_status(status, i, err ? : current_node, 1);
1698 if (err)
1699 goto out_flush;
1700
1701 err = move_pages_and_store_status(mm, current_node, &pagelist,
1702 status, start, i, nr_pages);
1703 if (err)
1704 goto out;
1705 current_node = NUMA_NO_NODE;
1706 }
1707out_flush:
1708
1709 err1 = move_pages_and_store_status(mm, current_node, &pagelist,
1710 status, start, i, nr_pages);
1711 if (err >= 0)
1712 err = err1;
1713out:
1714 return err;
1715}
1716
1717
1718
1719
1720static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
1721 const void __user **pages, int *status)
1722{
1723 unsigned long i;
1724
1725 mmap_read_lock(mm);
1726
1727 for (i = 0; i < nr_pages; i++) {
1728 unsigned long addr = (unsigned long)(*pages);
1729 struct vm_area_struct *vma;
1730 struct page *page;
1731 int err = -EFAULT;
1732
1733 vma = find_vma(mm, addr);
1734 if (!vma || addr < vma->vm_start)
1735 goto set_status;
1736
1737
1738 page = follow_page(vma, addr, FOLL_DUMP);
1739
1740 err = PTR_ERR(page);
1741 if (IS_ERR(page))
1742 goto set_status;
1743
1744 err = page ? page_to_nid(page) : -ENOENT;
1745set_status:
1746 *status = err;
1747
1748 pages++;
1749 status++;
1750 }
1751
1752 mmap_read_unlock(mm);
1753}
1754
1755
1756
1757
1758
1759static int do_pages_stat(struct mm_struct *mm, unsigned long nr_pages,
1760 const void __user * __user *pages,
1761 int __user *status)
1762{
1763#define DO_PAGES_STAT_CHUNK_NR 16
1764 const void __user *chunk_pages[DO_PAGES_STAT_CHUNK_NR];
1765 int chunk_status[DO_PAGES_STAT_CHUNK_NR];
1766
1767 while (nr_pages) {
1768 unsigned long chunk_nr;
1769
1770 chunk_nr = nr_pages;
1771 if (chunk_nr > DO_PAGES_STAT_CHUNK_NR)
1772 chunk_nr = DO_PAGES_STAT_CHUNK_NR;
1773
1774 if (copy_from_user(chunk_pages, pages, chunk_nr * sizeof(*chunk_pages)))
1775 break;
1776
1777 do_pages_stat_array(mm, chunk_nr, chunk_pages, chunk_status);
1778
1779 if (copy_to_user(status, chunk_status, chunk_nr * sizeof(*status)))
1780 break;
1781
1782 pages += chunk_nr;
1783 status += chunk_nr;
1784 nr_pages -= chunk_nr;
1785 }
1786 return nr_pages ? -EFAULT : 0;
1787}
1788
1789
1790
1791
1792
1793static int kernel_move_pages(pid_t pid, unsigned long nr_pages,
1794 const void __user * __user *pages,
1795 const int __user *nodes,
1796 int __user *status, int flags)
1797{
1798 struct task_struct *task;
1799 struct mm_struct *mm;
1800 int err;
1801 nodemask_t task_nodes;
1802
1803
1804 if (flags & ~(MPOL_MF_MOVE|MPOL_MF_MOVE_ALL))
1805 return -EINVAL;
1806
1807 if ((flags & MPOL_MF_MOVE_ALL) && !capable(CAP_SYS_NICE))
1808 return -EPERM;
1809
1810
1811 rcu_read_lock();
1812 task = pid ? find_task_by_vpid(pid) : current;
1813 if (!task) {
1814 rcu_read_unlock();
1815 return -ESRCH;
1816 }
1817 get_task_struct(task);
1818
1819
1820
1821
1822
1823 if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) {
1824 rcu_read_unlock();
1825 err = -EPERM;
1826 goto out;
1827 }
1828 rcu_read_unlock();
1829
1830 err = security_task_movememory(task);
1831 if (err)
1832 goto out;
1833
1834 task_nodes = cpuset_mems_allowed(task);
1835 mm = get_task_mm(task);
1836 put_task_struct(task);
1837
1838 if (!mm)
1839 return -EINVAL;
1840
1841 if (nodes)
1842 err = do_pages_move(mm, task_nodes, nr_pages, pages,
1843 nodes, status, flags);
1844 else
1845 err = do_pages_stat(mm, nr_pages, pages, status);
1846
1847 mmput(mm);
1848 return err;
1849
1850out:
1851 put_task_struct(task);
1852 return err;
1853}
1854
1855SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
1856 const void __user * __user *, pages,
1857 const int __user *, nodes,
1858 int __user *, status, int, flags)
1859{
1860 return kernel_move_pages(pid, nr_pages, pages, nodes, status, flags);
1861}
1862
1863#ifdef CONFIG_COMPAT
1864COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
1865 compat_uptr_t __user *, pages32,
1866 const int __user *, nodes,
1867 int __user *, status,
1868 int, flags)
1869{
1870 const void __user * __user *pages;
1871 int i;
1872
1873 pages = compat_alloc_user_space(nr_pages * sizeof(void *));
1874 for (i = 0; i < nr_pages; i++) {
1875 compat_uptr_t p;
1876
1877 if (get_user(p, pages32 + i) ||
1878 put_user(compat_ptr(p), pages + i))
1879 return -EFAULT;
1880 }
1881 return kernel_move_pages(pid, nr_pages, pages, nodes, status, flags);
1882}
1883#endif
1884
1885#ifdef CONFIG_NUMA_BALANCING
1886
1887
1888
1889
1890static bool migrate_balanced_pgdat(struct pglist_data *pgdat,
1891 unsigned long nr_migrate_pages)
1892{
1893 int z;
1894
1895 for (z = pgdat->nr_zones - 1; z >= 0; z--) {
1896 struct zone *zone = pgdat->node_zones + z;
1897
1898 if (!populated_zone(zone))
1899 continue;
1900
1901
1902 if (!zone_watermark_ok(zone, 0,
1903 high_wmark_pages(zone) +
1904 nr_migrate_pages,
1905 ZONE_MOVABLE, 0))
1906 continue;
1907 return true;
1908 }
1909 return false;
1910}
1911
1912static struct page *alloc_misplaced_dst_page(struct page *page,
1913 unsigned long data)
1914{
1915 int nid = (int) data;
1916 struct page *newpage;
1917
1918 newpage = __alloc_pages_node(nid,
1919 (GFP_HIGHUSER_MOVABLE |
1920 __GFP_THISNODE | __GFP_NOMEMALLOC |
1921 __GFP_NORETRY | __GFP_NOWARN) &
1922 ~__GFP_RECLAIM, 0);
1923
1924 return newpage;
1925}
1926
1927static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
1928{
1929 int page_lru;
1930
1931 VM_BUG_ON_PAGE(compound_order(page) && !PageTransHuge(page), page);
1932
1933
1934 if (!migrate_balanced_pgdat(pgdat, compound_nr(page)))
1935 return 0;
1936
1937 if (isolate_lru_page(page))
1938 return 0;
1939
1940
1941
1942
1943
1944
1945
1946
1947 if (PageTransHuge(page) && page_count(page) != 3) {
1948 putback_lru_page(page);
1949 return 0;
1950 }
1951
1952 page_lru = page_is_file_lru(page);
1953 mod_node_page_state(page_pgdat(page), NR_ISOLATED_ANON + page_lru,
1954 hpage_nr_pages(page));
1955
1956
1957
1958
1959
1960
1961 put_page(page);
1962 return 1;
1963}
1964
1965bool pmd_trans_migrating(pmd_t pmd)
1966{
1967 struct page *page = pmd_page(pmd);
1968 return PageLocked(page);
1969}
1970
1971
1972
1973
1974
1975
1976int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma,
1977 int node)
1978{
1979 pg_data_t *pgdat = NODE_DATA(node);
1980 int isolated;
1981 int nr_remaining;
1982 LIST_HEAD(migratepages);
1983
1984
1985
1986
1987
1988 if (page_mapcount(page) != 1 && page_is_file_lru(page) &&
1989 (vma->vm_flags & VM_EXEC))
1990 goto out;
1991
1992
1993
1994
1995
1996 if (page_is_file_lru(page) && PageDirty(page))
1997 goto out;
1998
1999 isolated = numamigrate_isolate_page(pgdat, page);
2000 if (!isolated)
2001 goto out;
2002
2003 list_add(&page->lru, &migratepages);
2004 nr_remaining = migrate_pages(&migratepages, alloc_misplaced_dst_page,
2005 NULL, node, MIGRATE_ASYNC,
2006 MR_NUMA_MISPLACED);
2007 if (nr_remaining) {
2008 if (!list_empty(&migratepages)) {
2009 list_del(&page->lru);
2010 dec_node_page_state(page, NR_ISOLATED_ANON +
2011 page_is_file_lru(page));
2012 putback_lru_page(page);
2013 }
2014 isolated = 0;
2015 } else
2016 count_vm_numa_event(NUMA_PAGE_MIGRATE);
2017 BUG_ON(!list_empty(&migratepages));
2018 return isolated;
2019
2020out:
2021 put_page(page);
2022 return 0;
2023}
2024#endif
2025
2026#if defined(CONFIG_NUMA_BALANCING) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
2027
2028
2029
2030
2031int migrate_misplaced_transhuge_page(struct mm_struct *mm,
2032 struct vm_area_struct *vma,
2033 pmd_t *pmd, pmd_t entry,
2034 unsigned long address,
2035 struct page *page, int node)
2036{
2037 spinlock_t *ptl;
2038 pg_data_t *pgdat = NODE_DATA(node);
2039 int isolated = 0;
2040 struct page *new_page = NULL;
2041 int page_lru = page_is_file_lru(page);
2042 unsigned long start = address & HPAGE_PMD_MASK;
2043
2044 new_page = alloc_pages_node(node,
2045 (GFP_TRANSHUGE_LIGHT | __GFP_THISNODE),
2046 HPAGE_PMD_ORDER);
2047 if (!new_page)
2048 goto out_fail;
2049 prep_transhuge_page(new_page);
2050
2051 isolated = numamigrate_isolate_page(pgdat, page);
2052 if (!isolated) {
2053 put_page(new_page);
2054 goto out_fail;
2055 }
2056
2057
2058 __SetPageLocked(new_page);
2059 if (PageSwapBacked(page))
2060 __SetPageSwapBacked(new_page);
2061
2062
2063 new_page->mapping = page->mapping;
2064 new_page->index = page->index;
2065
2066 flush_cache_range(vma, start, start + HPAGE_PMD_SIZE);
2067 migrate_page_copy(new_page, page);
2068 WARN_ON(PageLRU(new_page));
2069
2070
2071 ptl = pmd_lock(mm, pmd);
2072 if (unlikely(!pmd_same(*pmd, entry) || !page_ref_freeze(page, 2))) {
2073 spin_unlock(ptl);
2074
2075
2076 if (TestClearPageActive(new_page))
2077 SetPageActive(page);
2078 if (TestClearPageUnevictable(new_page))
2079 SetPageUnevictable(page);
2080
2081 unlock_page(new_page);
2082 put_page(new_page);
2083
2084
2085 get_page(page);
2086 putback_lru_page(page);
2087 mod_node_page_state(page_pgdat(page),
2088 NR_ISOLATED_ANON + page_lru, -HPAGE_PMD_NR);
2089
2090 goto out_unlock;
2091 }
2092
2093 entry = mk_huge_pmd(new_page, vma->vm_page_prot);
2094 entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma);
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104 page_add_anon_rmap(new_page, vma, start, true);
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116 set_pmd_at(mm, start, pmd, entry);
2117 update_mmu_cache_pmd(vma, address, &entry);
2118
2119 page_ref_unfreeze(page, 2);
2120 mlock_migrate_page(new_page, page);
2121 page_remove_rmap(page, true);
2122 set_page_owner_migrate_reason(new_page, MR_NUMA_MISPLACED);
2123
2124 spin_unlock(ptl);
2125
2126
2127 get_page(new_page);
2128 putback_lru_page(new_page);
2129
2130 unlock_page(new_page);
2131 unlock_page(page);
2132 put_page(page);
2133 put_page(page);
2134
2135 count_vm_events(PGMIGRATE_SUCCESS, HPAGE_PMD_NR);
2136 count_vm_numa_events(NUMA_PAGE_MIGRATE, HPAGE_PMD_NR);
2137
2138 mod_node_page_state(page_pgdat(page),
2139 NR_ISOLATED_ANON + page_lru,
2140 -HPAGE_PMD_NR);
2141 return isolated;
2142
2143out_fail:
2144 count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR);
2145 ptl = pmd_lock(mm, pmd);
2146 if (pmd_same(*pmd, entry)) {
2147 entry = pmd_modify(entry, vma->vm_page_prot);
2148 set_pmd_at(mm, start, pmd, entry);
2149 update_mmu_cache_pmd(vma, address, &entry);
2150 }
2151 spin_unlock(ptl);
2152
2153out_unlock:
2154 unlock_page(page);
2155 put_page(page);
2156 return 0;
2157}
2158#endif
2159
2160#endif
2161
2162#ifdef CONFIG_DEVICE_PRIVATE
2163static int migrate_vma_collect_hole(unsigned long start,
2164 unsigned long end,
2165 __always_unused int depth,
2166 struct mm_walk *walk)
2167{
2168 struct migrate_vma *migrate = walk->private;
2169 unsigned long addr;
2170
2171 for (addr = start; addr < end; addr += PAGE_SIZE) {
2172 migrate->src[migrate->npages] = MIGRATE_PFN_MIGRATE;
2173 migrate->dst[migrate->npages] = 0;
2174 migrate->npages++;
2175 migrate->cpages++;
2176 }
2177
2178 return 0;
2179}
2180
2181static int migrate_vma_collect_skip(unsigned long start,
2182 unsigned long end,
2183 struct mm_walk *walk)
2184{
2185 struct migrate_vma *migrate = walk->private;
2186 unsigned long addr;
2187
2188 for (addr = start; addr < end; addr += PAGE_SIZE) {
2189 migrate->dst[migrate->npages] = 0;
2190 migrate->src[migrate->npages++] = 0;
2191 }
2192
2193 return 0;
2194}
2195
2196static int migrate_vma_collect_pmd(pmd_t *pmdp,
2197 unsigned long start,
2198 unsigned long end,
2199 struct mm_walk *walk)
2200{
2201 struct migrate_vma *migrate = walk->private;
2202 struct vm_area_struct *vma = walk->vma;
2203 struct mm_struct *mm = vma->vm_mm;
2204 unsigned long addr = start, unmapped = 0;
2205 spinlock_t *ptl;
2206 pte_t *ptep;
2207
2208again:
2209 if (pmd_none(*pmdp))
2210 return migrate_vma_collect_hole(start, end, -1, walk);
2211
2212 if (pmd_trans_huge(*pmdp)) {
2213 struct page *page;
2214
2215 ptl = pmd_lock(mm, pmdp);
2216 if (unlikely(!pmd_trans_huge(*pmdp))) {
2217 spin_unlock(ptl);
2218 goto again;
2219 }
2220
2221 page = pmd_page(*pmdp);
2222 if (is_huge_zero_page(page)) {
2223 spin_unlock(ptl);
2224 split_huge_pmd(vma, pmdp, addr);
2225 if (pmd_trans_unstable(pmdp))
2226 return migrate_vma_collect_skip(start, end,
2227 walk);
2228 } else {
2229 int ret;
2230
2231 get_page(page);
2232 spin_unlock(ptl);
2233 if (unlikely(!trylock_page(page)))
2234 return migrate_vma_collect_skip(start, end,
2235 walk);
2236 ret = split_huge_page(page);
2237 unlock_page(page);
2238 put_page(page);
2239 if (ret)
2240 return migrate_vma_collect_skip(start, end,
2241 walk);
2242 if (pmd_none(*pmdp))
2243 return migrate_vma_collect_hole(start, end, -1,
2244 walk);
2245 }
2246 }
2247
2248 if (unlikely(pmd_bad(*pmdp)))
2249 return migrate_vma_collect_skip(start, end, walk);
2250
2251 ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl);
2252 arch_enter_lazy_mmu_mode();
2253
2254 for (; addr < end; addr += PAGE_SIZE, ptep++) {
2255 unsigned long mpfn = 0, pfn;
2256 struct page *page;
2257 swp_entry_t entry;
2258 pte_t pte;
2259
2260 pte = *ptep;
2261
2262 if (pte_none(pte)) {
2263 mpfn = MIGRATE_PFN_MIGRATE;
2264 migrate->cpages++;
2265 goto next;
2266 }
2267
2268 if (!pte_present(pte)) {
2269
2270
2271
2272
2273
2274 entry = pte_to_swp_entry(pte);
2275 if (!is_device_private_entry(entry))
2276 goto next;
2277
2278 page = device_private_entry_to_page(entry);
2279 if (page->pgmap->owner != migrate->src_owner)
2280 goto next;
2281
2282 mpfn = migrate_pfn(page_to_pfn(page)) |
2283 MIGRATE_PFN_MIGRATE;
2284 if (is_write_device_private_entry(entry))
2285 mpfn |= MIGRATE_PFN_WRITE;
2286 } else {
2287 if (migrate->src_owner)
2288 goto next;
2289 pfn = pte_pfn(pte);
2290 if (is_zero_pfn(pfn)) {
2291 mpfn = MIGRATE_PFN_MIGRATE;
2292 migrate->cpages++;
2293 goto next;
2294 }
2295 page = vm_normal_page(migrate->vma, addr, pte);
2296 mpfn = migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE;
2297 mpfn |= pte_write(pte) ? MIGRATE_PFN_WRITE : 0;
2298 }
2299
2300
2301 if (!page || !page->mapping || PageTransCompound(page)) {
2302 mpfn = 0;
2303 goto next;
2304 }
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315 get_page(page);
2316 migrate->cpages++;
2317
2318
2319
2320
2321
2322
2323 if (trylock_page(page)) {
2324 pte_t swp_pte;
2325
2326 mpfn |= MIGRATE_PFN_LOCKED;
2327 ptep_get_and_clear(mm, addr, ptep);
2328
2329
2330 entry = make_migration_entry(page, mpfn &
2331 MIGRATE_PFN_WRITE);
2332 swp_pte = swp_entry_to_pte(entry);
2333 if (pte_soft_dirty(pte))
2334 swp_pte = pte_swp_mksoft_dirty(swp_pte);
2335 if (pte_uffd_wp(pte))
2336 swp_pte = pte_swp_mkuffd_wp(swp_pte);
2337 set_pte_at(mm, addr, ptep, swp_pte);
2338
2339
2340
2341
2342
2343
2344 page_remove_rmap(page, false);
2345 put_page(page);
2346
2347 if (pte_present(pte))
2348 unmapped++;
2349 }
2350
2351next:
2352 migrate->dst[migrate->npages] = 0;
2353 migrate->src[migrate->npages++] = mpfn;
2354 }
2355 arch_leave_lazy_mmu_mode();
2356 pte_unmap_unlock(ptep - 1, ptl);
2357
2358
2359 if (unmapped)
2360 flush_tlb_range(walk->vma, start, end);
2361
2362 return 0;
2363}
2364
2365static const struct mm_walk_ops migrate_vma_walk_ops = {
2366 .pmd_entry = migrate_vma_collect_pmd,
2367 .pte_hole = migrate_vma_collect_hole,
2368};
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378static void migrate_vma_collect(struct migrate_vma *migrate)
2379{
2380 struct mmu_notifier_range range;
2381
2382 mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL,
2383 migrate->vma->vm_mm, migrate->start, migrate->end);
2384 mmu_notifier_invalidate_range_start(&range);
2385
2386 walk_page_range(migrate->vma->vm_mm, migrate->start, migrate->end,
2387 &migrate_vma_walk_ops, migrate);
2388
2389 mmu_notifier_invalidate_range_end(&range);
2390 migrate->end = migrate->start + (migrate->npages << PAGE_SHIFT);
2391}
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401static bool migrate_vma_check_page(struct page *page)
2402{
2403
2404
2405
2406
2407
2408 int extra = 1;
2409
2410
2411
2412
2413
2414
2415 if (PageCompound(page))
2416 return false;
2417
2418
2419 if (is_zone_device_page(page)) {
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433 return is_device_private_page(page);
2434 }
2435
2436
2437 if (page_mapping(page))
2438 extra += 1 + page_has_private(page);
2439
2440 if ((page_count(page) - extra) > page_mapcount(page))
2441 return false;
2442
2443 return true;
2444}
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455static void migrate_vma_prepare(struct migrate_vma *migrate)
2456{
2457 const unsigned long npages = migrate->npages;
2458 const unsigned long start = migrate->start;
2459 unsigned long addr, i, restore = 0;
2460 bool allow_drain = true;
2461
2462 lru_add_drain();
2463
2464 for (i = 0; (i < npages) && migrate->cpages; i++) {
2465 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2466 bool remap = true;
2467
2468 if (!page)
2469 continue;
2470
2471 if (!(migrate->src[i] & MIGRATE_PFN_LOCKED)) {
2472
2473
2474
2475
2476
2477
2478
2479
2480 if (!trylock_page(page)) {
2481 migrate->src[i] = 0;
2482 migrate->cpages--;
2483 put_page(page);
2484 continue;
2485 }
2486 remap = false;
2487 migrate->src[i] |= MIGRATE_PFN_LOCKED;
2488 }
2489
2490
2491 if (!is_zone_device_page(page)) {
2492 if (!PageLRU(page) && allow_drain) {
2493
2494 lru_add_drain_all();
2495 allow_drain = false;
2496 }
2497
2498 if (isolate_lru_page(page)) {
2499 if (remap) {
2500 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2501 migrate->cpages--;
2502 restore++;
2503 } else {
2504 migrate->src[i] = 0;
2505 unlock_page(page);
2506 migrate->cpages--;
2507 put_page(page);
2508 }
2509 continue;
2510 }
2511
2512
2513 put_page(page);
2514 }
2515
2516 if (!migrate_vma_check_page(page)) {
2517 if (remap) {
2518 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2519 migrate->cpages--;
2520 restore++;
2521
2522 if (!is_zone_device_page(page)) {
2523 get_page(page);
2524 putback_lru_page(page);
2525 }
2526 } else {
2527 migrate->src[i] = 0;
2528 unlock_page(page);
2529 migrate->cpages--;
2530
2531 if (!is_zone_device_page(page))
2532 putback_lru_page(page);
2533 else
2534 put_page(page);
2535 }
2536 }
2537 }
2538
2539 for (i = 0, addr = start; i < npages && restore; i++, addr += PAGE_SIZE) {
2540 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2541
2542 if (!page || (migrate->src[i] & MIGRATE_PFN_MIGRATE))
2543 continue;
2544
2545 remove_migration_pte(page, migrate->vma, addr, page);
2546
2547 migrate->src[i] = 0;
2548 unlock_page(page);
2549 put_page(page);
2550 restore--;
2551 }
2552}
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565static void migrate_vma_unmap(struct migrate_vma *migrate)
2566{
2567 int flags = TTU_MIGRATION | TTU_IGNORE_MLOCK | TTU_IGNORE_ACCESS;
2568 const unsigned long npages = migrate->npages;
2569 const unsigned long start = migrate->start;
2570 unsigned long addr, i, restore = 0;
2571
2572 for (i = 0; i < npages; i++) {
2573 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2574
2575 if (!page || !(migrate->src[i] & MIGRATE_PFN_MIGRATE))
2576 continue;
2577
2578 if (page_mapped(page)) {
2579 try_to_unmap(page, flags);
2580 if (page_mapped(page))
2581 goto restore;
2582 }
2583
2584 if (migrate_vma_check_page(page))
2585 continue;
2586
2587restore:
2588 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2589 migrate->cpages--;
2590 restore++;
2591 }
2592
2593 for (addr = start, i = 0; i < npages && restore; addr += PAGE_SIZE, i++) {
2594 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2595
2596 if (!page || (migrate->src[i] & MIGRATE_PFN_MIGRATE))
2597 continue;
2598
2599 remove_migration_ptes(page, page, false);
2600
2601 migrate->src[i] = 0;
2602 unlock_page(page);
2603 restore--;
2604
2605 if (is_zone_device_page(page))
2606 put_page(page);
2607 else
2608 putback_lru_page(page);
2609 }
2610}
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676int migrate_vma_setup(struct migrate_vma *args)
2677{
2678 long nr_pages = (args->end - args->start) >> PAGE_SHIFT;
2679
2680 args->start &= PAGE_MASK;
2681 args->end &= PAGE_MASK;
2682 if (!args->vma || is_vm_hugetlb_page(args->vma) ||
2683 (args->vma->vm_flags & VM_SPECIAL) || vma_is_dax(args->vma))
2684 return -EINVAL;
2685 if (nr_pages <= 0)
2686 return -EINVAL;
2687 if (args->start < args->vma->vm_start ||
2688 args->start >= args->vma->vm_end)
2689 return -EINVAL;
2690 if (args->end <= args->vma->vm_start || args->end > args->vma->vm_end)
2691 return -EINVAL;
2692 if (!args->src || !args->dst)
2693 return -EINVAL;
2694
2695 memset(args->src, 0, sizeof(*args->src) * nr_pages);
2696 args->cpages = 0;
2697 args->npages = 0;
2698
2699 migrate_vma_collect(args);
2700
2701 if (args->cpages)
2702 migrate_vma_prepare(args);
2703 if (args->cpages)
2704 migrate_vma_unmap(args);
2705
2706
2707
2708
2709
2710
2711 return 0;
2712
2713}
2714EXPORT_SYMBOL(migrate_vma_setup);
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724static void migrate_vma_insert_page(struct migrate_vma *migrate,
2725 unsigned long addr,
2726 struct page *page,
2727 unsigned long *src,
2728 unsigned long *dst)
2729{
2730 struct vm_area_struct *vma = migrate->vma;
2731 struct mm_struct *mm = vma->vm_mm;
2732 bool flush = false;
2733 spinlock_t *ptl;
2734 pte_t entry;
2735 pgd_t *pgdp;
2736 p4d_t *p4dp;
2737 pud_t *pudp;
2738 pmd_t *pmdp;
2739 pte_t *ptep;
2740
2741
2742 if (!vma_is_anonymous(vma))
2743 goto abort;
2744
2745 pgdp = pgd_offset(mm, addr);
2746 p4dp = p4d_alloc(mm, pgdp, addr);
2747 if (!p4dp)
2748 goto abort;
2749 pudp = pud_alloc(mm, p4dp, addr);
2750 if (!pudp)
2751 goto abort;
2752 pmdp = pmd_alloc(mm, pudp, addr);
2753 if (!pmdp)
2754 goto abort;
2755
2756 if (pmd_trans_huge(*pmdp) || pmd_devmap(*pmdp))
2757 goto abort;
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769 if (pte_alloc(mm, pmdp))
2770 goto abort;
2771
2772
2773 if (unlikely(pmd_trans_unstable(pmdp)))
2774 goto abort;
2775
2776 if (unlikely(anon_vma_prepare(vma)))
2777 goto abort;
2778 if (mem_cgroup_charge(page, vma->vm_mm, GFP_KERNEL))
2779 goto abort;
2780
2781
2782
2783
2784
2785
2786 __SetPageUptodate(page);
2787
2788 if (is_zone_device_page(page)) {
2789 if (is_device_private_page(page)) {
2790 swp_entry_t swp_entry;
2791
2792 swp_entry = make_device_private_entry(page, vma->vm_flags & VM_WRITE);
2793 entry = swp_entry_to_pte(swp_entry);
2794 }
2795 } else {
2796 entry = mk_pte(page, vma->vm_page_prot);
2797 if (vma->vm_flags & VM_WRITE)
2798 entry = pte_mkwrite(pte_mkdirty(entry));
2799 }
2800
2801 ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl);
2802
2803 if (check_stable_address_space(mm))
2804 goto unlock_abort;
2805
2806 if (pte_present(*ptep)) {
2807 unsigned long pfn = pte_pfn(*ptep);
2808
2809 if (!is_zero_pfn(pfn))
2810 goto unlock_abort;
2811 flush = true;
2812 } else if (!pte_none(*ptep))
2813 goto unlock_abort;
2814
2815
2816
2817
2818
2819 if (userfaultfd_missing(vma))
2820 goto unlock_abort;
2821
2822 inc_mm_counter(mm, MM_ANONPAGES);
2823 page_add_new_anon_rmap(page, vma, addr, false);
2824 if (!is_zone_device_page(page))
2825 lru_cache_add_active_or_unevictable(page, vma);
2826 get_page(page);
2827
2828 if (flush) {
2829 flush_cache_page(vma, addr, pte_pfn(*ptep));
2830 ptep_clear_flush_notify(vma, addr, ptep);
2831 set_pte_at_notify(mm, addr, ptep, entry);
2832 update_mmu_cache(vma, addr, ptep);
2833 } else {
2834
2835 set_pte_at(mm, addr, ptep, entry);
2836 update_mmu_cache(vma, addr, ptep);
2837 }
2838
2839 pte_unmap_unlock(ptep, ptl);
2840 *src = MIGRATE_PFN_MIGRATE;
2841 return;
2842
2843unlock_abort:
2844 pte_unmap_unlock(ptep, ptl);
2845abort:
2846 *src &= ~MIGRATE_PFN_MIGRATE;
2847}
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857void migrate_vma_pages(struct migrate_vma *migrate)
2858{
2859 const unsigned long npages = migrate->npages;
2860 const unsigned long start = migrate->start;
2861 struct mmu_notifier_range range;
2862 unsigned long addr, i;
2863 bool notified = false;
2864
2865 for (i = 0, addr = start; i < npages; addr += PAGE_SIZE, i++) {
2866 struct page *newpage = migrate_pfn_to_page(migrate->dst[i]);
2867 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2868 struct address_space *mapping;
2869 int r;
2870
2871 if (!newpage) {
2872 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2873 continue;
2874 }
2875
2876 if (!page) {
2877 if (!(migrate->src[i] & MIGRATE_PFN_MIGRATE))
2878 continue;
2879 if (!notified) {
2880 notified = true;
2881
2882 mmu_notifier_range_init(&range,
2883 MMU_NOTIFY_CLEAR, 0,
2884 NULL,
2885 migrate->vma->vm_mm,
2886 addr, migrate->end);
2887 mmu_notifier_invalidate_range_start(&range);
2888 }
2889 migrate_vma_insert_page(migrate, addr, newpage,
2890 &migrate->src[i],
2891 &migrate->dst[i]);
2892 continue;
2893 }
2894
2895 mapping = page_mapping(page);
2896
2897 if (is_zone_device_page(newpage)) {
2898 if (is_device_private_page(newpage)) {
2899
2900
2901
2902
2903 if (mapping) {
2904 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2905 continue;
2906 }
2907 } else {
2908
2909
2910
2911
2912 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2913 continue;
2914 }
2915 }
2916
2917 r = migrate_page(mapping, newpage, page, MIGRATE_SYNC_NO_COPY);
2918 if (r != MIGRATEPAGE_SUCCESS)
2919 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE;
2920 }
2921
2922
2923
2924
2925
2926
2927 if (notified)
2928 mmu_notifier_invalidate_range_only_end(&range);
2929}
2930EXPORT_SYMBOL(migrate_vma_pages);
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943void migrate_vma_finalize(struct migrate_vma *migrate)
2944{
2945 const unsigned long npages = migrate->npages;
2946 unsigned long i;
2947
2948 for (i = 0; i < npages; i++) {
2949 struct page *newpage = migrate_pfn_to_page(migrate->dst[i]);
2950 struct page *page = migrate_pfn_to_page(migrate->src[i]);
2951
2952 if (!page) {
2953 if (newpage) {
2954 unlock_page(newpage);
2955 put_page(newpage);
2956 }
2957 continue;
2958 }
2959
2960 if (!(migrate->src[i] & MIGRATE_PFN_MIGRATE) || !newpage) {
2961 if (newpage) {
2962 unlock_page(newpage);
2963 put_page(newpage);
2964 }
2965 newpage = page;
2966 }
2967
2968 remove_migration_ptes(page, newpage, false);
2969 unlock_page(page);
2970 migrate->cpages--;
2971
2972 if (is_zone_device_page(page))
2973 put_page(page);
2974 else
2975 putback_lru_page(page);
2976
2977 if (newpage != page) {
2978 unlock_page(newpage);
2979 if (is_zone_device_page(newpage))
2980 put_page(newpage);
2981 else
2982 putback_lru_page(newpage);
2983 }
2984 }
2985}
2986EXPORT_SYMBOL(migrate_vma_finalize);
2987#endif
2988