2026-06-04 内核社区日报

今日速览:DAMON 提出基于自动调优的热区折叠大页的新方案;dma-buf 新增 system_cc_shared heap 为 CoCo VM 提供显式共享内存分配;多个 compaction 和 pagemap 相关修复与 RFC 活跃评审中。

🧠 重点 · 内存

1. dma-buf: 新增 system_cc_shared heap,支持 CoCo VM 显式共享内存分配

发生了什么:
Jiri Pirko 提交了一组补丁,在 dma-buf heaps 中新增 system_cc_shared heap。CoCo VM(如 AMD SEV、Intel TDX)中,guest 内存默认是 private 的,硬件通过页表加密位控制访问。为了将内存共享给不支持私有内存 DMA 的设备(无 TDISP 支持),需执行 set_memory_decrypted() 清除直接映射中的加密位并通知 hypervisor,同时保证释放时通过 set_memory_encrypted() 重新加密——若重加密失败则故意泄露页面阻止复用。heap 为 mmap 和 vmap 的虚拟映射统一使用 pgprot_decrypted(),并对 DMA 映射标注 DMA_ATTR_CC_SHARED。非 CoCo VM 上该 heap 不会注册,防止误用。

为什么重要:
该 heap 为 CoCo 场景下的 dma-buf 分配提供了安全且统一的内存管理路径,解决了过去需要手动处理加解密的痛点,对机密计算和端侧 AI 中的 UMA 共享有直接影响。

来源

2. mm/compaction: 支持在 compact_unevictable_allowed=0 时跳过 mlocked folio

发生了什么:
Wandun 提交 RFC 系列,三个 patch:

(1)skip isolate mlocked folios: 当 compact_unevictable_allowed=0 时,compaction 的 isolate_migratepages 路径本应跳过 mlocked 页面,但实际实现并未完全遵守该 sysctl。补丁在 isolate_folio() 时检查 folio 的 mlocked 状态,若不允许则直接返回失败。

(2)add per-folio isolation tracepoint: 新增 tracepoint 以跟踪每个 folio 的成功/失败原因,便于调试。

(3)respect compact_unevictable_allowed in alloc_contig path: alloc_contig_range() 目前忽略该 sysctl,补丁使其在尝试隔离 mlocked 页面时也遵守该限制,避免误迁移用户锁定的内存。

为什么重要:
修复了 compaction 在特定 sysctl 配置下的预期行为,防止意外迁移 mlocked 页面导致用户态锁存失效。这对内存碎片整理和 CMA 分配场景均有影响。

来源

3. fs/proc/task_mmu: 修复 pagemap 对 PMD device-private 条目的误报

发生了什么:
Dev Jain 提交了两部分改动:

(1)do not warn on seeing non-migration pmd entry: 在 pagemap_pte_range() 中,对于 is_huge_pmd() 且非 migration entry 的 device-private PMD,代码之前会触发 WARN_ON_ONCE。补丁移除该警告,因为 device-private 页虽然以 PMD 存在,但并不是 PTE-mapped THP,不应触发警告。

(2)selftests/mm/hmm-tests: test pagemap reads of PMD device-private entries: 新增测试用例,验证 pagemap 在遇到 PMD device-private 条目时不会崩溃或误报。

为什么重要:
修复了 CPU 端访问 device-private 内存时的内核警告,对 HMM/SVM 场景的稳定性有直接帮助。手机端侧 AI 的 UMA 共享涉 device-private 映射,该修复可稳定相关调试工具。

来源

4. alloc_tag: 修复模块卸载后 /proc/allocinfo 的 use-after-free

发生了什么:
Hao Ge 提交 v2 修复:/proc/allocinfo 在读取时遍历全局 alloc_tag_hash,但若某个内存分配 tag 来自已卸载的内核模块,访问 current->alloc_tag 可能导致 UAF。修复在模块卸载时清空所有引用该模块的 current->alloc_tag,确保读取时不会悬空。

为什么重要:
/proc/allocinfo 是内存调优和故障排查的重要工具,该问题会导致系统随模块加载/卸载逐步积累 UAF 风险,甚至触发内核崩溃。

来源

5. mm/damon: RFC v3 提出基于自动调优的热区大页折叠机制

发生了什么:
Asier Gutierrez 提交 RFC v3,在 DAMON 中引入自动折叠热区域为大页的机制。核心改动:

