📅 Linux 内核性能日报 - 2026-08-03

调度器 · 内存 · I/O · 文件系统 · 网络 · eBPF

📊 今日概览

16
LKML 补丁
0
内核提交
16
分析页面

⭐ 重点推荐

在多核(超线程)CPU 上,一个线程写完数据、通过同步唤醒叫醒另一个线程继续干活时,调度器现在会把这个"被唤醒的线程"放到那个"即将空闲、且缓存还是热的"核心上,让它直接复用数据而不用重新从内存加载。补丁作者自报在 POWER11 上 producer-consumer 握手(-l 5)的单次访问延迟降低约 +11%(作者自报、未独立验证,且 review 质疑该收益在 x86 等特定 SMT 布局下可能不成立)。

⚡ 调度器 (4 篇)

在多核(超线程)CPU 上,一个线程写完数据、通过同步唤醒叫醒另一个线程继续干活时,调度器现在会把这个"被唤醒的线程"放到那个"即将空闲、且缓存还是热的"核心上,让它直接复用数据而不用重新从内存加载。补丁作者自报在 POWER11 上 producer-consumer 握手(-l 5)的单次访问延迟降低约 +11%(作者自报、未独立验证,且 review 质疑该收益在 x86 等特定 SMT 布局下可能不成立)。
在 SMT 超线程服务器场景下,通过让 find_new_ilb() 优先选择整个 core 完全空闲的 CPU 作为 NOHZ idle load balancer,避免激活 busy core 的 SMT sibling 而拉低其算力,在 NVIDIA Vera 平台的 GEMM 基准中实测吞吐提升约 50%(6.2 → 9.4 TFLOP/s,作者自报)。
cache-aware balancing 引入的 migrate_llc_task 迁移类型用于跨 LLC 域的缓存感知任务迁移,但主动负载均衡(active load balance)路径未遵循该语义——本补丁修复这一行为不一致,提升缓存敏感任务跨 LLC 迁移的准确性。
在每 CPU 运行队列都带 CFS 带宽结构的调度场景下,通过调整结构体字段顺序减少内存填充(padding),为每个 cfs_bandwidth 实例省下少量内存。改动极小(3 字段位移),补丁未提供基准数据,收益为逻辑分析。

🧠 内存管理 (7 篇)

在管理员读取 /proc/sys/vm/lowmem_reserve_ratio 这个内存分配参数时,内核原本会无谓地重算各内存区域的低内存保留值(lowmem reserve)——本补丁让"读操作不再触发重算",只在实际写入参数时才重算,并顺带修复了两个问题:非法输入现在会返回错误(而不是静默接受)、写入多个值时不会因中间某个值非法导致数据被部分更新。这是纯逻辑修正,作者未提供 benchmark 数据(v4,Johannes Weiner Acked-by)。
在需要频繁访问 VMA(如 page fault、Binder、TCP)的负载下,作者把 per-VMA 锁从"仅部分架构 + SMP + MMU 可用"扩展到全配置,并引入 vma_start_read_unlocked() 新 API,让代码在热路径上彻底绕开 mmap_lock 全局锁——减少多线程争用,同时简化了大量 #ifdef 分支。(补丁未提供基准数据,机制收益为逻辑分析)
在绑定/重绑大容量 PMEM(持久内存)命名空间时,内核需逐页初始化几乎相同的 struct page 描述符,耗时明显。本系列通过复用"模板页"避免逐页重复初始化,并在 x86 上用 memcpy_nontemporal() 非时间局部性拷贝,使 memmap 初始化耗时在 nd_pmem rebind 场景降低约 60%(作者实测:244.28ms → 96.79ms)。
在从 device-private 内存(如 GPU、持久内存的私有页)swap-in 时,内核 do_swap_page() 需要对目标页加锁、迁移回 RAM。本补丁把这段路径从旧 page API(trylock_page/get_page)迁移到 folio API(folio_trylock/folio_get),是内核全面 folio 化的持续推进——已被 David Hildenbrand(Acked-by)和 Lorenzo Stoakes(Reviewed-by)两位 mm 维护者认可。
内核在把基于 struct page 的页面 API 全面迁移到 struct folio,而 wait_on_page_writeback() 是 folio_wait_writeback() 的一个兼容包装,只剩 ceph 写回同步路径这一个调用者;本系列先把该调用者迁移到 folio API,随后删除这个失去调用者的兼容包装函数及其声明——纯重构、作者明确"无功能变化",是 folio 化大工程的收尾步骤。
在系统调用等场景下,内核自身通过 copy_from_user()/copy_to_user() 访问用户地址、触发缺页时,本补丁(RFC)让这类"内核态缺页"从无条件走 mmap_lock 全局锁,改为先走 per-VMA 锁快路径(锁不到才回退 mmap_lock),从而降低多线程下 mmap_lock 争用。作为 RFC 仅在 x86/arm64 上演示,未提供基准数据。
RCU/SRCU 的回调链表的访问只能在关中断下进行,当 call_rcu()/call_srcu() 在中断已关闭的上下文中被调用时(典型如 NMI 处理器或 BPF fentry 挂在内核入队路径上的重入),会打断链表操作,造成链表破坏或自死锁。本系列用「llist 暂存 + irq_work 回投」的延迟机制,使回调入队在任意上下文(含 NMI)都安全,消除了一类自我死锁/内存破坏的 bug。

