migrate.h 3.7 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

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

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

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

C
Christoph Lameter 已提交
72
#endif /* CONFIG_MIGRATION */
73

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

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

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

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