免费注册 查看新帖 |

Chinaunix

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

请教函数is_page_cache_freeable [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-28 15:29 |只看该作者 |倒序浏览
该函数实现为:
static inline int is_page_cache_freeable(struct page *page)
{
        return page_count(page) - !!PagePrivate(page) == 2;
}
为什么差为2就表示能回收呢?page的_count初始化时,默认值是-1吧? 不是很理解这个函数。请兄弟们指教。

谢谢

论坛徽章:
0
2 [报告]
发表于 2009-07-28 22:34 |只看该作者
看不懂怎么会有两个!!呢?

论坛徽章:
0
3 [报告]
发表于 2009-07-29 09:46 |只看该作者
我记得2个!!就是使数值为0或者1其中一个 = =

不知道对不对~

论坛徽章:
0
4 [报告]
发表于 2009-07-29 11:17 |只看该作者
原帖由 xiegang112 于 2009-7-28 15:29 发表
该函数实现为:
static inline int is_page_cache_freeable(struct page *page)
{
        return page_count(page) - !!PagePrivate(page) == 2;
}
为什么差为2就表示能回收呢?page的_count初始化时,默认值是- ...


ULK3rd上说
Checks that the page is included in the page cache or in the swap cache (see the section "The Swap Cache" later in this chapter). Moreover, checks that the page is owned only by the page cache or the swap cache and the PFRA. Returns PAGE_KEEP if a check has failed.

swap cache不太熟,page cache的话,在加入一个page的时候会increase page->_count (see add_to_page_cache_locked), 另外,如果这个page上分配了buffer_head的话,也会增加page->_count (see attach_page_buffers).最初在init zone的时候把page加到某个zone的freelist的时会把page count初始值设为1.

所以这个page如果只属于page cache的话,要么page count是2,要么是3。

论坛徽章:
0
5 [报告]
发表于 2009-07-29 11:18 |只看该作者
原帖由 superfight 于 2009-7-29 09:46 发表
我记得2个!!就是使数值为0或者1其中一个 = =

不知道对不对~


是的, 0->0, others->1

论坛徽章:
0
6 [报告]
发表于 2009-07-29 14:01 |只看该作者

回复 #4 eexplorer 的帖子

4楼解释的很好。不过有个地方好像有点问题。page在从budy系统中分配出来的时候,count为1. 但是再加入page cache后,count为3.因为加入page cache时,也会把page一并加入zone的lru(add_to_page_cache_lru)。这个时候_count是3.如果加上buffer head后,应该是4.
page_count(page) - !!PagePrivate(page) == 2可以理解为,3-1和2-0.
3-1是指,page在page cache中,又在lru中,并且page的private有mapping的私有数据。这种情况下,应该不能回收吧?
2-0是指,page只在lru中,已经从page cache中release。其private上没有mapping的私有数据。这个情况可以回收。
不太理解3-1的情况。

论坛徽章:
0
7 [报告]
发表于 2009-07-29 16:45 |只看该作者
原帖由 xiegang112 于 2009-7-29 14:01 发表
4楼解释的很好。不过有个地方好像有点问题。page在从budy系统中分配出来的时候,count为1. 但是再加入page cache后,count为3.因为加入page cache时,也会把page一并加入zone的lru(add_to_page_cache_lru)。这 ...



查了一下add_to_page_cache_lru的caller, add_to_page_cache_lru里虽然page count加了2,但是有一次是为了caller所加的。也就是说一旦caller把page加进了page cache, 它就可以使用这个page, 使用完后,caller必须调用page_cache_release(page) to decrease page count. 所以把一个page加进page cache时,page count只增加了1次。

是不是可以这样理解,在lru list里的page肯定是在page cache中的,所以只要page count +1就可以了。

所以3是指,在zone, page cache (and lru中),以及有buffer_head attached.
kernel在回收page的时候,write out page if page is dirty, and then kernelwill free buffer_head if exists (see pageout())。

论坛徽章:
0
8 [报告]
发表于 2009-07-29 20:31 |只看该作者

回复 #7 eexplorer 的帖子

你所说的caller是指像find_or_create_page这样的函数吗?但是它把页面加入page cache后,并没有释放页面呀:
err = add_to_page_cache_lru(page, mapping, index,
                        (gfp_mask & GFP_RECLAIM_MASK));
                if (unlikely(err)) {
                        page_cache_release(page);
                        page = NULL;
                        if (err == -EEXIST)
                                goto repeat;
                }
这段code说的是只有分配失败才会对page release吧(0表示成功)。其他的一些caller,如grab_cache_page_nowait也是这样的。所以通过add_to_page_cache_lru把page加入page cache和lru后,其count值应该是3.而加入了buffer head的page应该是4.这个可以等下调试看看。

lru中的page不一定是page cache中的。它还包括一些匿名页。这些匿名页在交换是,会通过add_to_swap_cache放入swap cache。

论坛徽章:
0
9 [报告]
发表于 2009-07-29 21:12 |只看该作者

回复 #8 xiegang112 的帖子

调试了一下,当is_page_cache_freeable为真时,page的_count=3.并且private非0.也就是3-1的情况。

论坛徽章:
0
10 [报告]
发表于 2009-07-29 22:24 |只看该作者
原帖由 xiegang112 于 2009-7-29 20:31 发表
你所说的caller是指像find_or_create_page这样的函数吗?但是它把页面加入page cache后,并没有释放页面呀:
err = add_to_page_cache_lru(page, mapping, index,
                        (gfp_mask & GFP_RECLAIM_MASK ...


sorry, 我可能没说清楚:
再往上查,f.e grow_buffers -> grow_dev_page -> find_or_create_page。
grab_cache_page_nowait 也一样,你需要查一下它的caller如何处理grab的page.

我是说在page cache中的页一定在lru list中(因为add_to_page_cache_lru会把它加入到lru中),而lru list中的页不一定在page cache中,如你所说的anonymous page.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP