免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3770 | 回复: 5
打印 上一主题 下一主题

[内存管理] page->_count 与 page reclaim [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-06 17:53 |只看该作者 |倒序浏览
page->_count 是某个页标识符的使用计数(usage count).

当一个页从伙伴系统中分配后,page->_count 设置为1. 然后在使用该页的时候,get_page()和put_page()/put_page_testzero()成对使用。

某个页被回收到伙伴系统的前提是该页的page->_count为0. 例如:
  1. void __free_pages(struct page *page, unsigned int order)
  2. {
  3.         if (put_page_testzero(page)) {
  4.                 if (order == 0)
  5.                         free_hot_cold_page(page, 0);
  6.                 else
  7.                         __free_pages_ok(page, order);
  8.         }
  9. }
复制代码
我困惑的是:如果get_page()和put_page()成对使用的话,page->_count何时才能够为0以被回收呢?

谢谢。

论坛徽章:
0
2 [报告]
发表于 2013-02-06 20:59 |只看该作者
本帖最后由 鬼鬼一哈 于 2013-02-06 21:00 编辑

page->_count何时才能够为0以被回收?好像只要小于等于2就可以被回收。。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2013-02-07 11:07 |只看该作者
回复 1# a_kernel_newbie
我困惑的是:如果get_page()和put_page()成对使用的话,page->_count何时才能够为0以被回收呢?

看看put_page_testzero的实现,从名字也能看出,是先put_page,然后testzero。
  1. static inline int put_page_testzero(struct page *page)                                                              
  2. {      
  3.         VM_BUG_ON(atomic_read(&page->_count) == 0);                                                                 
  4.         return atomic_dec_and_test(&page->_count);                                                                  
  5. }                                                                                                                  
复制代码
所有当page->_count == 1的时候,进行回收。而不是等于0的时候回收。
   

论坛徽章:
0
4 [报告]
发表于 2013-02-07 12:00 |只看该作者
回复 3# 瀚海书香

只有put_page_testzero() 返回true的时候,才回收页面。难道不是page->_count等于0的时候?

  1. #define atomic_dec_and_test(v)  (atomic_sub_return(1, v) == 0)
复制代码

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-02-07 12:59 |只看该作者
回复 4# a_kernel_newbie
只有put_page_testzero() 返回true的时候,才回收页面。难道不是page->_count等于0的时候?

看看atomic_sub_return(1, v) == 0的含义。是判断当前值减1后是否为0,也就是判断当前值是否为1啊。

   

论坛徽章:
0
6 [报告]
发表于 2013-02-07 13:23 |只看该作者
本帖最后由 a_kernel_newbie 于 2013-02-07 13:27 编辑

回复 5# 瀚海书香

抱歉, 也许是我表达的有问题吧。

    get_page()和put_page()或者put_page_testzero() 总是成对使用。在put_page_testzero之前,已经有了get_page().

这样,假若page->_count=1,那么get_page()后,page->_count=2。这样,put_page_testzero(),永远也不会为true.


所以,我觉得他们可能不总是成对使用(特别是在回收页面的逻辑中)。我再确认一下相关的代码吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP