diff options
Diffstat (limited to 'include/linux/huge_mm.h')
-rw-r--r-- | include/linux/huge_mm.h | 41 |
1 files changed, 0 insertions, 41 deletions
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index db512014e061..b826239bdce0 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h | |||
@@ -157,46 +157,6 @@ static inline int hpage_nr_pages(struct page *page) | |||
157 | return HPAGE_PMD_NR; | 157 | return HPAGE_PMD_NR; |
158 | return 1; | 158 | return 1; |
159 | } | 159 | } |
160 | /* | ||
161 | * compound_trans_head() should be used instead of compound_head(), | ||
162 | * whenever the "page" passed as parameter could be the tail of a | ||
163 | * transparent hugepage that could be undergoing a | ||
164 | * __split_huge_page_refcount(). The page structure layout often | ||
165 | * changes across releases and it makes extensive use of unions. So if | ||
166 | * the page structure layout will change in a way that | ||
167 | * page->first_page gets clobbered by __split_huge_page_refcount, the | ||
168 | * implementation making use of smp_rmb() will be required. | ||
169 | * | ||
170 | * Currently we define compound_trans_head as compound_head, because | ||
171 | * page->private is in the same union with page->first_page, and | ||
172 | * page->private isn't clobbered. However this also means we're | ||
173 | * currently leaving dirt into the page->private field of anonymous | ||
174 | * pages resulting from a THP split, instead of setting page->private | ||
175 | * to zero like for every other page that has PG_private not set. But | ||
176 | * anonymous pages don't use page->private so this is not a problem. | ||
177 | */ | ||
178 | #if 0 | ||
179 | /* This will be needed if page->private will be clobbered in split_huge_page */ | ||
180 | static inline struct page *compound_trans_head(struct page *page) | ||
181 | { | ||
182 | if (PageTail(page)) { | ||
183 | struct page *head; | ||
184 | head = page->first_page; | ||
185 | smp_rmb(); | ||
186 | /* | ||
187 | * head may be a dangling pointer. | ||
188 | * __split_huge_page_refcount clears PageTail before | ||
189 | * overwriting first_page, so if PageTail is still | ||
190 | * there it means the head pointer isn't dangling. | ||
191 | */ | ||
192 | if (PageTail(page)) | ||
193 | return head; | ||
194 | } | ||
195 | return page; | ||
196 | } | ||
197 | #else | ||
198 | #define compound_trans_head(page) compound_head(page) | ||
199 | #endif | ||
200 | 160 | ||
201 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | 161 | extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
202 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); | 162 | unsigned long addr, pmd_t pmd, pmd_t *pmdp); |
@@ -226,7 +186,6 @@ static inline int split_huge_page(struct page *page) | |||
226 | do { } while (0) | 186 | do { } while (0) |
227 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ | 187 | #define split_huge_page_pmd_mm(__mm, __address, __pmd) \ |
228 | do { } while (0) | 188 | do { } while (0) |
229 | #define compound_trans_head(page) compound_head(page) | ||
230 | static inline int hugepage_madvise(struct vm_area_struct *vma, | 189 | static inline int hugepage_madvise(struct vm_area_struct *vma, |
231 | unsigned long *vm_flags, int advice) | 190 | unsigned long *vm_flags, int advice) |
232 | { | 191 | { |