ronnie
2022-10-23 1972b0e7ed50e5b37c5633d662ea03d23b15499c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#ifndef _LINUX_MIGRATE_H
#define _LINUX_MIGRATE_H
 
#include <linux/mm.h>
#include <linux/mempolicy.h>
#include <linux/migrate_mode.h>
 
typedef struct page *new_page_t(struct page *page, unsigned long private,
               int **reason);
typedef void free_page_t(struct page *page, unsigned long private);
 
/*
 * Return values from addresss_space_operations.migratepage():
 * - negative errno on page migration failure;
 * - zero on page migration success;
 */
#define MIGRATEPAGE_SUCCESS        0
 
enum migrate_reason {
   MR_COMPACTION,
   MR_MEMORY_FAILURE,
   MR_MEMORY_HOTPLUG,
   MR_SYSCALL,        /* also applies to cpusets */
   MR_MEMPOLICY_MBIND,
   MR_NUMA_MISPLACED,
   MR_CMA,
   MR_TYPES
};
 
/* In mm/debug.c; also keep sync with include/trace/events/migrate.h */
extern char *migrate_reason_names[MR_TYPES];
 
#ifdef CONFIG_MIGRATION
 
extern void putback_movable_pages(struct list_head *l);
extern int migrate_page(struct address_space *,
           struct page *, struct page *, enum migrate_mode);
extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
       unsigned long private, enum migrate_mode mode, int reason);
extern bool isolate_movable_page(struct page *page, isolate_mode_t mode);
extern void putback_movable_page(struct page *page);
 
extern int migrate_prep(void);
extern int migrate_prep_local(void);
extern void migrate_page_copy(struct page *newpage, struct page *page);
extern int migrate_huge_page_move_mapping(struct address_space *mapping,
                 struct page *newpage, struct page *page);
extern int migrate_page_move_mapping(struct address_space *mapping,
       struct page *newpage, struct page *page,
       struct buffer_head *head, enum migrate_mode mode,
       int extra_count);
#else
 
static inline void putback_movable_pages(struct list_head *l) {}
static inline int migrate_pages(struct list_head *l, new_page_t new,
       free_page_t free, unsigned long private, enum migrate_mode mode,
       int reason)
   { return -ENOSYS; }
 
static inline int migrate_prep(void) { return -ENOSYS; }
static inline int migrate_prep_local(void) { return -ENOSYS; }
 
static inline void migrate_page_copy(struct page *newpage,
                    struct page *page) {}
 
static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
                 struct page *newpage, struct page *page)
{
   return -ENOSYS;
}
 
#endif /* CONFIG_MIGRATION */
 
#ifdef CONFIG_COMPACTION
extern int PageMovable(struct page *page);
extern void __SetPageMovable(struct page *page, struct address_space *mapping);
extern void __ClearPageMovable(struct page *page);
#else
static inline int PageMovable(struct page *page) { return 0; };
static inline void __SetPageMovable(struct page *page,
               struct address_space *mapping)
{
}
static inline void __ClearPageMovable(struct page *page)
{
}
#endif
 
#ifdef CONFIG_NUMA_BALANCING
extern bool pmd_trans_migrating(pmd_t pmd);
extern int migrate_misplaced_page(struct page *page,
                 struct vm_area_struct *vma, int node);
#else
static inline bool pmd_trans_migrating(pmd_t pmd)
{
   return false;
}
static inline int migrate_misplaced_page(struct page *page,
                    struct vm_area_struct *vma, int node)
{
   return -EAGAIN; /* can't migrate now */
}
#endif /* CONFIG_NUMA_BALANCING */
 
#if defined(CONFIG_NUMA_BALANCING) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
extern int migrate_misplaced_transhuge_page(struct mm_struct *mm,
           struct vm_area_struct *vma,
           pmd_t *pmd, pmd_t entry,
           unsigned long address,
           struct page *page, int node);
#else
static inline int migrate_misplaced_transhuge_page(struct mm_struct *mm,
           struct vm_area_struct *vma,
           pmd_t *pmd, pmd_t entry,
           unsigned long address,
           struct page *page, int node)
{
   return -EAGAIN;
}
#endif /* CONFIG_NUMA_BALANCING && CONFIG_TRANSPARENT_HUGEPAGE*/
 
#endif /* _LINUX_MIGRATE_H */