亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 4196 | 回復(fù): 10
打印 上一主題 下一主題

請(qǐng)教函數(shù)is_page_cache_freeable [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-07-28 15:29 |只看該作者 |倒序?yàn)g覽
該函數(shù)實(shí)現(xiàn)為:
static inline int is_page_cache_freeable(struct page *page)
{
        return page_count(page) - !!PagePrivate(page) == 2;
}
為什么差為2就表示能回收呢?page的_count初始化時(shí),默認(rèn)值是-1吧? 不是很理解這個(gè)函數(shù)。請(qǐng)兄弟們指教。

謝謝

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-07-28 22:34 |只看該作者
看不懂怎么會(huì)有兩個(gè)!呢?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-07-29 09:46 |只看該作者
我記得2個(gè)!!就是使數(shù)值為0或者1其中一個(gè) = =

不知道對(duì)不對(duì)~

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-07-29 11:17 |只看該作者
原帖由 xiegang112 于 2009-7-28 15:29 發(fā)表
該函數(shù)實(shí)現(xiàn)為:
static inline int is_page_cache_freeable(struct page *page)
{
        return page_count(page) - !!PagePrivate(page) == 2;
}
為什么差為2就表示能回收呢?page的_count初始化時(shí),默認(rèn)值是- ...


ULK3rd上說(shuō)
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的話,在加入一個(gè)page的時(shí)候會(huì)increase page->_count (see add_to_page_cache_locked), 另外,如果這個(gè)page上分配了buffer_head的話,也會(huì)增加page->_count (see attach_page_buffers).最初在init zone的時(shí)候把page加到某個(gè)zone的freelist的時(shí)會(huì)把page count初始值設(shè)為1.

所以這個(gè)page如果只屬于page cache的話,要么page count是2,要么是3。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-07-29 11:18 |只看該作者
原帖由 superfight 于 2009-7-29 09:46 發(fā)表
我記得2個(gè)!!就是使數(shù)值為0或者1其中一個(gè) = =

不知道對(duì)不對(duì)~


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

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-07-29 14:01 |只看該作者

回復(fù) #4 eexplorer 的帖子

4樓解釋的很好。不過(guò)有個(gè)地方好像有點(diǎn)問(wèn)題。page在從budy系統(tǒng)中分配出來(lái)的時(shí)候,count為1. 但是再加入page cache后,count為3.因?yàn)榧尤雙age cache時(shí),也會(huì)把page一并加入zone的lru(add_to_page_cache_lru)。這個(gè)時(shí)候_count是3.如果加上buffer head后,應(yīng)該是4.
page_count(page) - !!PagePrivate(page) == 2可以理解為,3-1和2-0.
3-1是指,page在page cache中,又在lru中,并且page的private有mapping的私有數(shù)據(jù)。這種情況下,應(yīng)該不能回收吧?
2-0是指,page只在lru中,已經(jīng)從page cache中release。其private上沒(méi)有mapping的私有數(shù)據(jù)。這個(gè)情況可以回收。
不太理解3-1的情況。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-07-29 16:45 |只看該作者
原帖由 xiegang112 于 2009-7-29 14:01 發(fā)表
4樓解釋的很好。不過(guò)有個(gè)地方好像有點(diǎn)問(wèn)題。page在從budy系統(tǒng)中分配出來(lái)的時(shí)候,count為1. 但是再加入page cache后,count為3.因?yàn)榧尤雙age cache時(shí),也會(huì)把page一并加入zone的lru(add_to_page_cache_lru)。這 ...



查了一下add_to_page_cache_lru的caller, add_to_page_cache_lru里雖然page count加了2,但是有一次是為了caller所加的。也就是說(shuō)一旦caller把page加進(jìn)了page cache, 它就可以使用這個(gè)page, 使用完后,caller必須調(diào)用page_cache_release(page) to decrease page count. 所以把一個(gè)page加進(jìn)page cache時(shí),page count只增加了1次。

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

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

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2009-07-29 20:31 |只看該作者

回復(fù) #7 eexplorer 的帖子

你所說(shuō)的caller是指像find_or_create_page這樣的函數(shù)嗎?但是它把頁(yè)面加入page。悖幔悖瑁搴,并沒(méi)有釋放頁(yè)面呀:
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說(shuō)的是只有分配失敗才會(huì)對(duì)page。颍澹欤澹幔螅灏桑ǎ氨硎境晒Γ。其他的一些caller,如grab_cache_page_nowait也是這樣的。所以通過(guò)add_to_page_cache_lru把page加入page。悖幔悖瑁搴停欤颍鹾螅洌悖铮酰睿糁祽(yīng)該是3.而加入了buffer。瑁澹幔涞模穑幔纾鍛(yīng)該是4.這個(gè)可以等下調(diào)試看看。

lru中的page不一定是page cache中的。它還包括一些匿名頁(yè)。這些匿名頁(yè)在交換是,會(huì)通過(guò)add_to_swap_cache放入swap。悖幔悖瑁。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2009-07-29 21:12 |只看該作者

回復(fù) #8 xiegang112 的帖子

調(diào)試了一下,當(dāng)is_page_cache_freeable為真時(shí),page的_count=3.并且private非0.也就是3-1的情況。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2009-07-29 22:24 |只看該作者
原帖由 xiegang112 于 2009-7-29 20:31 發(fā)表
你所說(shuō)的caller是指像find_or_create_page這樣的函數(shù)嗎?但是它把頁(yè)面加入page。悖幔悖瑁搴,并沒(méi)有釋放頁(yè)面呀:
err = add_to_page_cache_lru(page, mapping, index,
                        (gfp_mask & GFP_RECLAIM_MASK ...


sorry, 我可能沒(méi)說(shuō)清楚:
再往上查,f.e grow_buffers -> grow_dev_page -> find_or_create_page。
grab_cache_page_nowait 也一樣,你需要查一下它的caller如何處理grab的page.

我是說(shuō)在page cache中的頁(yè)一定在lru list中(因?yàn)閍dd_to_page_cache_lru會(huì)把它加入到lru中),而lru list中的頁(yè)不一定在page cache中,如你所說(shuō)的anonymous page.
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP