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