thp: add compound_trans_head() helper
[linux-2.6.git] / mm / ksm.c
index 4d5a681..33781de 100644 (file)
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -415,20 +415,11 @@ out:
 static struct page *page_trans_compound_anon(struct page *page)
 {
        if (PageTransCompound(page)) {
-               struct page *head;
-               head = compound_head(page);
+               struct page *head = compound_trans_head(page);
                /*
-                * 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.
+                * head may actually be splitted and freed from under
+                * us but it's ok here.
                 */
-               if (head != page) {
-                       smp_rmb();
-                       if (!PageTransCompound(page))
-                               return NULL;
-               }
                if (PageAnon(head))
                        return head;
        }