From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> PageType is a little hard for GCC to reason about, By checking ((~A) & flag) instead of (flag & (A | MASK) == MASK), GCC can do better optimisations, saving 652 bytes in page_alloc.o (which is a heavy user of PageBuddy). Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> --- include/linux/page-flags.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 1bf83c8fcaa7..8fc0876e2794 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -725,14 +725,14 @@ PAGEFLAG_FALSE(DoubleMap) #define PG_table 0x00000400 #define PG_guard 0x00000800 -#define PageType(page, flag) \ - ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE) - static inline int page_has_type(struct page *page) { return (int)page->page_type < PAGE_MAPCOUNT_RESERVE; } +#define PageType(page, flag) \ + (page_has_type(page) && (~page->page_type & flag)) + #define PAGE_TYPE_OPS(uname, lname) \ static __always_inline int Page##uname(struct page *page) \ { \ -- 2.25.1