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: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Zi Yan <ziy@nvidia.com> Link: https://lkml.kernel.org/r/20200629151933.15671-3-willy@infradead.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
e18c45ffcf
commit
a08d93e575
@@ -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)
|
|||||||
#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)
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
#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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user