Lines Matching full:migrate
3 * Memory Migration functionality - linux/mm/migrate.c
16 #include <linux/migrate.h>
54 #include <trace/events/migrate.h>
68 * drained them. Those pages will fail to migrate like other in migrate_prep()
746 * Common logic to directly migrate a single LRU page suitable for
972 * cannot try to migrate this page. in move_to_new_page()
1153 * Obtain the lock on page, remove all ptes and migrate the page
1204 * Compaction can migrate also non-LRU pages which are in unmap_and_move()
1264 * This means that when we try to migrate hugepage whose subpages are
1371 * migrate_pages - migrate the pages specified in a list, to the free pages
1583 * Migrate an array of page address onto an array of nodes and fill
1629 * pages to migrate. Since we are going to in do_pages_move()
1957 * Attempt to migrate a misplaced page to the specified destination
1970 * Don't migrate file pages that are mapped in multiple processes in migrate_misplaced_page()
1978 * Also do not migrate dirty pages as not all filesystems can move in migrate_misplaced_page()
2169 struct migrate_vma *migrate = walk->private; in migrate_vma_collect_hole() local
2173 migrate->src[migrate->npages] = MIGRATE_PFN_MIGRATE; in migrate_vma_collect_hole()
2174 migrate->dst[migrate->npages] = 0; in migrate_vma_collect_hole()
2175 migrate->npages++; in migrate_vma_collect_hole()
2176 migrate->cpages++; in migrate_vma_collect_hole()
2186 struct migrate_vma *migrate = walk->private; in migrate_vma_collect_skip() local
2190 migrate->dst[migrate->npages] = 0; in migrate_vma_collect_skip()
2191 migrate->src[migrate->npages++] = 0; in migrate_vma_collect_skip()
2202 struct migrate_vma *migrate = walk->private; in migrate_vma_collect_pmd() local
2266 migrate->cpages++; in migrate_vma_collect_pmd()
2291 migrate->cpages++; in migrate_vma_collect_pmd()
2295 page = _vm_normal_page(migrate->vma, addr, pte, true); in migrate_vma_collect_pmd()
2317 migrate->cpages++; in migrate_vma_collect_pmd()
2351 migrate->dst[migrate->npages] = 0; in migrate_vma_collect_pmd()
2352 migrate->src[migrate->npages++] = mpfn; in migrate_vma_collect_pmd()
2366 * @migrate: migrate struct containing all migration information
2372 static void migrate_vma_collect(struct migrate_vma *migrate) in migrate_vma_collect() argument
2377 .vma = migrate->vma, in migrate_vma_collect()
2378 .mm = migrate->vma->vm_mm, in migrate_vma_collect()
2379 .private = migrate, in migrate_vma_collect()
2383 migrate->start, in migrate_vma_collect()
2384 migrate->end); in migrate_vma_collect()
2385 walk_page_range(migrate->start, migrate->end, &mm_walk); in migrate_vma_collect()
2387 migrate->start, in migrate_vma_collect()
2388 migrate->end); in migrate_vma_collect()
2390 migrate->end = migrate->start + (migrate->npages << PAGE_SHIFT); in migrate_vma_collect()
2426 * avoid 2 racing thread trying to migrate back to CPU to enter in migrate_vma_check_page()
2457 * @migrate: migrate struct containing all migration information
2464 static void migrate_vma_prepare(struct migrate_vma *migrate) in migrate_vma_prepare() argument
2466 const unsigned long npages = migrate->npages; in migrate_vma_prepare()
2467 const unsigned long start = migrate->start; in migrate_vma_prepare()
2473 for (i = 0; (i < npages) && migrate->cpages; i++) { in migrate_vma_prepare()
2474 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_prepare()
2480 if (!(migrate->src[i] & MIGRATE_PFN_LOCKED)) { in migrate_vma_prepare()
2490 migrate->src[i] = 0; in migrate_vma_prepare()
2491 migrate->cpages--; in migrate_vma_prepare()
2496 migrate->src[i] |= MIGRATE_PFN_LOCKED; in migrate_vma_prepare()
2509 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_prepare()
2510 migrate->cpages--; in migrate_vma_prepare()
2513 migrate->src[i] = 0; in migrate_vma_prepare()
2515 migrate->cpages--; in migrate_vma_prepare()
2527 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_prepare()
2528 migrate->cpages--; in migrate_vma_prepare()
2536 migrate->src[i] = 0; in migrate_vma_prepare()
2538 migrate->cpages--; in migrate_vma_prepare()
2549 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_prepare()
2551 if (!page || (migrate->src[i] & MIGRATE_PFN_MIGRATE)) in migrate_vma_prepare()
2554 remove_migration_pte(page, migrate->vma, addr, page); in migrate_vma_prepare()
2556 migrate->src[i] = 0; in migrate_vma_prepare()
2565 * @migrate: migrate struct containing all migration information
2569 * cannot migrate them.
2574 static void migrate_vma_unmap(struct migrate_vma *migrate) in migrate_vma_unmap() argument
2577 const unsigned long npages = migrate->npages; in migrate_vma_unmap()
2578 const unsigned long start = migrate->start; in migrate_vma_unmap()
2582 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_unmap()
2584 if (!page || !(migrate->src[i] & MIGRATE_PFN_MIGRATE)) in migrate_vma_unmap()
2597 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_unmap()
2598 migrate->cpages--; in migrate_vma_unmap()
2603 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_unmap()
2605 if (!page || (migrate->src[i] & MIGRATE_PFN_MIGRATE)) in migrate_vma_unmap()
2610 migrate->src[i] = 0; in migrate_vma_unmap()
2621 static void migrate_vma_insert_page(struct migrate_vma *migrate, in migrate_vma_insert_page() argument
2627 struct vm_area_struct *vma = migrate->vma; in migrate_vma_insert_page()
2758 * migrate_vma_pages() - migrate meta-data from src page to dst page
2759 * @migrate: migrate struct containing all migration information
2765 static void migrate_vma_pages(struct migrate_vma *migrate) in migrate_vma_pages() argument
2767 const unsigned long npages = migrate->npages; in migrate_vma_pages()
2768 const unsigned long start = migrate->start; in migrate_vma_pages()
2769 struct vm_area_struct *vma = migrate->vma; in migrate_vma_pages()
2775 struct page *newpage = migrate_pfn_to_page(migrate->dst[i]); in migrate_vma_pages()
2776 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_pages()
2781 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_pages()
2786 if (!(migrate->src[i] & MIGRATE_PFN_MIGRATE)) { in migrate_vma_pages()
2794 migrate->end); in migrate_vma_pages()
2796 migrate_vma_insert_page(migrate, addr, newpage, in migrate_vma_pages()
2797 &migrate->src[i], in migrate_vma_pages()
2798 &migrate->dst[i]); in migrate_vma_pages()
2811 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_pages()
2819 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_pages()
2826 migrate->src[i] &= ~MIGRATE_PFN_MIGRATE; in migrate_vma_pages()
2836 migrate->end); in migrate_vma_pages()
2841 * @migrate: migrate struct containing all migration information
2850 static void migrate_vma_finalize(struct migrate_vma *migrate) in migrate_vma_finalize() argument
2852 const unsigned long npages = migrate->npages; in migrate_vma_finalize()
2856 struct page *newpage = migrate_pfn_to_page(migrate->dst[i]); in migrate_vma_finalize()
2857 struct page *page = migrate_pfn_to_page(migrate->src[i]); in migrate_vma_finalize()
2867 if (!(migrate->src[i] & MIGRATE_PFN_MIGRATE) || !newpage) { in migrate_vma_finalize()
2877 migrate->cpages--; in migrate_vma_finalize()
2895 * migrate_vma() - migrate a range of memory inside vma
2899 * @start: start address of the range to migrate (inclusive)
2900 * @end: end address of the range to migrate (exclusive)
2906 * This function tries to migrate a range of memory virtual address range, using
2917 * include/linux/migrate.h
2922 * then the function tries to migrate struct page information from the source
2923 * struct page to the destination struct page. If it fails to migrate the struct
2932 * migrate_vma_ops", in include/linux/migrate.h for details about
2953 struct migrate_vma migrate; in migrate_vma() local
2969 migrate.src = src; in migrate_vma()
2970 migrate.dst = dst; in migrate_vma()
2971 migrate.start = start; in migrate_vma()
2972 migrate.npages = 0; in migrate_vma()
2973 migrate.cpages = 0; in migrate_vma()
2974 migrate.end = end; in migrate_vma()
2975 migrate.vma = vma; in migrate_vma()
2978 migrate_vma_collect(&migrate); in migrate_vma()
2979 if (!migrate.cpages) in migrate_vma()
2983 migrate_vma_prepare(&migrate); in migrate_vma()
2984 if (!migrate.cpages) in migrate_vma()
2988 migrate_vma_unmap(&migrate); in migrate_vma()
2989 if (!migrate.cpages) in migrate_vma()
3003 migrate_vma_pages(&migrate); in migrate_vma()
3008 migrate_vma_finalize(&migrate); in migrate_vma()