aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/huge_mm.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index bddfba1d7b85..8e6c8c42bc3c 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -126,6 +126,23 @@ static inline int hpage_nr_pages(struct page *page)
126 return HPAGE_PMD_NR; 126 return HPAGE_PMD_NR;
127 return 1; 127 return 1;
128} 128}
129static inline struct page *compound_trans_head(struct page *page)
130{
131 if (PageTail(page)) {
132 struct page *head;
133 head = page->first_page;
134 smp_rmb();
135 /*
136 * head may be a dangling pointer.
137 * __split_huge_page_refcount clears PageTail before
138 * overwriting first_page, so if PageTail is still
139 * there it means the head pointer isn't dangling.
140 */
141 if (PageTail(page))
142 return head;
143 }
144 return page;
145}
129#else /* CONFIG_TRANSPARENT_HUGEPAGE */ 146#else /* CONFIG_TRANSPARENT_HUGEPAGE */
130#define HPAGE_PMD_SHIFT ({ BUG(); 0; }) 147#define HPAGE_PMD_SHIFT ({ BUG(); 0; })
131#define HPAGE_PMD_MASK ({ BUG(); 0; }) 148#define HPAGE_PMD_MASK ({ BUG(); 0; })
@@ -144,6 +161,7 @@ static inline int split_huge_page(struct page *page)
144 do { } while (0) 161 do { } while (0)
145#define wait_split_huge_page(__anon_vma, __pmd) \ 162#define wait_split_huge_page(__anon_vma, __pmd) \
146 do { } while (0) 163 do { } while (0)
164#define compound_trans_head(page) compound_head(page)
147static inline int hugepage_madvise(struct vm_area_struct *vma, 165static inline int hugepage_madvise(struct vm_area_struct *vma,
148 unsigned long *vm_flags, int advice) 166 unsigned long *vm_flags, int advice)
149{ 167{