Commit 822cdd11 authored by Kirill A. Shutemov's avatar Kirill A. Shutemov Committed by Linus Torvalds

page-flags: look at head page if the flag is encoded in page->mapping

PageAnon() and PageKsm() look at lower bits of page->mapping to check if
the page is Anon or KSM.  page->mapping can be overloaded in tail pages.

Let's always look at head page to avoid false-positives.
Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Rik van Riel <riel@redhat.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Christoph Lameter <cl@linux.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Steve Capper <steve.capper@linaro.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Jerome Marchand <jmarchan@redhat.com>
Cc: Jérôme Glisse <jglisse@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d2998c4d
...@@ -176,7 +176,7 @@ static inline int PageCompound(struct page *page) ...@@ -176,7 +176,7 @@ static inline int PageCompound(struct page *page)
#define PF_NO_TAIL(page, enforce) ({ \ #define PF_NO_TAIL(page, enforce) ({ \
VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \ VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \
compound_head(page);}) compound_head(page);})
#define PF_NO_COMPOUND(page, enforce) ({ \ #define PF_NO_COMPOUND(page, enforce) ({ \
VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \ VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \
page;}) page;})
...@@ -381,6 +381,7 @@ PAGEFLAG(Idle, idle, PF_ANY) ...@@ -381,6 +381,7 @@ PAGEFLAG(Idle, idle, PF_ANY)
static inline int PageAnon(struct page *page) static inline int PageAnon(struct page *page)
{ {
page = compound_head(page);
return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0; return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0;
} }
...@@ -393,6 +394,7 @@ static inline int PageAnon(struct page *page) ...@@ -393,6 +394,7 @@ static inline int PageAnon(struct page *page)
*/ */
static inline int PageKsm(struct page *page) static inline int PageKsm(struct page *page)
{ {
page = compound_head(page);
return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) == return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) ==
(PAGE_MAPPING_ANON | PAGE_MAPPING_KSM); (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment