2026-06-14 内核社区日报

今日关注:vmalloc 的 vmap_area 索引从红黑树迁移到 maple tree 的 RFC 系列首次发布,为内核内存管理的重映射路径带来可扩展性改进;网络方面,Jakub Kicinski 正式拒绝 TLS + sockmap 组合,清除长期存在的安全隐患,同时 libbpf 的 ring buffer 用户态库收到 6 个关键正确性修复。

🧠 重点 · 内存

1. vmalloc 的 vmap_area 索引从红黑树迁移到 maple tree(RFC v1)

发生了什么: Qualcomm 工程师 Pranjal Arya 提交了 12 个 patch 的 RFC 系列,将 struct vmap_area 的索引数据结构从现有的红黑树(rb-tree)切换为 maple tree(maple tree 已经是内核中逐步推广的、支持区间查询的 B-Tree 变体)。修改覆盖了 freebusylazy 三类的 vmap_area 查找、插入、删除、合并(__merge_or_add_vmap_area)以及增强传播(augment_tree_propagate_from)等核心路径。find_va_links 函数原本在 rb-tree 中做二分查找以定位插入位置,迁移后 maple tree 提供了原生的区间索引。系列还清理了与 free_vmap_area_rb_augment_cb_propagate 相关的增强回调逻辑。

为什么重要: vmalloc 是内核中碎片化的虚拟地址分配器,在高页表动态映射(如内核模块、kprobe、ftrace 等频繁加载/卸载)场景下,vmap_area 集合会增长到数万甚至数十万项。红黑树在区间操作(查询某地址段是否空闲、寻找空闲 gap)上效率低于专门为区间索引设计的 maple tree。迁移后预期能降低 vmalloc 路径的延迟和锁竞争,特别是在多核系统中。此系列尚在 RFC 阶段,但迈出了 vmalloc 底层索引现代化的重要一步。

来源

2. VSwap 与 swap.tier 整合的分歧讨论

发生了什么: VSwap 提案围绕是否应集成到 swap.tier 层级框架继续讨论。作者 Youngjun 倾向维持当前独立接口,但表示若 per-tier max 更符合 memcg 方向且其他人持相同看法,愿意切换;目前仍在等待更多反馈(例如 Shakeel 的意见)。

为什么重要: 该方向选择将决定 VSwap 是否复用现有 memory.swap.tiers 接口,避免重复实现,进而影响其与 memcg 层级控制体系的整合方式。

来源

3. zswap 主动回写(proactive writeback)与 swap_tier 的接口讨论

发生了什么: 讨论围绕 swap_tier 内存 cgroup 接口(memory.swap.tiers)与 zswap 主动回写的集成展开。提出可仅允许 per-tier max 为 0 或最大值,以控制 tier 是否启用;保留 memory.zswap.writeback 接口,但可扩展为选择性回写到指定 tier;讨论将 zswap 作为第一个 swap tier。
为什么重要: 该方向对齐当前开发方向,为按 tier 顺序选择性定位 swap 设备提供了基础。

来源

4. bootmem gigantic hugetlb 跨区页面处理

发生了什么: Muchun Song 的补丁使 bootmem gigantic page 分配在 zone 初始化后检测跨多个 zone 的页面。这些跨区页面在分配过程中被单独保留,分配完成后直接释放,后续 hugetlb 初始化只处理 zone 合法的 gigantic 页面。补丁选择直接释放跨区页面而非重试分配,因跨区情况在实践中非常罕见。

为什么重要: 通过释放跨区 gigantic 页面,确保 hugetlb 子系统只操作 zone 内连续的页面,提升内存初始化阶段的一致性。

来源

🔧 其它子系统

网络

  • TLS 与 sockmap 互斥正式实现:Jakub Kicinski 提交 5 补丁系列,拒绝 TLS 与 sockmap(BPF psock)的组合。原因包括该组合未发现实际用户且含已知的 exploitable bug。系列先阻止在已有 psock 的 socket 上配置 TLS 密钥,后续补丁移除 SW 路径中死掉的 skmsg 处理(sendmsg/recvmsg 中的 psock 处理),并清理相关测试用例。 来源

  • libbpf ring buffer 6 个正确性修复: 修复包括:零记录边界不应消耗记录;NULL 回调在构造时被接受但在基于回调的消费到达 ring 时导致崩溃;位置计数器绕回后按大小比较导致停止消费;使用编译器原子操作并添加缺失的 StoreLoad 屏障(包括发布较早记录后重试忙碌记录时);防止错过唤醒通知;拒绝基于回调的消费 BPF_F_RB_OVERWRITE 模式的 map。来源

  • Intel Wired LAN 驱动系列补丁合入 net-next:包括 idpf 驱动中将 system_unbound_wq 替换为 system_dfl_wq;ice 驱动移除冗余 PTP 检查;igb 驱动从 BH workqueue 中获取 Tx 时间戳;igb/e1000e 使用 ktime 实时函数;igb/igc/e1000e 改用 napi_schedule_irqoff;e1000/e1000e 限制字节序转换边界;以及注释修正等。 来源

  • bnxt_en 添加 kTLS TX 卸载支持(v3,共 15 patch): 利用 Midpath Channel(MPC)绕过固件直接向硬件加密引擎提交 kTLS 连接。 来源

