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