(1)DAMOS_QUOTA_HUGEPAGE auto tuning:新增 quota goal 指标,测量当前大页消耗占总匿名内存的比例,驱动 DAMOS scheme 的 quota 动态调整,自动调节热区域折叠的侵略性。

(2)Generalize ctx_target creation:为 DAMON 模块提供统一的 damon_modules_new_vaddr_ctx_target(),支持 vaddr 和 paddr 两种监控模式的上下文创建。

(3)SAMPLE_DAMON_HUGEPAGE 模块:新增 sample module,对指定进程的热区域执行大页折叠操作,并报告统计信息;模块同时提供用户自动调优旋钮。

(4)文档:新增 Documentation 说明该 module 的使用方法和效果。

为什么重要:
该系列在 DAMON 现有大页操作(DAMOS_HUGEPAGE、DAMOS_NONHUGEPAGE、DAMOS_COLLAPSE)基础上,首次引入基于大页消耗比例自动调整折叠侵略性的机制。通过 sample module 演示,在 MariaDB/sysbench 测试中实现了性能提升(从 18,162.45 事务/秒升至 18,211.82 事务/秒)。

来源

🔧 其它子系统

调度 (sched_ext)

  • sched_ext cid/cmask 接口清理 v2:Tejun Heo 重新调整了 BPF 侧 cmask 辅助函数(cid.bpf.h)及其调用者的参数顺序,统一为 (cid, mask);限制 scx_cmask_for_each_cid() 的活动范围以避免过期字产生幻影 cid;scx_bpf_kick_cid() 改为返回 scx_cid_to_cpu() 的 errno 而非 -EINVAL;新增 scx_cmask_test()scx_cmask_for_each_cid() 辅助函数;scx_bpf_kick_cid() 从 void 改为 s32 返回类型(kfunc 签名变更)。 来源

eBPF

  • bpf_map_info / bpf_prog_info 尾零检查:Leon Hwang v2 补丁在 BPF_OBJ_GET_INFO_BY_FD 的 UAPI 路径中增加了对 struct 尾端 padding 字节的零值检查,防止信息泄漏。 来源
  • PTR_TO_FLOW_KEYS 常量偏移 OOB 修复:在 check_flow_keys_access() 中折叠 reg->var_off 参与边界检查,避免 flow_keys(imm=4096) 逃逸越界访问。 来源
  • 动态 inner array 查找保持 nullable:修复 ARRAY_OF_MAPS 中使用 BPF_F_INNER_MAP 模板时的 null 检查,确保查找结果仍可为 NULL,防止绕过验证。 来源
  • Arena direct-value one-past-end 拒绝测试:新增 selftest 验证 BPF 程序不能访问 arena 的 one-past-end 直接值。 来源

文件系统 / VFS

  • fhandle UAF 修复:Jann Horn 修复 may_decode_fh() 中不加锁读取 ->mnt_ns 导致的 use-after-free,在 fhandle_to_open() 路径中添加读写锁保护。 来源
  • ntfs 多个安全修复:Samuel Moelius 修复 LCN 累加器溢出;Bryam Vargas 修复 resident attribute lists 验证、look-ahead attribute-list 条目越界、$FILE_NAME 长度检查等。 来源
  • iomap 空映射解引用修复:Joanne Koong 在 iomap 错误报告路径添加 folio->mapping 为 NULL 时的保护。 来源
  • vmsplice 更改与动态共享缓冲区使用模式的冲突讨论:Linus Torvalds 指出 Willy Tarreau 在 haproxy 中利用 vmsplice() 将 common_response[] 内容映射到管道,并在之后动态修改该缓冲区,这种依赖于共享可写页的做法会因 vmsplice() 更改而完全破坏。 来源
  • libfs 默认设置 SB_I_NOEXEC / SB_I_NODEV:John Hubbard 在 init_pseudo() 中默认设置 SB_I_NOEXEC 和 SB_I_NODEV,减少伪文件系统误用。 来源
  • ext4 LOGFLUSH shutdown 排序修复:修复 EXT4_GOING_FLAGS_LOGFLUSH 模式下 ext4_force_commit() 在 shutdown 前执行,避免 ordered-mode 数据写回失败。 来源

