migrate.h 3.8 KB
Newer Older
C
Christoph Lameter 已提交
1 2 3 4
#ifndef _LINUX_MIGRATE_H
#define _LINUX_MIGRATE_H

#include <linux/mm.h>
5
#include <linux/mempolicy.h>
6
#include <linux/migrate_mode.h>
C
Christoph Lameter 已提交
7

8 9 10
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);
11

12 13 14 15 16 17
/*
 * Return values from addresss_space_operations.migratepage():
 * - negative errno on page migration failure;
 * - zero on page migration success;
 */
#define MIGRATEPAGE_SUCCESS		0
18

19 20 21 22 23 24
enum migrate_reason {
	MR_COMPACTION,
	MR_MEMORY_FAILURE,
	MR_MEMORY_HOTPLUG,
	MR_SYSCALL,		/* also applies to cpusets */
	MR_MEMPOLICY_MBIND,
25
	MR_NUMA_MISPLACED,
26 27
	MR_CMA,
	MR_TYPES
28
};
29

30 31 32
/* In mm/debug.c; also keep sync with include/trace/events/migrate.h */
extern char *migrate_reason_names[MR_TYPES];

33
#ifdef CONFIG_MIGRATION
34

35
extern void putback_movable_pages(struct list_head *l);
36
extern int migrate_page(struct address_space *,
37
			struct page *, struct page *, enum migrate_mode);
38
extern int migrate_pages(struct list_head *l, new_page_t new, free_page_t free,
39
		unsigned long private, enum migrate_mode mode, int reason);
40
extern int isolate_movable_page(struct page *page, isolate_mode_t mode);
41
extern void putback_movable_page(struct page *page);
42

C
Christoph Lameter 已提交
43
extern int migrate_prep(void);
44
extern int migrate_prep_local(void);
N
Naoya Horiguchi 已提交
45 46 47
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);
48 49
extern int migrate_page_move_mapping(struct address_space *mapping,
		struct page *newpage, struct page *page,
50 51
		struct buffer_head *head, enum migrate_mode mode,
		int extra_count);
C
Christoph Lameter 已提交
52
#else
53

54
static inline void putback_movable_pages(struct list_head *l) {}
55 56 57
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)
58
	{ return -ENOSYS; }
59 60
static inline int isolate_movable_page(struct page *page, isolate_mode_t mode)
	{ return -EBUSY; }
61

C
Christoph Lameter 已提交
62
static inline int migrate_prep(void) { return -ENOSYS; }
63
static inline int migrate_prep_local(void) { return -ENOSYS; }
C
Christoph Lameter 已提交
64

N
Naoya Horiguchi 已提交
65 66 67
static inline void migrate_page_copy(struct page *newpage,
				     struct page *page) {}

68
static inline int migrate_huge_page_move_mapping(struct address_space *mapping,
N
Naoya Horiguchi 已提交
69 70 71 72 73
				  struct page *newpage, struct page *page)
{
	return -ENOSYS;
}

C
Christoph Lameter 已提交
74
#endif /* CONFIG_MIGRATION */
75

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
#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

91
#ifdef CONFIG_NUMA_BALANCING
92
extern bool pmd_trans_migrating(pmd_t pmd);
93 94
extern int migrate_misplaced_page(struct page *page,
				  struct vm_area_struct *vma, int node);
95
#else
96 97 98 99
static inline bool pmd_trans_migrating(pmd_t pmd)
{
	return false;
}
100 101
static inline int migrate_misplaced_page(struct page *page,
					 struct vm_area_struct *vma, int node)
102 103 104
{
	return -EAGAIN; /* can't migrate now */
}
105
#endif /* CONFIG_NUMA_BALANCING */
106

107 108 109 110 111 112 113
#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
114 115 116 117 118 119 120 121
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;
}
122
#endif /* CONFIG_NUMA_BALANCING && CONFIG_TRANSPARENT_HUGEPAGE*/
123

C
Christoph Lameter 已提交
124
#endif /* _LINUX_MIGRATE_H */