2026-06-10 内核社区日报
两件值得关注的事:shmem 终于迎来 mTHP collapse,khugepaged 将能为 tmpfs 文件折叠任意 order 的 THP;另外 cpuset mempolicy 绑定到
effective_mems而非mems_allowed的 bug 被修复。
🧠 重点 · 内存
1. shmem mTHP collapse 支持:khugepaged 为 tmpfs 折叠 mTHP 大页
发生了什么: Baolin Wang 发布了 shmem mTHP collapse 的 RFC v2 系列(11 补丁)。该系列使 khugepaged 不仅能为匿名页折叠 PMD 级 THP,还能为 shmem 映射折叠多种 order 的 mTHP。核心改动包括:在 collapse_file() 中添加 max_ptes_none 检查、泛化 collapse_file() 以支持 mTHP、添加 order 相关的 THP 统计检查、新增 shmem mTHP collapse 支持、让 khugepaged 扫描所有 shmem mTHP 尺寸的 order、跳过已含大 folio 的区间、以及添加一套包含 anon 和 shmem mTHP collapse 的 selftests。作者标注该系列不针对 v7.2,仅用于早期反馈。
为什么重要: 此前 khugepaged 对 shmem 只支持 collapse 成 PMD 级(2MB)大页,而 mTHP collapse 扩展了该能力,允许 tmpfs 映射使用更灵活的中间尺寸(如 64K、128K 等)大页,填补了之前功能上的空白。
来源
2. cpuset 绑定 mm mempolicy 到 effective_mems,而非 mems_allowed
发生了什么: Farhad Alemi 提交了一个单补丁,修复 cpuset_update_tasks_nodemask() 中 rebind 任务 VMA mempolicy 时的错误。该函数将 VMA 策略绑定到 cs->mems_allowed(配置掩码),但同一函数中任务自身的 mempolicy 已绑定到由 guarantee_online_mems() 保证在线的 newmems。在默认 v2 层级中,未写入 cpuset.mems 的 cpuset 其 mems_allowed 为空,而 effective_mems 从父集继承非空;当 CPU 热插拔事件触发 rebind 时,mpol_rebind_mm() 传入空掩码,对于使用 MPOL_F_RELATIVE_NODES 的 VMA 策略,会进入 nodes_fold() → bitmap_fold(),后者因 nodes_weight(cs->mems_allowed) == 0 而产生除零错误(divide error)。补丁将 mpol_rebind_mm() 的掩码参数从 cs->mems_allowed 改为 newmems(即 effective_mems),该掩码由 guarantee_online_mems() 保证非空,从而修复除零错误,并使 VMA 策略与任务策略及 cpuset 实际允许的节点一致。
为什么重要: 该补丁修复了一个在 CPU 热插拔下可能触发的除零崩溃(Oops: divide error),使 VMA mempolicy 绑定到与任务 mempolicy 相同的有效在线节点集,与 cpuset_attach() 路径(已使用 cs->effective_mems)的行为保持一致,提升了代码健壮性。
来源
3. 为 page_reporting 增加驱动设置 batch capacity 的接口
发生了什么: Michael S. Tsirkin 发送补丁,在 page_reporting_dev_info 中增加 capacity 字段,允许驱动(如 virtio-balloon)设置每批 report 的最大页数。此前 page_reporting.c 使用固定的 PAGE_REPORTING_CAPACITY(32),若 virtio balloon 设备的 reporting vq 大小小于该值,驱动 probe 会失败。新补丁移除了该硬性检查,改为由驱动将 capacity 设为 vq 大小;若 capacity 为 0 或超过 PAGE_REPORTING_CAPACITY,则默认回退为 PAGE_REPORTING_CAPACITY。补丁相应修改了 budget 计算、sg 分配等逻辑。
为什么重要: 使得 page_reporting 能适配不同设备支持的 vq 大小,避免因 vq 过小导致驱动 probe 失败,提升使用 page reporting 功能的设备兼容性。
来源
4. slub: 在本地内存节点分配 sheaves(滑动批量分配器)
发生了什么: Hao Li v2 补丁使 allocate_sheaf() 从当前 CPU 所在节点(local_memory_node(cpu_to_node(cpu)))分配 slab 页。Harry Yoo 在回复中提出:当空 sheaf 的 NUMA 节点与当前 CPU 不匹配时,不再放回 barn 而是直接释放。Hao Li 认可该思路并表示将重新检查性能影响;Vlastimil Babka 认为只要不带来不合理复杂度或回归,该方案值得采用。
为什么重要: 该补丁旨在改善 SLUB 分配器的 NUMA 局部性,根据补丁说明,在 192 核、8 NUMA 节点系统上 will-it-scale mmap 测试有约 1% 提升。Harry Yoo 提出的附加方案可能进一步减少跨节点分配,使代码逻辑更健全。
来源
5. NUMA: 新增 standby NUMA 节点支持,运行时认领热插拔内存
发生了什么: Gregory Price 发布了 RFC v1(3 补丁),在 mm/numa 中引入 “standby NUMA nodes” 概念。核心思路:
(1)新增 numa=standby 启动参数,允许在内存热插拔前预留一批名为 “standby” 的节点(占位但不实际使用);
(2)通过 CONFIG_ACPI_NUMA_STANDBY_NODES 让 ACPI 支持这些节点;
(3)通过 CONFIG_ACPI_NUMA_ADD_CFMWS_NODES 让驱动程序(如 CXL)能在运行时将热插拔内存 “claim” 到这些节点上,按需创建 NUMA 拓扑,而非依赖 BIOS 预描述。
为什么重要: 当前 NUMA 节点必须在 boot 时描述为 possible 才能后续使用。对 CXL 等可编程拓扑的场景,平台希望将一块 CFMWS Window 划分为多个 NUMA 节点用于内存分层或隔离,但 BIOS 无法预知。该系列为运行时动态增删 NUMA 节点铺路。
来源
6. alloc_tag 新增 ioctl 接口:支持按模块/函数/文件/大小/精度过滤分配
发生了什么: Abhishek Bapat 发布了 v4 系列(6 补丁),在 /proc/allocinfo 上增加 ioctl 接口,允许用户空间按以下条件过滤 tags:
(1)ALLOCINFO_IOC_CONTENT_ID – 获取 content identifier;
(2)模块名、函数名、文件名、行号过滤;
(3)min_size/max_size 范围过滤;
(4)基于 tag 精确度的过滤(accuracy)。
同时增加了 ALLOCINFO_IOC_COMMIT 和 ALLOCINFO_IOC_UNSET_FILTERS 等命令。配套有 kselftest 覆盖基本场景。Reviewer 在反馈中要求补充内存映射 (mmap()) 场景下的编号过滤。
为什么重要: 之前 /proc/allocinfo 只能无条件 dump 所有分配,在海量分配点上执行用户态 grep 效率低。ioctl 过滤将筛选逻辑下沉至内核,降低用户态开销,便于生产环境快速定位热点或内存泄漏。
来源
7. mm/huge_memory: 大页 split 时不将已丢弃的 tail folio 加入 LRU
发生了什么: Zhaoyang Huang 报告了一个内核恐慌(panic),发生在 split_huge_page_to_list() 中。当 split 大页时,如果某个 tail page 因各种原因被 __split_huge_page_tail() 提前丢弃(drop 为 true),后续该页面仍被 folio_batch_add() 加入 LRU,导致 page 状态不一致(可能出现在错误 LRU 链表上)。该补丁在 __split_huge_page_tail() 中跳过对 drop 设置为 true 的 tail page 的 LRU 添加操作。
为什么重要: 此 bug 会导致潜在的内存损坏、crash 或难以调试的 page fault。修复虽简单,但影响所有使用 THP 且可能丢弃 tail folio 的场景(如硬件 poisoning 或文件系统 truncate 后 split)。
来源
🔧 其它子系统
eBPF
- bpf_find_vma UAF 修复:Sanghyun Park v4 补丁修复了
bpf_find_vma()对非当前进程的task->mm使用后释放问题。对于 foreign task,该补丁使用spin_trylock(&task->alloc_lock)原子性地读取task->mm并通过mmget()增加引用计数,随后以bpf_iter_mmput_async()释放引用,从而避免exit_mm()并行释放 mm_struct 导致的 use-after-free。补丁同时拒绝了 irqs-disabled 上下文与!CONFIG_MMU下的 foreign task 路径,因为在这些场景中无法安全地异步释放 mm 引用。来源 - bpf_msg_pop_data() 整数溢出:Sechang Lim v2 修复了
bpf_msg_pop_data()中u64 last = start + len因 u32 截断导致 bounds check 绕过的问题,新增 selftest。来源 - BTF repeated field 计数校验:Paul Moses v2 补丁在
btf_repeat_fields()中使用check_mul_overflow替代直接乘法,防止计算field_cnt * (repeat_cnt + 1)时 u32 回绕导致剩余容量检查失败,从而避免后续memcpy越界写出。同时添加了触发该回绕的原始 BTF 测试用例。来源 - sk_msg sg.copy 位图同步:Qian Yiming v2 补丁修复了 sk_msg 在移动、复制、拆分条目(如
sk_msg_xfer()、sk_msg_shift_left/right()、BPF pull/push/pop 辅助函数以及tls_split_open_record())时未同步更新sg.copy位的问题,防止未被映射到的外部分页通过可写 BPF ctx->data 被修改。来源 - selftests 适配 LLVM23 true signature:Yonghong Song v2 修复了 BPF tailcall 返回类型不匹配和 fexit BTF 上下文布局差异导致的 CI 失败。来源
网络 & XDP
- stmmac XDP 程序切换 panic 修复补丁:Carlos Fangmeier 提交补丁,指出
stmmac_xdp_set_prog()在重建 DMA 通道时未暂停 netdev TX,导致并发帧发送触发 MMIO 缺页 panic,并给出通过netif_tx_disable()/netif_tx_wake_all_queues()包裹重配置路径的修复方案。reviewer 指出该补丁仍存在竞态风险,并建议基于上游内核测试。来源 - veth 时基 BQL coalescing:Simon Schippers v6 继续讨论 veth 支持基于 ethtool
tx-usecs的 BQL 完成合并(Timer based coalescing),今日有性能数据更新。来源
文件系统 / VFS
- (今日无突出 VFS 条目)
👀 值得追的讨论 / Patch
(今日无明显重大争议性讨论,以下为值得留意的早期 RFC)
- mm/vsprintf 新增 pgtable entry 打印格式:Anshuman Khandual 的 v2 RFC 在 lib/vsprintf 中添加
%pp[g|4|u|m|t][d|e]格式用于直接打印各级页表项,替换现有的__print_bad_page_map_pgtable()手工打印。Kunit 测试已包含,但该系列在 arm32 平台上因 pgdp_get() 问题无法构建。来源
⚡ 一句话速览
-
Wenchao Hao 回复 Nhat Pham,解释了
ZS_CHAIN_LOG2、ZS_MAX_OBJ_PER_PAGE_LOG2、ZS_OBJ_IDX_DENSE_BITS的计算逻辑(如ceil(log2(ZS_MAX_PAGES_PER_ZSPAGE))等),并建议将这三个宏分别重命名为ZS_MAX_BITS_PAGES_PER_ZSPAGE、ZS_MAX_BITS_OBJS_PER_PAGE、ZS_MAX_BITS_OBJS_PER_ZSPAGE,以提高可读性。
为什么重要:该讨论有助于改善宏命名的自文档性,提升代码可读性和维护性。 来源 -
khugepaged PMD collapse swap PTE 统计修复:Lance Yang 的补丁获得了 David Hildenbrand 的 Acked-by,该补丁将 swap PTE 计入 PMD-order 候选的
nr_occupied_ptes,修正了 lower-order 下 swap PTE 被排除的统计问题。 来源 -
memory-failure 序列化 TestSetPageHWPoison 与 zone->lock:Michael S. Tsirkin 建议可在
take_page_off_buddy成功后重新设置SetPageHWPoison,以避免此前TestSetPageHWPoison的 HWPoison 标志因__free_pages_prepare的无锁 flag 操作而丢失。 来源 -
gup_test 拒绝包装的 user 范围:Samuel Moelius 补丁为
addr + size添加溢出检查,防止循环被跳过且 ioctl 返回成功时 size 被改写为零,Andrew Morton 回复“Looks sane, thanks.”表示认可。来源 -
memcontrol v1 soft limit 树分配使用 __GFP_NOFAIL:Ruoyu Wang 提交补丁使 memcg1_init() 中 soft-limit 树的 kzalloc_node() 带 __GFP_NOFAIL。Andrew Morton 回复要求静态分析器学习内核在 __init 代码中忽略分配失败的惯例。 来源
-
DAMON 文档细节修正 v5:Doehyun Baek 提交 v5 补丁,修正多个 DAMON 文档问题,包括 sysfs 文件名
apply_interval_us、DAMON_STAT 模块计数、格式错误的引用、标签缩进错位和几处拼写错误。 来源 -
DAMON samples 错误处理 v4:SeongJae Park v4 细化了 damon_start/damon_stop 失败时的资源清理,包括
damon_call()失败后也要 stop 并销毁上下文。 来源 -
trace LRU add drains v2:JP Kobryn 增加追踪点跟踪 lru_add_drain 的来源(包括 drain-all queuing),便于诊断 LRU 颠簸。 来源
-
tools/mm/page_owner_sort 内存泄漏修复:chenyichong 补丁修复了 page_owner_sort 中 per-record 分配未释放的问题(
add_list分配 name 和 text buffer 但 exit 时只释放了 list 数组)。 来源 -
syzbot 报告 WARNING in hrtick_start_fair:暂无可用的修复,等待分析。 来源
-
rust null block driver (rnull) v2:Andreas Hindborg 发布包含 83 个补丁的完整 Rust null block 驱动,为内核 Rust block 子系统提供测试桩。 来源