Rust

  • 新增 leds 抽象:Markus Probst 添加了基本的 LED class device 抽象、Mode trait 和 multicolor classdev 抽象。 来源
  • 新增 serdev 总线抽象:同上作者提供了 serial device bus 抽象和示例驱动程序。 来源
  • PWM 使用 pin_init::zeroed:Francis Laniel 替换 core::mem::zeroed 为安全初始化的方式。 来源

👀 值得追的讨论 / Patch

  • anon_vma 重新设计讨论:社区等待 Lorenzo Stoakes 完整方案:David Hildenbrand 对 anon_vma 的重新设计表示期待,认为 Lorenzo Stoakes 正在探索各种方案,建议社区等待其完整提案;Lorenzo 回复表示会优先在未来一个月内交付部分成果。 来源
  • zswap proactive writeback 阈值讨论:倾向于基于压缩后大小并借助平均压缩比估算:Yosry Ahmed 在邮件中表示更偏好基于压缩后大小而非原始页面大小,并指出可通过平均压缩比估算实际需要回收的页面数。随后有开发者回应将按压缩后大小修改实现。 来源
  • memory-failure tracepoint 修复:修改 TRACE_SYSTEM 避免依赖 CONFIG_RAS:David Hildenbrand 提交补丁将 TRACE_SYSTEMmemory_failure 改为 ras,以避免对 CONFIG_RAS 的依赖;Qiuxu 在 v7.1-rc3 上测试确认 rasdaemon 可正常启用并接收 memory_failure 事件。 来源
  • khugepaged mTHP collapse 算法讨论:David Hildenbrand 指出扫描算法描述中栈的弹出顺序有误(先弹出右半部分而非左半部分),并建议使用 offset 和 cur_order 变量替代栈结构来实现等价逻辑。 来源

⚡ 一句话速览

  • mm/compaction: compact_gap() 上限 v2: 对 compact_gap() 取上限 COMPACT_CLUSTER_MAX,防止极端情况下过度扫描。 来源
  • mm: drop page refcount zero state semantics: 提交清理对 refcount == 0 特殊语义的依赖,统一使用 refcount API。 来源
  • mm/page_alloc: 仅在 sysctl 写入时更新 NUMA min ratios: 避免在每次分配路径中无谓更新,降低 overhead。 来源
  • mm/memblock: 引入 memblock_alloc_node_or_panic(): 简化在指定节点分配内存时的错误处理,调用失败直接 panic。 来源
  • mm/damon/core: 修复 commit 失败时 target pid 引用泄露: damon_commit_target() 在失败路径中漏放了老 target 的 pid 引用计数。 来源
  • zsmalloc: 简化 zs_stats_size_show() 数据输出: 移除未使用的初始化,清理代码。 来源
  • riscv mm: 使用后填充钩子避免热插拔 vmemmap 后的虚假缺页: 该系列在 mm/vmemmap 中添加了一个架构后填充钩子,并在 riscv 中利用它避免热插拔 vmemmap 后出现虚假缺页。 来源
  • fuse: NeilBrown 贴出对 fuse_reverse_inval_entry 的重写,引入循环重试处理并发 rename/unlink: 补丁将 dentry 查找与锁定放入循环,对负 dentry 路径使用 start_creating_dentry()、正 dentry 路径使用 start_removing_dentry(),并在获得锁后校验 dentry 是否仍匹配,不匹配则重试。来源
  • eventpoll: 恢复 EP_UNACTIVE_PTR sentinel: 之前将 EP_UNACTIVE_PTR 替换为 NULL 的提交声称“No functional change”,实际并非如此;该补丁将其恢复。 来源
  • LiveUpdate v5 系列继续细化: 包含 file_set->count 类型改为 u64、避免 cleanup guards 与 goto 混用、state management 集中等,本质上是对 v5 的代码风格修正。 来源
  • lock: 添加 contended_release tracepoint 到可睡眠锁: Dmitry Ilvokhin 的补丁为 mutex、rtmutex、semaphore、rwsem、percpu-rwsem 及 RT 专用 rwbase 锁的慢速解锁路径添加 contended_release 跟踪事件,用于关联锁持有时间与等待事件。来源
  • dtrace 数据流追踪扩展: kcov 新增 per-task dataflow tracking 的 RFC v2,支持函数参数/返回值追踪。 来源