device DAX 的旧填充模型
vmemmap_populate_compound_pages()
一个 compound 区域
head
vmemmap 物理页
first tail
vmemmap 物理页
其余 tail
映射复用 first tail
复用
powerpc radix
自行逐级查页表
找可复用尾页 + 回退
另一套实现
每个 compound 区域预留 2 页 vmemmap
head 与 first tail 各一页
device DAX 专用模型
vmemmap_populate_compound_pages()
head + first tail 两页
powerpc 另有一套查找
并存
HugeTLB section-based
order 记进 mem_section
按元数据复用共享 tail 页
已先行落地
两套填充模型并存
每个区域多预留 1 个 first tail 页
powerpc 自行查页表,与通用逻辑重复
目标:让 DAX 走 HugeTLB 已经建好的 section-based 路径
pgmap->vmemmap_shift
填充 vmemmap 之前写入
mem_section
填充前先落进 section
order
= pgmap->vmemmap_shift
之后记账与 population 都查它
不再靠 pgmap 参数回推
只有整个 section 被同一 compound 几何填满才可优化
同一 compound 几何填满整个 section
可优化
已优化的部分
再向其中添加一段
拒绝
section 清空 → order 随之清掉
vmemmap_shared_tail_page()
与 HugeTLB 同一个共享 tail 页
按 zone 共享
不再预留 DAX 自己的 first tail
device zone 的 struct page
标上 PG_reserved
内存移除时
跳过这些 section 的 poisoning
因为其中的 struct page 可能是共享页
共享 tail 页被每个映射它的 PTE 各拿一次引用
refcount
映射范围足够大 → 引用计数溢出回绕
拿引用改用 try_get_page()
到上限就失败,回滚该 section 已建立的映射
改动前
head
first tail
2 页
预留
改动后
head
first tail
删除
1 页
预留
共享 tail 页覆盖 head 之后的全部 tail
DAX 专属的额外预留消失
powerpc radix 原逻辑
逐级查页表找可复用尾页
找不到还要回退
改用同一个 helper
共享 tail 页由通用代码给出
与通用路径同构
vmemmap_shared_tail_page()
移到公共头文件
CONFIG_VMEMMAP_OPTIMIZATION
配置符号通用化
Generalize HVO for HugeTLB and device DAX
本系列是拆出的第 3 个子系列
HugeTLB 与 device DAX 的进一步合并留给后续
一套 section-based 路径,两个用户共用
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x