-
让 large folio 拆分只走一次 Xarray 下降
把拆分后 folio 的 Xarray 发布从每片一次根下降改为一次下降加反向逐项后退;1GiB shmem 文件的 512 个 PMD folio 均匀拆到 order 0,real/sys 从 17ms 降到 13ms(-24%),并修正 LRU 回收顺序
-
让 MGLRU 回收尊重 swappiness
按 refault rate 为 anon 与 file 分配扫描预算,使回收在整个 swappiness 区间跟随 CLRU 的偏好,并避免混合压力下提前 OOM
-
为 swap 设备分配引入优先级队列
把 swap 设备选择从共享 plist 轮转改为按优先级组成 ring 的只读队列,用 per-CPU 起点与配额轮转设备,并把 cluster 缓存退回每台设备,BRD 场景吞吐提升 2.15%,kbuild 场景小幅回退
-
允许 SLAB_NOLEAKTRACE cache 使用 sheaves
新增 SLAB_ALLOC_NO_LEAKTRACE,只让 sheaf 自身的分配跳过 kmemleak 跟踪,并带上 SLAB_ALLOC_NO_RECURSE 防止标志传播到 backing kmalloc sheaf,从而允许 kmemleak metadata cache 使用 SLUB sheaves,恢复 per-CPU 缓存,让 object_cache 的分配与释放不再挤在 n->list_lock 上
-
迁移 folio 的拷贝改按范围批量进行
folio_mc_copy() 逐页调 copy_mc_highpage(),一个 2MB folio 要发 512 次 copy_mc_to_kernel() 调用,每页都付一次 string instruction 启动开销外加一次 cond_resched();新增页范围变体 copy_mc_highpages(),架构启用 ARCH_HAS_COPY_MC、内核可抢占且无 HIGHMEM 时一次调用拷完整个范围,其余情况逐页拷贝并在每页前 cond_resched();Zen 6 加 CXL 的机器上 move_pages() 迁移 2MB THP 快约 1.4x、1GB hugetlb 最高快 2.8x,kswapd 每 demote 1GB 省 31% CPU
-
root memcg 统计改读全局计数器
root memcg 的 rstat flush 会刷系统里所有 cgroup;对只记录 memcg 计费的 node stat,root 的层级值等于 node 计数器,因此 lruvec_page_state() 对 root 直接读 node 计数器,workingset、DAMON 和 zswap 跳过 flush,reclaim 仍为子 memcg 保留 flush。80-CPU 上 root flush 平均 69us,128 个 memcg 反复分配时约 0.9ms,读 node 计数器约 150ns;zswap shrinker 在 root 负载下写回页数从 0 变为 1016
-
用 PUD 级 Bloom filter 跳过 aging 中的空 PUD 子树
增设 PUD 级 Bloom filter,整棵跳过上一 generation 无 young 项的 1GB 子树;2 节点 KVM 上远节点叶项扫描降 92%、带叶遍历降 94%,memcg 压力下远节点带叶遍历降 99.9%,驻留与 OOM 均无变化
-
用 32 位压缩帧缩小 stack depot 记录
所有帧都能无损还原时把持久化记录改存 32 位帧,记录缩小 33.3% 至 47.1%,生产 KASAN 主机每千条栈的 pool 数下降 41.5%(x86-64)与 27.1%(arm64)
-
MGLRU 切换模式时更早让出 lru_lock
fill/drain_evictable() 在 TIF_NEED_RESCHED 已置位,或 lru_lock 有等待者且已搬够 MIN_LRU_BATCH 时提前收手,有等待者时把单次关中断持锁从满批约 1ms 缩短到约 15us,无竞争时仍用满批
-
没有可合并的 PTE 时不必批量刷新 TLB
异步迁移中,批次里只有一个 small folio 且它没有共享映射时不再使用批量 TLB flush,改为只失效对应的一页,避免扫描期间 mm->tlb_flush_batched 挂起;NUMA balancing 的吞吐损失从 13.0-16.5% 收窄到 0.5-6.3%,每迁移页 TLB 中断从 202-210 降到 12.7-13.6
-
权限升级时跳过 KVM secondary MMU 的 zap
change_protection() 对权限放宽也发 MMU_NOTIFY_PROTECTION_VMA,KVM 无法区分放宽与收紧而清空表项;新增 PERM_UPGRADE 标志让 x86 与 s390 的 KVM 跳过 zap,QEMU 后台快照下 pf/s 从约 100 万降到 2.3K~4.1K,guest 读 p99 从 19,789 ns 降到 5,207 ns
-
kmemleak 扫描在争用时让出 kmemleak_lock
kmemleak 后台扫描在 kmemleak_lock 出现等待者时每 64 个 word 放锁重取,把分配与释放的锁等待 p99 从 <256 µs 压到 <64 µs,代价是五轮扫描从 118 s 拉长到 179 s
-
让 /dev/mem 与 UIO 按需建立 huge PFN 映射
把 /dev/mem 与 UIO 的 mmap() 从 eager 铺 4K PTE 改为缺页时建立 PMD/PUD 表项,并用 pfn_range_track() 保留 PAT memtype 预留;256MB 区域 mmap() 快 95 倍、dTLB read miss 降约 80 倍,8MB UIO 区域 mmap() 快 5.6 倍
-
复制首个 tail 页加速 HugeTLB bootmem 初始化
HVO 不可用或失败时,把 HugeTLB bootmem 大页的 tail struct page 改为先完整初始化第一页、其余 memcpy 复制并只刷新 PFN 相关字段;64 个 1G 大页在 arm64 上从 360.8 ms 降到 256.0 ms,x86-64 上从 171.0 ms 降到 165.0 ms