Blame view

include/linux/huge_mm.h 5.88 KB
71e3aac07   Andrea Arcangeli   thp: transparent ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  #ifndef _LINUX_HUGE_MM_H
  #define _LINUX_HUGE_MM_H
  
  extern int do_huge_pmd_anonymous_page(struct mm_struct *mm,
  				      struct vm_area_struct *vma,
  				      unsigned long address, pmd_t *pmd,
  				      unsigned int flags);
  extern int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
  			 pmd_t *dst_pmd, pmd_t *src_pmd, unsigned long addr,
  			 struct vm_area_struct *vma);
  extern int do_huge_pmd_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
  			       unsigned long address, pmd_t *pmd,
  			       pmd_t orig_pmd);
  extern pgtable_t get_pmd_huge_pte(struct mm_struct *mm);
  extern struct page *follow_trans_huge_pmd(struct mm_struct *mm,
  					  unsigned long addr,
  					  pmd_t *pmd,
  					  unsigned int flags);
  extern int zap_huge_pmd(struct mmu_gather *tlb,
  			struct vm_area_struct *vma,
f21760b15   Shaohua Li   thp: add tlb_remo...
21
  			pmd_t *pmd, unsigned long addr);
0ca1634d4   Johannes Weiner   thp: mincore tran...
22
23
24
  extern int mincore_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
  			unsigned long addr, unsigned long end,
  			unsigned char *vec);
37a1c49a9   Andrea Arcangeli   thp: mremap suppo...
25
26
27
28
29
  extern int move_huge_pmd(struct vm_area_struct *vma,
  			 struct vm_area_struct *new_vma,
  			 unsigned long old_addr,
  			 unsigned long new_addr, unsigned long old_end,
  			 pmd_t *old_pmd, pmd_t *new_pmd);
cd7548ab3   Johannes Weiner   thp: mprotect: tr...
30
31
  extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
  			unsigned long addr, pgprot_t newprot);
71e3aac07   Andrea Arcangeli   thp: transparent ...
32
33
34
35
36
37
  
  enum transparent_hugepage_flag {
  	TRANSPARENT_HUGEPAGE_FLAG,
  	TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG,
  	TRANSPARENT_HUGEPAGE_DEFRAG_FLAG,
  	TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG,
ba76149f4   Andrea Arcangeli   thp: khugepaged
38
  	TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG,
71e3aac07   Andrea Arcangeli   thp: transparent ...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  #ifdef CONFIG_DEBUG_VM
  	TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG,
  #endif
  };
  
  enum page_check_address_pmd_flag {
  	PAGE_CHECK_ADDRESS_PMD_FLAG,
  	PAGE_CHECK_ADDRESS_PMD_NOTSPLITTING_FLAG,
  	PAGE_CHECK_ADDRESS_PMD_SPLITTING_FLAG,
  };
  extern pmd_t *page_check_address_pmd(struct page *page,
  				     struct mm_struct *mm,
  				     unsigned long address,
  				     enum page_check_address_pmd_flag flag);
  
  #ifdef CONFIG_TRANSPARENT_HUGEPAGE
  #define HPAGE_PMD_SHIFT HPAGE_SHIFT
  #define HPAGE_PMD_MASK HPAGE_MASK
  #define HPAGE_PMD_SIZE HPAGE_SIZE
  
  #define transparent_hugepage_enabled(__vma)				\
a664b2d85   Andrea Arcangeli   thp: madvise(MADV...
60
61
62
63
64
  	((transparent_hugepage_flags &					\
  	  (1<<TRANSPARENT_HUGEPAGE_FLAG) ||				\
  	  (transparent_hugepage_flags &					\
  	   (1<<TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG) &&			\
  	   ((__vma)->vm_flags & VM_HUGEPAGE))) &&			\
a7d6e4ecd   Andrea Arcangeli   thp: prevent huge...
65
66
  	 !((__vma)->vm_flags & VM_NOHUGEPAGE) &&			\
  	 !is_vma_temporary_stack(__vma))
71e3aac07   Andrea Arcangeli   thp: transparent ...
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
  #define transparent_hugepage_defrag(__vma)				\
  	((transparent_hugepage_flags &					\
  	  (1<<TRANSPARENT_HUGEPAGE_DEFRAG_FLAG)) ||			\
  	 (transparent_hugepage_flags &					\
  	  (1<<TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG) &&		\
  	  (__vma)->vm_flags & VM_HUGEPAGE))
  #ifdef CONFIG_DEBUG_VM
  #define transparent_hugepage_debug_cow()				\
  	(transparent_hugepage_flags &					\
  	 (1<<TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG))
  #else /* CONFIG_DEBUG_VM */
  #define transparent_hugepage_debug_cow() 0
  #endif /* CONFIG_DEBUG_VM */
  
  extern unsigned long transparent_hugepage_flags;
  extern int copy_pte_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
  			  pmd_t *dst_pmd, pmd_t *src_pmd,
  			  struct vm_area_struct *vma,
  			  unsigned long addr, unsigned long end);
  extern int handle_pte_fault(struct mm_struct *mm,
  			    struct vm_area_struct *vma, unsigned long address,
  			    pte_t *pte, pmd_t *pmd, unsigned int flags);
  extern int split_huge_page(struct page *page);
  extern void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd);
  #define split_huge_page_pmd(__mm, __pmd)				\
  	do {								\
  		pmd_t *____pmd = (__pmd);				\
  		if (unlikely(pmd_trans_huge(*____pmd)))			\
  			__split_huge_page_pmd(__mm, ____pmd);		\
  	}  while (0)
  #define wait_split_huge_page(__anon_vma, __pmd)				\
  	do {								\
  		pmd_t *____pmd = (__pmd);				\
2b575eb64   Peter Zijlstra   mm: convert anon_...
100
101
  		anon_vma_lock(__anon_vma);				\
  		anon_vma_unlock(__anon_vma);				\
71e3aac07   Andrea Arcangeli   thp: transparent ...
102
103
104
105
106
107
108
109
  		BUG_ON(pmd_trans_splitting(*____pmd) ||			\
  		       pmd_trans_huge(*____pmd));			\
  	} while (0)
  #define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
  #define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
  #if HPAGE_PMD_ORDER > MAX_ORDER
  #error "hugepages can't be allocated by the buddy allocator"
  #endif
