summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2011-01-13 15:47:20 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-13 17:32:48 -0800
commit22e5c47ee238abe636655c3862ed28d6eb084ad4 (patch)
tree4a4e7d330cbef6c99a8914de482eb0e8daba2485 /mm
parent29ad768cfc08611a4c1070d0f13f82eeea2bac7b (diff)
downloadlinux-22e5c47ee238abe636655c3862ed28d6eb084ad4.tar.bz2
thp: add compound_trans_head() helper
Cleanup some code with common compound_trans_head helper. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Johannes Weiner <jweiner@redhat.com> Cc: Marcelo Tosatti <mtosatti@redhat.com> Cc: Avi Kivity <avi@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/ksm.c15
1 files changed, 3 insertions, 12 deletions
diff --git a/mm/ksm.c b/mm/ksm.c
index 4d5a681923bb..33781de0b6bf 100644
--- 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;
}