]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - include/linux/huge_mm.h
thp: add compound_trans_head() helper
[mv-sheeva.git] / include / linux / huge_mm.h
index bddfba1d7b85f3c2d48f1274f21935e1da4bd136..8e6c8c42bc3cc62614a68152f5a5fcfa934d9cb2 100644 (file)
@@ -126,6 +126,23 @@ static inline int hpage_nr_pages(struct page *page)
                return HPAGE_PMD_NR;
        return 1;
 }
+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;
+}
 #else /* CONFIG_TRANSPARENT_HUGEPAGE */
 #define HPAGE_PMD_SHIFT ({ BUG(); 0; })
 #define HPAGE_PMD_MASK ({ BUG(); 0; })
@@ -144,6 +161,7 @@ static inline int split_huge_page(struct page *page)
        do { } while (0)
 #define wait_split_huge_page(__anon_vma, __pmd)        \
        do { } while (0)
+#define compound_trans_head(page) compound_head(page)
 static inline int hugepage_madvise(struct vm_area_struct *vma,
                                   unsigned long *vm_flags, int advice)
 {