@@ -604,54 +604,45 @@ TESTPAGEFLAG_FALSE(DoubleMap)
604
604
#endif
605
605
606
606
/*
607
- * PageBuddy() indicate that the page is free and in the buddy system
608
- * (see mm/page_alloc.c).
609
- *
610
- * PAGE_BUDDY_MAPCOUNT_VALUE must be <= -2 but better not too close to
611
- * -2 so that an underflow of the page_mapcount() won't be mistaken
612
- * for a genuine PAGE_BUDDY_MAPCOUNT_VALUE. -128 can be created very
613
- * efficiently by most CPU architectures.
607
+ * For pages that are never mapped to userspace, page->mapcount may be
608
+ * used for storing extra information about page type. Any value used
609
+ * for this purpose must be <= -2, but it's better start not too close
610
+ * to -2 so that an underflow of the page_mapcount() won't be mistaken
611
+ * for a special page.
614
612
*/
615
- #define PAGE_BUDDY_MAPCOUNT_VALUE (-128)
616
-
617
- static inline int PageBuddy (struct page * page )
618
- {
619
- return atomic_read (& page -> _mapcount ) == PAGE_BUDDY_MAPCOUNT_VALUE ;
613
+ #define PAGE_MAPCOUNT_OPS (uname , lname ) \
614
+ static __always_inline int Page##uname(struct page *page) \
615
+ { \
616
+ return atomic_read(&page->_mapcount) == \
617
+ PAGE_##lname##_MAPCOUNT_VALUE; \
618
+ } \
619
+ static __always_inline void __SetPage##uname(struct page *page) \
620
+ { \
621
+ VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page); \
622
+ atomic_set(&page->_mapcount, PAGE_##lname##_MAPCOUNT_VALUE); \
623
+ } \
624
+ static __always_inline void __ClearPage##uname(struct page *page) \
625
+ { \
626
+ VM_BUG_ON_PAGE(!Page##uname(page), page); \
627
+ atomic_set(&page->_mapcount, -1); \
620
628
}
621
629
622
- static inline void __SetPageBuddy (struct page * page )
623
- {
624
- VM_BUG_ON_PAGE (atomic_read (& page -> _mapcount ) != -1 , page );
625
- atomic_set (& page -> _mapcount , PAGE_BUDDY_MAPCOUNT_VALUE );
626
- }
630
+ /*
631
+ * PageBuddy() indicate that the page is free and in the buddy system
632
+ * (see mm/page_alloc.c).
633
+ */
634
+ #define PAGE_BUDDY_MAPCOUNT_VALUE (-128)
635
+ PAGE_MAPCOUNT_OPS (Buddy , BUDDY )
627
636
628
- static inline void __ClearPageBuddy (struct page * page )
629
- {
630
- VM_BUG_ON_PAGE (!PageBuddy (page ), page );
631
- atomic_set (& page -> _mapcount , -1 );
632
- }
637
+ /*
638
+ * PageBalloon() is set on pages that are on the balloon page list
639
+ * (see mm/balloon_compaction.c).
640
+ */
641
+ #define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
642
+ PAGE_MAPCOUNT_OPS (Balloon , BALLOON )
633
643
634
644
extern bool is_free_buddy_page (struct page * page );
635
645
636
- #define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
637
-
638
- static inline int PageBalloon (struct page * page )
639
- {
640
- return atomic_read (& page -> _mapcount ) == PAGE_BALLOON_MAPCOUNT_VALUE ;
641
- }
642
-
643
- static inline void __SetPageBalloon (struct page * page )
644
- {
645
- VM_BUG_ON_PAGE (atomic_read (& page -> _mapcount ) != -1 , page );
646
- atomic_set (& page -> _mapcount , PAGE_BALLOON_MAPCOUNT_VALUE );
647
- }
648
-
649
- static inline void __ClearPageBalloon (struct page * page )
650
- {
651
- VM_BUG_ON_PAGE (!PageBalloon (page ), page );
652
- atomic_set (& page -> _mapcount , -1 );
653
- }
654
-
655
646
__PAGEFLAG (Isolated , isolated , PF_ANY );
656
647
657
648
/*
0 commit comments