Commit a08d93e5 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Linus Torvalds

mm: simplify PageDoubleMap with PF_SECOND policy

Introduce the new page policy of PF_SECOND which lets us use the normal
pageflags generation machinery to create the various DoubleMap
manipulation functions.
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Reviewed-by: default avatarZi Yan <ziy@nvidia.com>
Link: https://lkml.kernel.org/r/20200629151933.15671-3-willy@infradead.orgSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e18c45ff
...@@ -235,6 +235,9 @@ static inline void page_init_poison(struct page *page, size_t size) ...@@ -235,6 +235,9 @@ static inline void page_init_poison(struct page *page, size_t size)
* *
* PF_NO_COMPOUND: * PF_NO_COMPOUND:
* the page flag is not relevant for compound pages. * the page flag is not relevant for compound pages.
*
* PF_SECOND:
* the page flag is stored in the first tail page.
*/ */
#define PF_POISONED_CHECK(page) ({ \ #define PF_POISONED_CHECK(page) ({ \
VM_BUG_ON_PGFLAGS(PagePoisoned(page), page); \ VM_BUG_ON_PGFLAGS(PagePoisoned(page), page); \
...@@ -250,6 +253,9 @@ static inline void page_init_poison(struct page *page, size_t size) ...@@ -250,6 +253,9 @@ static inline void page_init_poison(struct page *page, size_t size)
#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); \
PF_POISONED_CHECK(page); }) PF_POISONED_CHECK(page); })
#define PF_SECOND(page, enforce) ({ \
VM_BUG_ON_PGFLAGS(!PageHead(page), page); \
PF_POISONED_CHECK(&page[1]); })
/* /*
* Macros to create function definitions for page flags * Macros to create function definitions for page flags
...@@ -688,42 +694,15 @@ static inline int PageTransTail(struct page *page) ...@@ -688,42 +694,15 @@ static inline int PageTransTail(struct page *page)
* *
* See also __split_huge_pmd_locked() and page_remove_anon_compound_rmap(). * See also __split_huge_pmd_locked() and page_remove_anon_compound_rmap().
*/ */
static inline int PageDoubleMap(struct page *page) PAGEFLAG(DoubleMap, double_map, PF_SECOND)
{ TESTSCFLAG(DoubleMap, double_map, PF_SECOND)
return PageHead(page) && test_bit(PG_double_map, &page[1].flags);
}
static inline void SetPageDoubleMap(struct page *page)
{
VM_BUG_ON_PAGE(!PageHead(page), page);
set_bit(PG_double_map, &page[1].flags);
}
static inline void ClearPageDoubleMap(struct page *page)
{
VM_BUG_ON_PAGE(!PageHead(page), page);
clear_bit(PG_double_map, &page[1].flags);
}
static inline int TestSetPageDoubleMap(struct page *page)
{
VM_BUG_ON_PAGE(!PageHead(page), page);
return test_and_set_bit(PG_double_map, &page[1].flags);
}
static inline int TestClearPageDoubleMap(struct page *page)
{
VM_BUG_ON_PAGE(!PageHead(page), page);
return test_and_clear_bit(PG_double_map, &page[1].flags);
}
#else #else
TESTPAGEFLAG_FALSE(TransHuge) TESTPAGEFLAG_FALSE(TransHuge)
TESTPAGEFLAG_FALSE(TransCompound) TESTPAGEFLAG_FALSE(TransCompound)
TESTPAGEFLAG_FALSE(TransCompoundMap) TESTPAGEFLAG_FALSE(TransCompoundMap)
TESTPAGEFLAG_FALSE(TransTail) TESTPAGEFLAG_FALSE(TransTail)
PAGEFLAG_FALSE(DoubleMap) PAGEFLAG_FALSE(DoubleMap)
TESTSETFLAG_FALSE(DoubleMap) TESTSCFLAG_FALSE(DoubleMap)
TESTCLEARFLAG_FALSE(DoubleMap)
#endif #endif
/* /*
...@@ -888,6 +867,7 @@ static inline int page_has_private(struct page *page) ...@@ -888,6 +867,7 @@ static inline int page_has_private(struct page *page)
#undef PF_ONLY_HEAD #undef PF_ONLY_HEAD
#undef PF_NO_TAIL #undef PF_NO_TAIL
#undef PF_NO_COMPOUND #undef PF_NO_COMPOUND
#undef PF_SECOND
#endif /* !__GENERATING_BOUNDS_H */ #endif /* !__GENERATING_BOUNDS_H */
#endif /* PAGE_FLAGS_H */ #endif /* PAGE_FLAGS_H */
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