具体是通过page_is_buddy 来判断的,这个函数会做一些检测,
725 static inline int page_is_buddy(struct page *page, struct page *buddy,
726 unsigned int order)
727 {
728 if (!pfn_valid_within(page_to_pfn(buddy)))
729 return 0;
730
731 if (page_is_guard(buddy) && page_order(buddy) == order) {
732 if (page_zone_id(page) != page_zone_id(buddy))
733 return 0;
734
735 VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy);
736
737 return 1;
738 }
739
740 if (PageBuddy(buddy) && page_order(buddy) == order) {
741 /*
742 * zone check is done late to avoid uselessly
743 * calculating zone/node ids for pages that could
744 * never merge.
745 */
746 if (page_zone_id(page) != page_zone_id(buddy))
747 return 0;
748
749 VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy);
750
751 return 1;
752 }
753 return 0;
754 }
最重要的是740的pageBuddy()这个函数。具体是怎么判断的呢?哈哈哈 code如下:
606 static inline int PageBuddy(struct page *page)
607 {
608 return atomic_read(&page->_mapcount) == PAGE_BUDDY_MAPCOUNT_VALUE;
609 }
610
611 static inline void __SetPageBuddy(struct page *page)
612 {
613 VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);
614 atomic_set(&page->_mapcount, PAGE_BUDDY_MAPCOUNT_VALUE);
615 }
可以看到只要page->_mapcount==PAGE_BUDDY_MAPCOUNT_VALUE 就认为是buddy page
725 static inline int page_is_buddy(struct page *page, struct page *buddy,
726 unsigned int order)
727 {
728 if (!pfn_valid_within(page_to_pfn(buddy)))
729 return 0;
730
731 if (page_is_guard(buddy) && page_order(buddy) == order) {
732 if (page_zone_id(page) != page_zone_id(buddy))
733 return 0;
734
735 VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy);
736
737 return 1;
738 }
739
740 if (PageBuddy(buddy) && page_order(buddy) == order) {
741 /*
742 * zone check is done late to avoid uselessly
743 * calculating zone/node ids for pages that could
744 * never merge.
745 */
746 if (page_zone_id(page) != page_zone_id(buddy))
747 return 0;
748
749 VM_BUG_ON_PAGE(page_count(buddy) != 0, buddy);
750
751 return 1;
752 }
753 return 0;
754 }
最重要的是740的pageBuddy()这个函数。具体是怎么判断的呢?哈哈哈 code如下:
606 static inline int PageBuddy(struct page *page)
607 {
608 return atomic_read(&page->_mapcount) == PAGE_BUDDY_MAPCOUNT_VALUE;
609 }
610
611 static inline void __SetPageBuddy(struct page *page)
612 {
613 VM_BUG_ON_PAGE(atomic_read(&page->_mapcount) != -1, page);
614 atomic_set(&page->_mapcount, PAGE_BUDDY_MAPCOUNT_VALUE);
615 }
可以看到只要page->_mapcount==PAGE_BUDDY_MAPCOUNT_VALUE 就认为是buddy page