-
让 RISC-V 的 per-CPU 操作可被抢占
把 per-CPU 偏移缓存在 thread_info,并用可恢复的 GPR 状态让 this_cpu 操作在任务迁移后自动修正地址,从而不必关中断或关抢占;this_cpu_read/write 从 5.668 ns/op 降到 0.333/0.395 ns,cmpxchg 降 13.8%,vmlinux .text 缩小 1.09%
-
shmem 截断时按批删除 folio
shmem 截断逐 folio 调 truncate_inode_folio,filemap_remove_folio 每页拿放 i_lock 与 i_pages;改为 cleanup 后复用 fbatch,一批调一次 delete_from_page_cache_batch。8GiB 文件 ftruncate 1144ms 降到 901ms,hole punch、close、unlink 都降约 20%,PMD folio 不变
-
DONTCACHE 写不再读回共享页
DONTCACHE(RWF_DONTCACHE)缓冲写给自己创建的 folio 标 dropbehind,写回落盘即丢,而只被部分覆盖的页由相邻两次写共享,先写回的一方丢页就逼另一方从磁盘读回,几乎每次错位写配一次设备读;改为由 page cache 把共享页留给补全它的那次写,写完整后才丢,自己 sync 的写者(如 NFSD 的 FILE_SYNC 或 DATA_SYNC WRITE)可在 sync 后自行标记补全页以免空吵 DONTCACHE kick;并修正 dropbehind 记账的双条件、块小于页的 edge 判定和 NFSD 的边查找,仍被映射的 folio 一律不标记;32 线程交错写 XFS,47008 字节记录从每次写读回 0.97 次、831 MiB/s 变为 0.0005 次、2281 MiB/s
-
RSS 与 tmpfs 改用分层 per-CPU 计数器
把 RSS 计数与 tmpfs size limit 从 struct percpu_counter 换成按树分层的 per-CPU 计数器:更新只在本 CPU 累加,残值够 batch 才把进位传给原子计数器树,误差从 O(n²) 收窄到 O(n log n) 且没有全局锁;单线程进程走精确 bias 路径,第二线程才激活树,tmpfs 用方向性 limit counter 保持上限严格。384 CPU 上误差上界从 1.1GB 降到 158.5MB,mm 计数更新从 288ns 降到 26ns
-
重设计 zsmalloc 对象分配 API
把 zs_handle 嵌入 zram 与 zswap 表项并用 1-based 编码区分未分配,再用 zs_store() 合并分配与写入,去掉每页 8 字节的 handle 分配,每次 write 少 165 条内核指令,lz4 single writer IOPS 提升 2.3%
-
在 page_cache_ra_order 中对齐 async readahead 窗口
async readahead 为支持 large folio 会把新窗口末尾向下对齐到 2 的幂边界,起点贴近边界时窗口会被裁到只剩几页;改成在 page_cache_ra_order() 的分配循环里按 folio 边界收尾后,1MiB 读从 0.237s 降到 0.121s,1039 个 folio 里有 1021 个达到 order 7(改前 9721 个没有 order 7),代价是部分跨 folio 的读会多付设备读
-
GUP-fast 批量抓取 PTE 映射的 large folio
GUP-fast 遍历到 PTE 映射的 large folio 时不再逐页抓取,而是验证 head page 后批量扫描同一 folio 的后续 PTE,只读时先截出独占前缀,一次补足整段引用。64kB mTHP 的 pin_user_pages_fast() 耗时下降 83.1%,fio O_DIRECT 随机读吞吐最高提升 75.6%。
-
顺序缺页重启 mmap 预读
在 mmap_miss 超限、同步预读被关掉时,用前一页是否在 page cache 判断顺序访问,多读一页并打 PG_readahead,让不受 mmap_miss 约束的异步预读重新点火;SQLite 全表扫描从 9.3 到 14.2 s 降到 2.1 s,复现器 major faults 从 262144 降到 2
-
marker 命中时把找 hole 的范围放宽到两个窗口
marker 命中后的补救路径从扫一个窗口改成扫两个窗口,越过 read-around 填满的区域重新找到 hole,16 GiB 私有映射分片拷贝 1 线程从 7.62 s 降到 2.00 s
-
kswapd 解除 highatomic 预留
kswapd 在 highatomic 预留造成的假性低水位上会反复空转,而解除预留原本只有 direct reclaim 一条路;让 kswapd 在回收优先级耗尽后强制解除预留,并让有预留的 node 不累计 kswapd 失败,使 node 能自行恢复水位平衡
-
为 DMA 与 CoCo 预置 2MB 的 IOVA 映射
把设备 IO buffer 换成 2MB 物理连续页,首次使用时为一个 2MB 页装好 IOMMU 表项,之后复用,退役时同步 flush IOTLB 再归还;双 200G 网卡双向吞吐从 440Gbps 升到 745Gbps,IOTLB miss 从 16,634,941 降到 30,536
-
为反向移动的 mmap 读者补上预读
用 page cache 里的上方 folio 认出朝低偏移推进的 mmap 反向流,把两条预读路径的窗口朝低偏移挪,并让 PMD 映射计入命中,2 GiB 反向逐页读的 MADV_HUGEPAGE 耗时从 42.23 s 降到 0.58 s
-
顺序缺页在多次未命中后重启 mmap 预读
稀疏缺页把 mmap_miss 顶过上限后,用相邻两次缺页当顺序信号,把计数钉在阈值的十倍并借顺序 read() 的小窗斜坡重启预读;复现器的 major faults 从 16384 降到 2,随机小段的读放大被压到一次起步窗加至多一个异步窗
-
避免 strictlimit BDI 的无效后台唤醒
在 strictlimit BDI 的后台回写判断中补上 wb_over_bg_thresh(),过滤仅由回写中的页撑高阈值触发的无效唤醒;15 秒 FUSE 测试中后台唤醒请求从 2657 降到 682(约 -74%),writeback_start 基本不变