Merge tag 'pinctrl-v5.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6-microblaze.git] / include / linux / migrate.h
1 /* SPDX-License-Identifier: GPL-2.0 */
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
10 typedef struct page *new_page_t(struct page *page, unsigned long private);
11 typedef void free_page_t(struct page *page, unsigned long private);
12
13 struct migration_target_control;
14
15 /*
16  * Return values from addresss_space_operations.migratepage():
17  * - negative errno on page migration failure;
18  * - zero on page migration success;
19  */
20 #define MIGRATEPAGE_SUCCESS             0
21
22 /*
23  * Keep sync with:
24  * - macro MIGRATE_REASON in include/trace/events/migrate.h
25  * - migrate_reason_names[MR_TYPES] in mm/debug.c
26  */
27 enum migrate_reason {
28         MR_COMPACTION,
29         MR_MEMORY_FAILURE,
30         MR_MEMORY_HOTPLUG,
31         MR_SYSCALL,             /* also applies to cpusets */
32         MR_MEMPOLICY_MBIND,
33         MR_NUMA_MISPLACED,
34         MR_CONTIG_RANGE,
35         MR_LONGTERM_PIN,
36         MR_DEMOTION,
37         MR_TYPES
38 };
39
40 extern const char *migrate_reason_names[MR_TYPES];
41
42 #ifdef CONFIG_MIGRATION
43
44 extern void putback_movable_pages(struct list_head *l);
45 extern int migrate_page(struct address_space *mapping,
46                         struct page *newpage, struct page *page,
47                         enum migrate_mode mode);
48 extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
49                 unsigned long private, enum migrate_mode mode, int reason,
50                 unsigned int *ret_succeeded);
51 extern struct page *alloc_migration_target(struct page *page, unsigned long private);
52 extern int isolate_movable_page(struct page *page, isolate_mode_t mode);
53
54 extern void migrate_page_states(struct page *newpage, struct page *page);
55 extern void migrate_page_copy(struct page *newpage, struct page *page);
56 extern int migrate_huge_page_move_mapping(struct address_space *mapping,
57                                   struct page *newpage, struct page *page);
58 extern int migrate_page_move_mapping(struct address_space *mapping,
59                 struct page *newpage, struct page *page, int extra_count);
60 void folio_migrate_flags(struct folio *newfolio, struct folio *folio);
61 void folio_migrate_copy(struct folio *newfolio, struct folio *folio);
62 int folio_migrate_mapping(struct address_space *mapping,
63                 struct folio *newfolio, struct folio *folio, int extra_count);
64 #else
65
66 static inline void putback_movable_pages(struct list_head *l) {}
67 static inline int migrate_pages(struct list_head *l, new_page_t new,
68                 free_page_t free, unsigned long private, enum migrate_mode mode,
69                 int reason, unsigned int *ret_succeeded)
70         { return -ENOSYS; }
71 static inline struct page *alloc_migration_target(struct page *page,
72                 unsigned long private)
73         { return NULL; }
74 static inline int isolate_movable_page(struct page *page, isolate_mode_t mode)
75         { return -EBUSY; }
76
77 static inline void migrate_page_states(struct page *newpage, struct page *page)
78 {
79 }
80
81 static inline void migrate_page_copy(struct page *newpage,
82                                      struct page *page) {}
83
84 static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
85                                   struct page *newpage, struct page *page)
86 {
87         return -ENOSYS;
88 }
89 #endif /* CONFIG_MIGRATION */
90
91 #ifdef CONFIG_COMPACTION
92 extern int PageMovable(struct page *page);
93 extern void __SetPageMovable(struct page *page, struct address_space *mapping);
94 extern void __ClearPageMovable(struct page *page);
95 #else
96 static inline int PageMovable(struct page *page) { return 0; }
97 static inline void __SetPageMovable(struct page *page,
98                                 struct address_space *mapping)
99 {
100 }
101 static inline void __ClearPageMovable(struct page *page)
102 {
103 }
104 #endif
105
106 #ifdef CONFIG_NUMA_BALANCING
107 extern int migrate_misplaced_page(struct page *page,
108                                   struct vm_area_struct *vma, int node);
109 #else
110 static inline int migrate_misplaced_page(struct page *page,
111                                          struct vm_area_struct *vma, int node)
112 {
113         return -EAGAIN; /* can't migrate now */
114 }
115 #endif /* CONFIG_NUMA_BALANCING */
116
117 #ifdef CONFIG_MIGRATION
118
119 /*
120  * Watch out for PAE architecture, which has an unsigned long, and might not
121  * have enough bits to store all physical address and flags. So far we have
122  * enough room for all our flags.
123  */
124 #define MIGRATE_PFN_VALID       (1UL << 0)
125 #define MIGRATE_PFN_MIGRATE     (1UL << 1)
126 #define MIGRATE_PFN_LOCKED      (1UL << 2)
127 #define MIGRATE_PFN_WRITE       (1UL << 3)
128 #define MIGRATE_PFN_SHIFT       6
129
130 static inline struct page *migrate_pfn_to_page(unsigned long mpfn)
131 {
132         if (!(mpfn & MIGRATE_PFN_VALID))
133                 return NULL;
134         return pfn_to_page(mpfn >> MIGRATE_PFN_SHIFT);
135 }
136
137 static inline unsigned long migrate_pfn(unsigned long pfn)
138 {
139         return (pfn << MIGRATE_PFN_SHIFT) | MIGRATE_PFN_VALID;
140 }
141
142 enum migrate_vma_direction {
143         MIGRATE_VMA_SELECT_SYSTEM = 1 << 0,
144         MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
145 };
146
147 struct migrate_vma {
148         struct vm_area_struct   *vma;
149         /*
150          * Both src and dst array must be big enough for
151          * (end - start) >> PAGE_SHIFT entries.
152          *
153          * The src array must not be modified by the caller after
154          * migrate_vma_setup(), and must not change the dst array after
155          * migrate_vma_pages() returns.
156          */
157         unsigned long           *dst;
158         unsigned long           *src;
159         unsigned long           cpages;
160         unsigned long           npages;
161         unsigned long           start;
162         unsigned long           end;
163
164         /*
165          * Set to the owner value also stored in page->pgmap->owner for
166          * migrating out of device private memory. The flags also need to
167          * be set to MIGRATE_VMA_SELECT_DEVICE_PRIVATE.
168          * The caller should always set this field when using mmu notifier
169          * callbacks to avoid device MMU invalidations for device private
170          * pages that are not being migrated.
171          */
172         void                    *pgmap_owner;
173         unsigned long           flags;
174 };
175
176 int migrate_vma_setup(struct migrate_vma *args);
177 void migrate_vma_pages(struct migrate_vma *migrate);
178 void migrate_vma_finalize(struct migrate_vma *migrate);
179 int next_demotion_node(int node);
180
181 #else /* CONFIG_MIGRATION disabled: */
182
183 static inline int next_demotion_node(int node)
184 {
185         return NUMA_NO_NODE;
186 }
187
188 #endif /* CONFIG_MIGRATION */
189
190 #endif /* _LINUX_MIGRATE_H */