60ab3244e   Andrea Arcangeli   thp: khugepaged: ...
110
111
  extern int hugepage_madvise(struct vm_area_struct *vma,
  			    unsigned long *vm_flags, int advice);
94fcc585f   Andrea Arcangeli   thp: avoid breaki...
112
113
114
115
116
117
118
119
120
  extern void __vma_adjust_trans_huge(struct vm_area_struct *vma,
  				    unsigned long start,
  				    unsigned long end,
  				    long adjust_next);
  static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
  					 unsigned long start,
  					 unsigned long end,
  					 long adjust_next)
  {
78f11a255   Andrea Arcangeli   mm: thp: fix /dev...
121
  	if (!vma->anon_vma || vma->vm_ops)
94fcc585f   Andrea Arcangeli   thp: avoid breaki...
122
123
124
  		return;
  	__vma_adjust_trans_huge(vma, start, end, adjust_next);
  }
2c888cfbc   Rik van Riel   thp: fix anon mem...
125
126
127
128
129
130
  static inline int hpage_nr_pages(struct page *page)
  {
  	if (unlikely(PageTransHuge(page)))
  		return HPAGE_PMD_NR;
  	return 1;
  }
22e5c47ee   Andrea Arcangeli   thp: add compound...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  static inline struct page *compound_trans_head(struct page *page)
  {
  	if (PageTail(page)) {
  		struct page *head;
  		head = page->first_page;
  		smp_rmb();
  		/*
  		 * head may be a dangling pointer.
  		 * __split_huge_page_refcount clears PageTail before
  		 * overwriting first_page, so if PageTail is still
  		 * there it means the head pointer isn't dangling.
  		 */
  		if (PageTail(page))
  			return head;
  	}
  	return page;
  }
71e3aac07   Andrea Arcangeli   thp: transparent ...
148
149
150
151
  #else /* CONFIG_TRANSPARENT_HUGEPAGE */
  #define HPAGE_PMD_SHIFT ({ BUG(); 0; })
  #define HPAGE_PMD_MASK ({ BUG(); 0; })
  #define HPAGE_PMD_SIZE ({ BUG(); 0; })
2c888cfbc   Rik van Riel   thp: fix anon mem...
152
  #define hpage_nr_pages(x) 1
71e3aac07   Andrea Arcangeli   thp: transparent ...
153
154
155
156
157
158
159
160
161
162
163
  #define transparent_hugepage_enabled(__vma) 0
  
  #define transparent_hugepage_flags 0UL
  static inline int split_huge_page(struct page *page)
  {
  	return 0;
  }
  #define split_huge_page_pmd(__mm, __pmd)	\
  	do { } while (0)
  #define wait_split_huge_page(__anon_vma, __pmd)	\
  	do { } while (0)
22e5c47ee   Andrea Arcangeli   thp: add compound...
164
  #define compound_trans_head(page) compound_head(page)
60ab3244e   Andrea Arcangeli   thp: khugepaged: ...
165
166
  static inline int hugepage_madvise(struct vm_area_struct *vma,
  				   unsigned long *vm_flags, int advice)
0af4e98b6   Andrea Arcangeli   thp: madvise(MADV...
167
168
169
170
  {
  	BUG();
  	return 0;
  }
94fcc585f   Andrea Arcangeli   thp: avoid breaki...
171
172
173
174
175
176
  static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
  					 unsigned long start,
  					 unsigned long end,
  					 long adjust_next)
  {
  }
71e3aac07   Andrea Arcangeli   thp: transparent ...
177
178
179
  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  
  #endif /* _LINUX_HUGE_MM_H */