文件系统

  • fat: 停止读取目录项超过程序结束标记(v3):Matteo Croce 发布补丁,使 FAT 文件系统在遇到目录结束标记后停止继续读取目录项。 来源

  • exfat: 在文件创建后保留 empty-entry hint(讨论):补丁尝试在成功使用 empty-entry hint 后保留剩余连续空项,避免后续创建操作重新扫描目录。测试显示在含 20000 个随机文件的目录中,创建时间从 3879 秒降至 3050 秒。但维护者 Namjae 认为,LOOKUP_CREATE 中会丢弃 dentry 以维持文件名 case,导致仍需暴力搜索目录,hint 在过程中自然更新,因此该补丁不会提升性能且属多余操作。社区在讨论该补丁的必要性。 来源

eBPF

  • 静态链接器拒绝越界的 relocation 偏移: libbpf 在 BPF 静态链接时新增校验,防止外部输入导致越界读。 来源

👀 值得追的讨论 / Patch

  • PMD 级 swap entries for anonymous THPs:Zi Yan 建议将前 6 个清理补丁单独发送以先行合并,作者 Usama Arif 表示同意。 来源

  • 动态添加 NUMA 节点的可行性讨论:Gregory Price 询问能否在运行时动态添加 NUMA 节点,Mike Rapoport 指出当前无法简单实现,因为部分服务(如 futex_init 使用 num_possible_nodes() 作为静态值计算资源)依赖固定的 possible 节点计数。双方还讨论了专用节点与通用内存热插拔的差异,以及 CXL 内存窗口可能扩大 possibleavailable 节点差距的影响。来源

⚡ 一句话速览

  • vmalloc 的 vmap_area 索引迁移 RFC:Pranjal Arya 提交 12 个 patch,将红黑树索引切换为 maple tree,覆盖查找/插入/合并/传播回调。 来源

  • bootmem 跨 zone gigantic 页面处理:Muchun Song 提交补丁,在 bootmem 分配后直接释放跨 zone 页面,以确保 hugetlb 初始化只看到 zone 有效页面;跨区情况被认为非常罕见,故不增加重试逻辑,获 Mike Rapoport Acked-by。 来源

  • memblock 补丁移除冗余的 pageblock_align 调用:Zhen Ni 提交 patch 指出 prev_end = pageblock_align(end) 是冗余的,因为此前 prev_end 已在循环中对齐到 pageblock 边界(该行来自 commit f921f53e089a),移除以简化代码。已排队等待合入。来源

  • cpuset rebind mempolicy 到 effective_mems(v2):修复子 cpuset 未设置 mems 时,MPOL_F_RELATIVE_NODES 转译导致的 div/0 bug。 来源

  • sk_msg sg.copy 位图的功能说明与暂缓提交请求:Yiming Qian 在邮件中解释了 sk_msg sg.copy 位图的作用——该位图记录 scatterlist entry 的所有权状态,置位时告知 sk_msg_compute_data_pointers() 不要将对应 entry 通过可写的 BPF ctx->data 暴露,从而保护由 splice 文件页缓存等非私有页支持的 entry。邮件末尾注明“请其他维护者暂勿提交此补丁”,因为作者将在 net-next 上提交 TLS+sockmap 的去特性补丁,待 CI 通过后合并。 来源

  • staging 移除过时网络和 16-bit 视频驱动:Gabriel Ramos Barbosa Mota 清理 staging 树,移除多个未维护驱动。 来源

  • Rust doctest 函数名裁剪:Gary Guo 提交补丁,将 rustdoc 生成的包含绝对路径的 doctest 函数名(如 _doctest_main__home_gary_Projects_linux_rust_kernel_io_rs_824_0)裁剪为相对路径形式(如 _doctest_main_rust_kernel_io_rs_824_0),以避免过长的符号名并提升可复现性。David Gow 回复指出该补丁在 rustc 1.93.1 上因未匹配到替换导致构建失败,Gary 回应称下一版本将改用全文替换。来源