如何判断一个page是另一个page的buddy呢?

具体是通过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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值