1
2#ifndef _LINUX_MIGRATE_H
3#define _LINUX_MIGRATE_H
4
5#include <linux/mm.h>
6#include <linux/mempolicy.h>
7#include <linux/migrate_mode.h>
8#include <linux/hugetlb.h>
9
10typedef struct page *new_page_t(struct page *page, unsigned long private);
11typedef void free_page_t(struct page *page, unsigned long private);
12
13struct migration_target_control;
14
15
16
17
18
19
20#define MIGRATEPAGE_SUCCESS 0
21
22enum migrate_reason {
23 MR_COMPACTION,
24 MR_MEMORY_FAILURE,
25 MR_MEMORY_HOTPLUG,
26 MR_SYSCALL,
27 MR_MEMPOLICY_MBIND,
28 MR_NUMA_MISPLACED,
29 MR_CONTIG_RANGE,
30 MR_LONGTERM_PIN,
31 MR_TYPES
32};
33
34
35extern const char *migrate_reason_names[MR_TYPES];
36
37#ifdef CONFIG_MIGRATION
38
39extern void putback_movable_pages(struct list_head *l);
40extern int migrate_page(struct address_space *mapping,
41 struct page *newpage, struct page *page,
42 enum migrate_mode mode);
43extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
44 unsigned long private, enum migrate_mode mode, int reason);
45extern struct page *alloc_migration_target(struct page *page, unsigned long private);
46extern int isolate_movable_page(struct page *page, isolate_mode_t mode);
47
48extern void migrate_page_states(struct page *newpage, struct page *page);
49extern void migrate_page_copy(struct page *newpage, struct page *page);
50extern int migrate_huge_page_move_mapping(struct address_space *mapping,
51 struct page *newpage, struct page *page);
52extern int migrate_page_move_mapping(struct address_space *mapping,
53 struct page *newpage, struct page *page, int extra_count);
54#else
55
56static inline void putback_movable_pages(struct list_head *l) {}
57static inline int migrate_pages(struct list_head *l, new_page_t new,
58 free_page_t free, unsigned long private, enum migrate_mode mode,
59 int reason)
60 { return -ENOSYS; }
61static inline struct page *alloc_migration_target(struct page *page,
62 unsigned long private)
63 { return NULL; }
64static inline int isolate_movable_page(struct page *page, isolate_mode_t mode)
65 { return -EBUSY; }
66
67static inline void migrate_page_states(struct page *newpage, struct page *page)
68{
69}
70
71static inline void migrate_page_copy(struct page *newpage,
72 struct page *page) {}
73
74static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
75 struct page *newpage, struct page *page)
76{
77 return -ENOSYS;
78}
79
80#endif
81
82#ifdef CONFIG_COMPACTION
83extern int PageMovable(struct page *page);
84extern void __SetPageMovable(struct page *page, struct address_space *mapping);
85extern void __ClearPageMovable(struct page *page);
86#else
87static inline int PageMovable(struct page *page) { return 0; }
88static inline void __SetPageMovable(struct page *page,
89 struct address_space *mapping)
90{
91}
92static inline void __ClearPageMovable(struct page *page)
93{
94}
95#endif
96
97#ifdef CONFIG_NUMA_BALANCING
98extern bool pmd_trans_migrating(pmd_t pmd);
99extern int migrate_misplaced_page(struct page *page,
100 struct vm_area_struct *vma, int node);
101#else
102static inline bool pmd_trans_migrating(pmd_t pmd)
103{
104 return false;
105}
106static inline int migrate_misplaced_page(struct page *page,
107 struct vm_area_struct *vma, int node)
108{
109 return -EAGAIN;
110}
111#endif
112
113#if defined(CONFIG_NUMA_BALANCING) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
114extern int migrate_misplaced_transhuge_page(struct mm_struct *mm,
115 struct vm_area_struct *vma,
116 pmd_t *pmd, pmd_t entry,
117 unsigned long address,
118 struct page *page, int node);
119#else
120static inline int migrate_misplaced_transhuge_page(struct mm_struct *mm,
121 struct vm_area_struct *vma,
122 pmd_t *pmd, pmd_t entry,
123 unsigned long address,
124 struct page *page, int node)
125{
126 return -EAGAIN;
127}
128#endif
129
130
131#ifdef CONFIG_MIGRATION
132
133
134
135
136
137
138#define MIGRATE_PFN_VALID (1UL << 0)
139#define MIGRATE_PFN_MIGRATE (1UL << 1)
140#define MIGRATE_PFN_LOCKED (1UL << 2)
141#define MIGRATE_PFN_WRITE (1UL << 3)
142#define MIGRATE_PFN_SHIFT 6
143
144static inline struct page *migrate_pfn_to_page(unsigned long mpfn)
145{
146 if (!(mpfn & MIGRATE_PFN_VALID))
147 return NULL;
148 return pfn_to_page(mpfn >> MIGRATE_PFN_SHIFT);
149}
150
151static inline unsigned long migrate_pfn(unsigned long pfn)
152{
153 return (pfn << MIGRATE_PFN_SHIFT) | MIGRATE_PFN_VALID;
154}
155
156enum migrate_vma_direction {
157 MIGRATE_VMA_SELECT_SYSTEM = 1 << 0,
158 MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
159};
160
161struct migrate_vma {
162 struct vm_area_struct *vma;
163
164
165
166
167
168
169
170
171 unsigned long *dst;
172 unsigned long *src;
173 unsigned long cpages;
174 unsigned long npages;
175 unsigned long start;
176 unsigned long end;
177
178
179
180
181
182
183
184
185
186 void *pgmap_owner;
187 unsigned long flags;
188};
189
190int migrate_vma_setup(struct migrate_vma *args);
191void migrate_vma_pages(struct migrate_vma *migrate);
192void migrate_vma_finalize(struct migrate_vma *migrate);
193
194#endif
195
196#endif
197