如何判断一个page是另一个page的buddy呢?
2016-08-03 10:22
806 查看
具体是通过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
相关文章推荐
- 如何判断一个类是从另一个类继承
- php如何判断一个字符串是否包含另一个字符串
- 2个二叉树A、B,树的每个节点上都有一个整数值。如何判断A与B是否其中一个是另一个的子树?
- 如何判断一个序列是否为另一个序列的出栈序列
- Instr函数与InstrRev函数的区别(如何判断一个字符串中存在包含了另一个字符串?)
- Java中如何判断一个集合中的一个元素不在另一个集合中?把不存在的元素移除
- C++11:如何判断一个类是另一个模板类的子类?
- 如何快速判断一个整数是否可以整除另一个整数的理论分析
- 【面试题】如何判断一个类是不是另一个的子类
- php如何判断一个字符串是否包含另一个字符串
- php如何判断一个字符串是否包含另一个字符串
- 如何判断一个时间段是否和另一个时间段冲突?
- php如何判断一个字符串是否包含另一个字符串
- 如何判断一个二叉树是否为另一个二叉树的子树
- [VB.NET]如何在一个窗体M中判断另一个窗体N中是否存在一个名称为A的事件?
- 如何快速判断一个整数是否可以整除另一个整数的理论分析
- 如何判断一个字符串中是否包含另一个字符串
- 如何判断一个GPS点是否在以另一个GPS点为圆心100米为半径的圆内(Java代码)
- 如何判断一个网页是不是一个Blog的首页?
- unix下如何判断一个文件夹是否存在?