💾 I/O (2 篇)

在块设备 O_DIRECT 写路径中,当一次直接写只完成一部分、剩余字节通过回落(fallback)转为缓冲写时,这段缓冲写此前在无任何锁保护下执行,与并发的 ioctl(BLKBSZSET) 调整块大小竞争,可在 __filemap_add_folio() 触发 VM_BUG_ON_FOLIO 内核崩溃;本补丁在回落写外加 inode_lock_shared(bd_inode),从根上消除该竞态。
在把 GPU/设备内存(dma-buf)直接读写到 NVMe 裸块设备的场景下,块层原来必须为每次 I/O 用页描述符数组(bio_vec)描述数据、并现场做 DMA 映射(IOMMU 下开销巨大);本补丁把 bio 里存页数组的指针槽改造成联合体,让它改存一个"已经映射好的 dma-buf 映射",于是块层和驱动可跳过逐页描述与逐次 DMA 映射,直接下发预建好的 SGL/PRP。系列级基准(写入 cover letter,合作者 Anuj 早前用 udmabuf 测得,未独立验证):STRICT 模式从 570 KIOPS 提到 5.01 MIOPS(约 8.8×),追平 PASSTHROUGH 上限。

🌐 网络 (2 篇)

在 stmmac 网卡的高吞吐 Tx 场景下,作者把发送路径的 DMA buffer 从"每次 dma_map_single 流式映射"改为"page_pool 复用缓冲池"(通过 snps,pagepool-tx-buf-quirk 设备树属性启用),减少反复 DMA 映射/解映射的开销。补丁未提供基准数据,收益为逻辑分析。
Microchip lan743x PCIe 网卡驱动原先把固定 400us 的中断调制定时器写入全部 per-vector 寄存器,既不随链路速率变化、也无法被用户态配置;本系列把定时器改为随协商速率自适应(2.5G→64us、1G→150us、100M/10M→330us),并新增 ethtool -c 的 get/set_coalesce 接口把聚合能力开放给用户态。

🔬 eBPF (1 篇)

BPF verifier 把"持锁期间"视为隐式 RCU 读侧区,因此持锁时从 map 里读出的 kptr 会被标记为 MEM_RCU;在 sleepable 程序里释放最后一把锁会结束唯一 RCU 上下文,但旧 verifier 仍允许该指针继续使用,造成可被触发的 task_struct use-after-free。本补丁在解锁路径记录 RCU 状态翻转,调用已有的 invalidate_rcu_protected_refs() 把 MEM_RCU 指针降级为 PTR_UNTRUSTED——这是 verifier 健全性修复,而非性能优化。

ℹ️ 生成信息

数据来源:kernel-lore MCP lore_activity 检索(freshness as_of 2026-08-02 19:16 UTC)+ 内核 git 仓库
由 reporting-daily-kernel 工作流生成 · 每篇经独立 analyzing-lkml-patches 深度分析 + checking-references 引用验证
⚠️ 免责声明

本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。