linux内存管理篇-基本数据结构

include/linux/page_ref.h: page_ref_count用来检测每个page正被多少个进程引用

do_wp_page->wp_can_reuse_anon_folio->folio_ref_count

folio

如果某个函数收到参数是一个指向了 tail page 的 page structure,那么这个函数是应该针对这个 tail page 上执行、还是在整个 compound page 上执行?

任何函数,如果它必须要对整个 compound page 操作,但是却传入的只是一个 tail page,都必须将指向 tail page 结构的指针改为指向 head page 的指针。这通常是通过调用这个函数来实现的:

1
struct page *compound_head(struct page *page);

这个函数相对来说耗时很少,但是在对页面进行一次操作的过程中可能会被调用多次。这使得内核变大了(因为它是一个 inline 函数),并且也变慢了。一个接受 folio page 参数的函数就知道它收到的不会是 tail page,因此不需要调用 compound_head()。这样既节省了时间又节省了内存。

参考

解读 Linux 内存管理新特性 Memory folios

folio 的直接价值

1)减少太多冗余 compound_head 的调用。

2)给开发者提示,看到 folio,就能认定这是 head page。

3)修复潜在的 tail page 导致的 bug。


linux内存管理篇-基本数据结构
http://example.com/linux内存管理篇-基本数据结构/
作者
Yw
发布于
2024年6月3日
许可协议