-
arm64 上 HVO 支持的新一轮尝试
arm64 修改 vmemmap 页表需要 break-before-make,中间窗口里其他 CPU 访问 vmemmap 会产生不可处理的 fault,HVO 因此长期缺席;改动利用 AF 未置位的翻译不能被 TLB 缓存的硬件规则,以原子清 AF、TLB 无效化、cmpxchg 的序列实现无窗口更新,全部 CPU 支持硬件 AF 时才启用,大部分内存分给 HugeTLB 的机器节省约 1.5% 系统内存
-
readahead 避免逐 folio 的 memcg 回收
readahead 窗口内 folio 逐个 charge,memcg 到上限时每次都触发回收,多任务下同组任务消耗余量导致反复回收甚至 livelock;投机 folio 改为不做 direct reclaim,失败时为窗口剩余部分一次性回收且最多两次,每次 major fault 的回收趟数降约 95%,livelock 消除
-
让 foreign flush 找到正在消亡的 cgwb
memcg 删除后其 wb 被摘出查找树而脏 inode 仍挂在上面,接替容器的 foreign flush 查找失败令写者 stall 数十秒;修复让被杀的 wb 留在查找树直到释放,新 wb 接管槽位时把旧 wb 的全部 inode 批量移交,并清掉旧 wb 残留的脏 IO 记账,各复现场景最坏延迟从数十秒降到约 1 秒
-
加速 move_pages() 的 node 查询
move_pages() 查询模式逐页从顶层 walk 页表并拿放 PTE 锁,每页约 105 ns;改为把连续地址聚成 run 用 walk_page_range() 一次走完,并把 chunk 从 16 页提到 512 页,每页开销 4K 页降到 12.3 ns(约 8.5 倍),THP 降到 2.0 ns(约 45 倍)
-
costly __GFP_NORETRY 分配跳过 direct reclaim 与 direct compaction
iomap 缓冲写的高阶分配在碎片化时反复进入 slowpath 执行 direct reclaim 与 direct compaction 并跨 CPU 发 IPI,pgbench 吞吐降到 0.38 倍;对带 __GFP_NORETRY 的 costly 分配在 slowpath 入口清除 __GFP_DIRECT_RECLAIM,整个 slowpath 按非阻塞处理,后台回收规整照常,TPS 提升 168.3%
-
引入 IO 页表 shrinker
VFIO/iommufd 场景下部分 unmap 清空的 IO 页表目录搁浅到 domain 销毁,内存压力下不可回收并已导致 OOM;为叶子目录引入原生引用计数并注册 domain 感知的 shrinker,空目录由 cmpxchg 认领、切断父槽位、flush IOTLB 并经一个 SRCU 宽限期后放页,RFC 首版用于对齐设计
-
让 swapoff 回读 mm 与 shmem 页时可中断
swapoff 只在 mm 之间查信号、shmem 侧完全不查,进入换出量大的进程或文件后任何事件都无法打断,freezer 的假信号被无视导致 suspend 超时失败;在 mm 侧 PMD 循环与 shmem 侧 folio 批次循环补上 signal_pending 检查,400MiB 匿名页场景冻结耗时从 8.925 秒降到 0.028 秒
-
mTHP 友好的内存 compaction
proactive compaction 的目标从固定 order-9 改为最高 always 使能的 mTHP 阶,触发水位按目标阶比例下调,已达标 folio 跳过迁移,非 costly 阶只扫 movable 块;kcompactd CPU 最多降 84%,mTHP fallback 降 58%
-
在 unplug 前提交最后一批 swap readahead
块设备 swap I/O 经 swap_iocb 批量合并,readahead 循环内提交的批次经 plug 由块层合并,但最后一批在 blk_finish_plug() 之后才提交,总是成为独立请求;把最后一批挪到 unplug 前提交,使其也能被块层合并
-
允许 MPOL_WEIGHTED_INTERLEAVE 策略参与 NUMA balancing 迁移
MPOL_WEIGHTED_INTERLEAVE 只按比例决定初始放置,且被拒绝携带 MPOL_F_NUMA_BALANCING,慢节点上的热页无法提升;改动放行该标志组合并按 nodemask 约束迁移目标,被加权策略播到慢节点的热页可经 hinting fault 提升到快节点
-
pgoff 未变时不要把 VMA 从 rmap 区间树摘除
VMA 更新流程目前无条件把 VMA 从 rmap 区间树摘除再重插,改动跟踪 pgoff 是否变化,未变则跳过摘除与重插,仅原地向上传播区间上界,减少 rmap 锁内工作量与锁竞争;UnixBench execl 吞吐提升 15.9%,file rmap 锁平均等待下降 11.1%
-
让 VMA 扫描过滤器不再挡住 promotion
分离 promotion-only 与 placement 扫描:MM_CP_PROT_NUMA_PROMO_ONLY 随 protection walk 传递,shared folio、只读文件映射与 PID 不活跃 VMA 在 tiering 下只做 promotion 扫描,placement 资格与扫描续传拆分并单独记账;实测 DRAM 带宽 150-200 GB/s 升至 250 GB/s 以上,CXL 由打满的 40-45 GB/s 降到 5-10 GB/s,请求延迟由 5 ms 以上降到 0.8-2 ms
-
device DAX 切换到基于 section 的 vmemmap 优化
device DAX 从 DAX 专用 vmemmap 填充模型切到 HugeTLB 的 section-based 基础设施,compound order 记入 section,换用 per-zone 共享 tail 页并去掉专属预留尾页
-
无活跃 PMD 共享时不再扩大 MMU notifier 范围
hugetlb 此前只要 PMD 共享「可能存在」就把 MMU notifier 范围保守扩大到 PUD 边界,一次 2M 打洞变成 1G 失效而误伤 KVM 二级映射;改为按 hugetlbfs inode 用 atomic64 计数活跃的 PMD 共享,无活跃共享时跳过扩大,Redis-in-VM 打洞冷页场景的 P99 QPS 劣化率从 7.09% 降到 1.45%