]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
pagemap: fix wrong KPF_THP on slab pages
authorNaoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Wed, 26 Sep 2012 01:32:55 +0000 (11:32 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 27 Sep 2012 06:37:53 +0000 (16:37 +1000)
KPF_THP can be set on non-huge compound pages like slab pages, because
PageTransCompound only sees PG_head and PG_tail. Obviously this is a bug
and breaks user space applications which look for thp via /proc/kpageflags.
Currently thp is constructed only on anonymous pages, so this patch makes
KPF_THP be set when both of PageAnon and PageTransCompound are true.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Andi Kleen <andi.kleen@intel.com>
Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/page.c

index 7fcd0d60a9680ae1eb4998633c51ea90e730209f..f7cd2f6c0a58a13dec5a9c98a27df8104f85ebd3 100644 (file)
@@ -115,7 +115,12 @@ u64 stable_page_flags(struct page *page)
                u |= 1 << KPF_COMPOUND_TAIL;
        if (PageHuge(page))
                u |= 1 << KPF_HUGE;
-       else if (PageTransCompound(page))
+       /*
+        * Since THP is relevant only for anonymous pages so far, we check it
+        * explicitly with PageAnon. Otherwise thp is confounded with non-huge
+        * compound pages like slab pages.
+        */
+       else if (PageTransCompound(page) && PageAnon(page))
                u |= 1 << KPF_THP;
 
        /*