遇到一个需求,需要在内核模块中统计page cache页面的数量。

此刻,需要遍历所有的page,下面是相关代码:

1
2
3
4
5
6
7
8
9
unsigned scan_pfn=0;
for(;scan_pfn < max_pfn; scan_pfn++){
if(pfn_valid(scan_pfn)){
page = pfn_to_page(scan_pfn);
if(page){
......
}
}
}

从上述代码可以看出,通过max_pfn即可获取最大的page frame号。

判断page是否为page cache可使用下面的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
inline bool is_file_page(struct page* pg)
{
bool ret = false;
struct address_space *mapping = NULL;
if(pg && !PageAnon(pg) && !PageSwapCache(pg)) {
mapping = page_file_mapping(pg);
if (mapping) {
BUG_ON(!mapping->host);
}
ret = mapping;
}
return ret;
}