今天两条主线都是「把已经承诺过的事,写成能被检查的形式」:mm 用 38 个补丁干掉 VM_SPECIAL, 把只有作者看得懂的标志位换成读代码就能懂的谓词;另一边 VFS 找回 RCU 路径行走上漏掉的宽限期, 把八个文件系统里「还在被读、却已经被释放」的对象一次性清掉。
🎬 今日导读
/ section📊 板块活跃度
/ column
数据截至 10-10 06:23 北京,近 24h 各板块真实计数:net 639 · DRM 347 · mm 223 · PCI 150 · fs 145 · media 117 · Rust 62 · block 61 · arch 49 · LSM 23 · rt 10 · virtio 2。 net 依旧是量最大的一头(大头是驱动修复与 PHY/DSA 新芯片);今天的重量集中在两处: mm 侧是那个 38 帖的 VMA 标志语义重构,fs 侧是一串「只有在没有 umount 的窄路径上才爆」的释放竞态。
💡 今日头条
/ section38 个补丁干掉 VM_SPECIAL:内核终于把 VMA 标志「说不出口的意思」变成了函数名
VM_SPECIAL 这一组标志位间接表达——它是 VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_DONTDUMP 的打包。 VM_IO 都不能再假设等于 IOMMU 映射, 因为 mlock 也在滥用它;hugetlb 又设了 VMA_DONTEXPAND_BIT 却并不想被当成 special。 作者原话是「这一团相当乱」。而 special 这个词本身在 mm 里也早已过载:VDSO 与 VVAR 映射也叫 special。 VMA_IO_BIT、也不许清 VMA_MAYWRITE_BIT, 并在每次 mmap / mmap_prepare 钩子之后校验 VMA 状态;二把散落的标志测试换成四个说人话的谓词: vma_is_mm_managed()(内容是不是核心 mm 建立并管理的)、 vma_is_mm_backed()(后备内存是不是核心 mm 缺页进来并留住的)、 vma_is_fixed_mapping()(不许扩展或合并)、 vma_can_merge()(能不能和邻居合并);三整体删除 VM_SPECIAL 与 VMA_SPECIAL_FLAGS。 mmap_prepare、 fbdev defio / cmt_speech / uprobes / bpf arena 补上 VM_MIXEDMAP、 ALSA PCM 状态页改成 vm_insert_page()、selinux 去掉 mmap 的读写检查、 fuse/dax 不再设 VM_MIXEDMAP、THP 的 vma_is_special_huge() 直接删掉。 换句话说:每一个「自己映射内存」的子系统都在这 38 帖里留下了痕迹——这正是它值得一读的原因。 vma_is_persistent() 改成 vma_is_mm_backed() 就来自 David)。 系列走 akpm 的 mm 树。对想入门 mm 的人,这套「先立不变量、再换谓词、最后删旧标志」的收敛过程 本身就是很好的读补丁材料。 🔗 原文
VFS 的 RCU 路径行走漏了宽限期:八个文件系统把「还在被读的东西」提前释放了
->permission()、->d_revalidate()、->get_link()、 ->d_hash()、->d_compare() 里读到的任何东西, 都必须等一个 RCU 宽限期之后才能释放。这是自从 rcu pathwalk 那批修复之后, 明确交给文件系统自己负责的事。 umount(2) 帮大家挡住了:namespace_unlock() 会先等一个宽限期再放下挂载点,此时走路径的人早就走了。 但最后一个挂载引用不一定在 umount 里消失——从一个惰性卸载的目录 chdir() 出去,或者关掉最后一个文件,引用就直接掉了,中间没有任何宽限期。 这时 ->put_super() 与 ->kill_sb() 会释放掉仍然在被读的东西。 ext4_get_link() 会在 RCU 模式下读它们)、 ext4 / f2fs / tmpfs 的 unicode 大小写折叠映射(generic_ci_d_hash() 在用)、 ntfs3 的 sbi 与挂载选项(remount 甚至不需要卸载就能踩到)、 eventfs 的 eventfs_inode(原来只等 SRCU,但 tracefs_d_revalidate() 是在 rcu_read_lock() 下读的)。afs 与 9p 今天还够不到, 但作者也一并让它们自己等宽限期,不让它们依赖私有 bdi 顺带带来的那个宽限期。 第 5 帖是另一类 bug:create_ipc_ns() 在 mq_init_ns() 之后失败, 会漏掉 mqueue 的挂载与超级块。 generic_shutdown_super() 调的 bdi_unregister() 要等宽限期,而那个宽限期本来是为 bdi_list 的 RCU 读者准备的——「我不想让它们靠这个巧合活着」。 namespace_unlock() 宽限期消除,顺路把「文件系统关停时释放了什么」过了一遍才发现的; 同一条路径上大概率还有下一批。 🔗 原文
📰 mm 内存管理
/ column★ vmap 失败不该留下半张映射表:把回滚从「调用者各自负责」收进映射函数
__vmap_pages_range_noflush() 这一族)在失败时, 可能已经装进去一部分 PTE 却留在那里不管。 pcpu_map_pages() 与 kmsan_ioremap_page_range() 自己回滚已映射的部分,而 vm_module_tags_populate() 与 __vmalloc_area_node() 的 __GFP_NOFAIL 重试循环则假设映射函数会清理干净。RFC 把回滚移进映射函数本身: 失败的 vmap 什么都不留,调用者不再需要擦屁股。 vmap_pte_range() 里 BUG(),小页路径则是警告。 🔗 原文
★ zram 重做压缩后端:每个 CPU 一条流,读写挤在一起才闹出优先级反转
zcomp 按 per-CPU 组织。 历史设计里,读上下文和写上下文一直共用同一条流。 🔗 原文
今日动态
○ mm:zswap 减少 load 路径上的请求竞争(v2,2 帖) 〔10-10 00:31〕
○ mm:page_owner 增加 bpf_iter 与 kfuncs,不用再让用户态解析整个 debugfs 转储就能按 pid / cgroup / 栈切片 〔10-09 19:23〕
○ mm:kswapd 每节点多线程、按 NUMA 负载唤醒的 RFC(v2,5 帖) 〔10-10 04:30〕
○ mm:KASAN 现在能检出涉及 kfree_rcu_sheaf() 的双重释放(2 帖) 〔10-10 05:46〕
○ mm:移除 add_to_page_cache_lru() 的 RFC(Matthew Wilcox) 〔10-10 00:55〕
📰 net 网络
/ column★ PON 子系统 RFC:把光网络单元做成一个像 wiphy 一样、本身不是网卡的内核对象
net/pon——面向 ITU-T 无源光网络(PON)的 ONU(光网络单元)侧子系统。 它不是一个网卡驱动,而是一套对象模型,作者给的对标物是 「cfg80211 + 一个 fullmac 驱动」。 struct pon_dev 是 PON 对象、本身不是 netdev, 用户态用设备 id 寻址(就像 nl80211 寻址 wiphy)。MAC 驱动负责跑 PLOAM 激活与密钥层级, 通过 pon_dev_state_report() 上报状态,核心负责校验这个状态跳转是否符合 ITU-T G.9807.1 表 C.12.4,再据此发布状态、设置 carrier。 T-CONT、GEM 端口与上行分类规则(那套 802.1p mapper)由核心持有、驱动卸载; 业务流量走普通数据网卡加若干 GEM 网卡(rtnetlink 的 link kind gem); OMCI 走一个 generic netlink family,既不新建地址族,也不建 OMCI 网卡。 gpon / xg-pon 给后续驱动。 🔗 原文
★ PSP 连接能换密钥了:设备密钥轮换之后,加密 TCP 不用断线重连
🔗 原文
★ 车规以太网又一块拼图:onsemi S2500(10Base-T1S)走到 v9
🔗 原文
今日动态
○ net:stmmac 引入 XDP 接收多缓冲支持(v5,3 帖) 〔10-09 18:26〕
○ net:PCS 引入 fwnode 支持(v18,12 帖)——长跑系列,已到第十八版 〔10-10 02:28〕
○ net:amt 修中继隧道 keying 与未认证 Request 导致的 DoS(v2,3 帖) 〔10-10 04:14〕
○ net:ibmveth 修挂起、use-after-free 与 netpoll 竞态(v3,8 帖) 〔10-10 02:33〕
○ net:taprio 修「重放调度条目」引发的 RCU stall(v2,2 帖) 〔10-09 20:33〕
○ net:DSA 的 motorcomm 驱动加上 yt922x 支持(v12,5 帖) 〔10-09 20:34〕
📰 DRM 显示
/ column★ 为 r000 固件腾地方:nova-core 把 GSP 命令队列拆成「与消息类型无关」
cmdq 变成对消息类型完全无感的传输层。 🔗 原文
★ MSM 的 DP / eDP 开始支持静态 HDR:先把「能送元数据、能点亮」这层做扎实
HDR_OUTPUT_METADATA)经由 connector 属性送到 DP / eDP。 🔗 原文
今日动态
○ DRM:Panfrost 修复合集到 v14(15 帖)——作者写明起点是 Claude 找出的问题,后续由 Sashiko 评审与维护者讨论不断扩围 〔10-09 20:34〕
○ DRM:drm_ras 新增 telemetry 节点类型,给 qaic 加速器上报遥测(3 帖) 〔10-10 01:35〕
○ DRM:nouveau 修三处空指针解引用(v2,3 帖) 〔10-10 01:44〕
○ DRM:vkms 支持立体(HDMI 3D)模式的 RFC——让虚拟显示能当 3D 接收端,供合成器与 IGT 测试用 〔10-09 14:57〕
○ DRM:Novatek NT37705 面板驱动(Fairphone 6)到 v4(4 帖) 〔10-09 19:25〕
📰 media 视频采集
/ column★ 两颗 GalaxyCore 传感器进主线:GC5035 与 GC8034,先只做 ACPI
GCTI5035;GC8034 是 800 万像素后置、4 lane、GCTI8034。 🔗 原文
★ i.MX 的 MIPI CSIS 补上 YUYV:同一份 CSI-2 数据,少一次格式转换
UYVY8_1X16,不认 YUYV8_1X16。 🔗 原文
今日动态
○ media:int3472 的 GPIO 类型命名与 Intel Windows 驱动不一致——0x0f / 0x10 / 0x11 该不该给正式名字,改了会不会撞默认名 〔10-10 06:36〕
○ media:Himax HM1092 单色近红外(NIR)传感器驱动(v6,2 帖) 〔10-10 02:37〕
○ media:ov05c10 清理与修复(v3,4 帖,Sakari Ailus) 〔10-09 17:34〕
○ media:Qualcomm CAMSS 增加 purwa 平台支持(v5,3 帖) 〔10-09 16:11〕
○ media:uvcvideo 处理「从 bulk URB 中间开始」的载荷 〔10-10 00:53〕
📰 fs 文件系统
/ column★ ext4 的缓冲 I/O 换到 iomap:v7 发出时,v6 已经合进 ext4 dev 分支
iomap 是新一代文件系统的 通用 I/O 框架(XFS 已经在用)——把「一次 I/O 覆盖哪些块、怎么映射」这件事从各文件系统 自己实现的 buffer_head 循环里抽出来。 🔗 原文
★ 块设备的九个修复:CONFIG_BUFFER_HEAD=n 下,mmap 写会被静默丢弃
IOCB_NOWAIT 与直接 I/O 三条路径。 CONFIG_BUFFER_HEAD=n 时 mmap 写入被静默丢弃; 第 2、3 帖在直接 I/O 写回退路径与 splice 读路径上拿 i_rwsem—— 这两条会和 set_blocksize() 修改 mapping 的最小 folio order 抢跑; 第 4 帖让缓冲读路径真正遵守 IOCB_NOWAIT 而不是无视它。 🔗 原文
今日动态
○ fs:exfat 回归——被删目录的陈旧 dentry 缓冲会覆盖新文件的数据(7.2) 〔10-10 03:41〕
○ fs:ntfs3 一批修复与重构(11 帖),含零簇计数、对齐的 hole punching 拒绝、ugm 挂载选项 〔10-10 01:17〕
○ fs:hfsplus 修时间戳回绕,并支持 2040 年之后的时间(v2,3 帖) 〔10-10 05:31〕
○ fs:块设备回写时跨缓冲区与 folio 合并 bio 的 RFC(4 帖) 〔10-09 17:58〕
📰 其余板块
/ column今日动态
○ block:存储元件「下线(depopulation)」支持到 v4(9 帖,Damien Le Moal)——给分区块设备定义一组通用操作,SCSI 磁盘实现、zloop 做模拟 〔10-09 17:09〕
○ block/virtio:virtio-blk 加内联加密支持(v4,2 帖)——给客户机的块设备做 FBE 虚拟化 〔10-09 12:17〕
○ arch:alpha 补完 direct-mm 的 TLB shootdown 修复(v3,2 帖) 〔10-10 05:25〕
○ arch:Hyper-V 的 VMBus 在 kexec 时从 syscore shutdown 做清理(v4,2 帖) 〔10-09 18:22〕
○ PCI:允许在 VMware 与 Hyper-V 客户机的 Intel 宿主上做 P2PDMA(2 帖) 〔10-09 23:40〕
○ LSM:EVM 检查 crypto_shash 各函数的返回值(Roberto Sassu) 〔10-09 19:29〕
○ sched:sched_ext 修「延迟重入队用到已销毁的用户 DSQ」的 use-after-free(for-7.3-fixes,Tejun Heo) 〔10-10 06:01〕
📌 机制雷达:4 条跨域信号
/ sectiondrm::JobQueue 的 RFC 走到 v5:给 Rust 驱动一套提交作业、等依赖 fence、 跑回调的抽象。这版把 Revocable<JobQueueInner> 加回来 (队列在依赖 fence 还没信号时被 drop 会死锁),并改为不持锁调用 run_job() ——因为 run_job() 可能睡眠。顺带把 DriverFence drop 里的 call_rcu() 换成 synchronize_rcu():只需要保证一个 RCU 宽限期, 不需要异步。 原文 ops.sub_child_ecaps_updated():当子调度器的 CPU 性能目标发生撤销时通知父调度器。 同一天还有一条 sched_ext 的 use-after-free 修复进了 for-7.3-fixes—— 一个已销毁的用户 DSQ 被延迟重入队再次使用。新调度器类还在快速补边界。 原文 📖 本期概念速查
/ sectionVM_SPECIAL 是历史上打包了 VM_IO | VM_DONTEXPAND | VM_PFNMAP | VM_DONTDUMP 的复合标志,本期被彻底删除,改用描述行为的谓词函数。 如果对你有用,点个赞,或留言聊聊你最关心的板块。
数据来源:lore.kernel.org(全内核 13 列表)· 北京时间