您的位置:首页 > 其它

如何判断一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: