preempt/irq:计数式中断开关 + NMI 位域迁出(Rust SpinLockIrq 系列 v4 进展更新)
💡 一句话总结
本报告是 08-04 对 preempt/irq NMI 优化的进展更新:作者 Boqun Feng 在 08-04 发布了完整的 v4 17 补丁系列(此前只分析了 git pull 中 2 个补丁),把“中断禁用层级”用 preempt_count 位域计数(local_interrupt_{disable,enable}()),为 Rust SpinLockIrq 提供自动恢复中断状态的关中断自旋锁;为此先把 NMI 嵌套深度从 preempt_count 的 4 bit 位域迁到独立 per-CPU 计数器 nmi_nesting(4 bit 压成 1 bit 标志),腾出空间给新的 HARDIRQ_DISABLE 计数字段,并新增 HAS_SEPARATE_PREEMPT_RESCHED_BITS 让 arm64/s390/x86 的“需要重调度”标志与计数分离。相比 v1:08-04 分析的“中断开关最外层省一次 preempt_count 读”的 irq 优化补丁已按 Peter Zijlstra 意见整体删除。补丁未提供基准数据,性能收益为机制层面逻辑分析(解读(AI 分析))。
📋 补丁基本信息
| 项目 | 内容 |
|---|---|
| 补丁类型 | 新特性(为 Rust SpinLockIrq 引入 preempt_count 计数式中断开关)为主,兼有优化/重构性质(NMI 位域腾挪、HARDIRQ_DISABLE 计数、HAS_SEPARATE 架构分离、sched 符号比较清理) |
| 状态 | In Review(v4 于 2026-08-04 提交,v4.1 微调核心补丁,尚未合入) |
| 当前版本 | v4 · cover letter(2026-08-04 16:14 UTC,即北京时间 08-05) |
| 版本演进 |
Lyude/Joel NMI 补丁:Lyude v15(2025-12-02) → Lyude v17(2026-01-21) → 本系列 v4 01/17(2026-08-04) 计数式中断开关:Boqun v3(2026-06-05) → 07-31 git pull 24 补丁(08-04 分析对象)→ v4 17 补丁(08-04) → v4.1 核心补丁修订(08-04 18:26) |
| 作者机构 | Boqun Feng(kernel.org / rust-for-linux 维护者)主笔 9 补丁;Lyude Paul(Red Hat)6 补丁(Rust 侧 + KUnit 测试 + openrisc 构建修复);Joel Fernandes(NVIDIA)1 补丁(NMI 迁出);Heiko Carstens(IBM)1 补丁(s390 enable) |
| 提交日期 | 2026-08-04(v4 系列 17 补丁,36 文件,+1060/-91) |
| 改动范围 | 核心性能相关子集:NMI 迁出(4f +23/-7)、HARDIRQ_DISABLE_BITS(preempt.h 位域重排)、__preempt_count_{sub,add}_return()、irq & spin_lock: Add counted interrupt disabling/enabling(8f +242/-2,核心)、HAS_SEPARATE_PREEMPT_RESCHED_BITS(9f +115/-37)、arm64/s390/x86 Kconfig enable(各 +1)、sched __cant_sleep/__cant_migrate 清理、KUnit 测试(+110/-0);其余为 Rust 侧 interrupt.rs / SpinLockIrq / helper / openrisc 构建修复 |
| 核心函数 | local_interrupt_disable() / local_interrupt_enable() / hardirq_disable_{enter,exit}() / __nmi_enter() / __nmi_exit() / spin_lock_irq_disable() / __cant_migrate() |
| 原始链接 | v4 cover letter Message-ID · NMI 补丁 01/17 · irq 补丁 05/17 |
📊 速览卡片
🎯 解决什么问题
preempt_count 位域里实现“计数式中断禁用”(local_interrupt_{disable,enable}()),为 Rust 提供自动恢复中断状态的关中断自旋锁 SpinLockIrq,从而解锁若干 Rust 驱动(cover letter 原话:“This should unblock a few drivers in Rust”)。本系列是“先铺地基、再造锁、再上用户”的三层结构:
① 前提层——NMI 嵌套迁出(01/17)+ HARDIRQ_DISABLE_BITS(02/17)+
__preempt_count_{sub,add}_return()(03/17):把 NMI 位域腾出来、定义 8 bit 的 HARDIRQ_DISABLE 计数字段、提供“返回新值”的计数原子 helper;② 主体层——
irq & spin_lock: Add counted interrupt disabling/enabling(05/17):新增 local_interrupt_{disable,enable}() 与 spin_lock_irq_disable()/spin_unlock_irq_enable() 系列;③ 收尾层——HAS_SEPARATE_PREEMPT_RESCHED_BITS(10/17)+ arm64/s390/x86 enable:让“需要重调度”标志与计数位域分离,配合中断开关语义;加 locking 清理、sched 清理(含 09/17 的
__cant_migrate() 符号比较)、KUnit 测试、Rust 侧 interrupt.rs / SpinLockIrq(13-17/17 附近,Lyude 收尾)。整体价值:单看任何一个补丁都只是位域或 API 微调;合起来才构成“C 语言
spin_lock_irqsave() 的手动保存/恢复中断标志 → Rust RAII guard 自动恢复”的完整能力,是一整类 Rust 驱动接入的前提。
SpinLockIrq:C 语言里 spin_lock_irqsave() 要求调用方手动保存/恢复中断标志 flags,容易漏配对;Rust 的 RAII guard 希望在 drop() 时自动恢复中断状态。方案是把“中断禁用的嵌套层级”记进 preempt_count(即“计数式中断开关”),这样最外层退出临界区时能自动恢复。cover letter 原话(v4):主要改动是 “the introduction of preempt_count backed interrupt disabling level tracking, i.e. the local_interrupt_{enable, disable}(), along with the user (the Rust SpinLockIrq)”,并明确列出 v4 相对 07-31 PR 的变更:“Removed the preempt_count check in local_interrupt_enable() per Peter”(即删除了 08-04 分析过的 irq 优化补丁)、“Simplified the local_interrupt_disable_state struct”、“Improved the documentation on the preempt_count layout regarding HAS_SEPARATE_PREEMPT_RESCHED_BITS”。
preempt_count 是一个 32 位、每线程的整型,用位域同时承载“可抢占深度(8bit)、软中断深度(8bit)、硬中断深度(4bit)、NMI 嵌套深度(4bit)、需要重调度(bit31)”。NMI 嵌套用 4 bit(最多 15 层),现实中几乎不超 1–2 层,明显冗余,却把位域撑满——无法再放入新的计数字段(如 HARDIRQ_DISABLE)。
缺陷 2(irq 补丁解决):要提供“可嵌套的关中断”原语,需要在 preempt_count 里维护一个独立的“硬中断禁用计数”(
HARDIRQ_DISABLE),让 local_interrupt_disable() 嵌套调用只有第一层真正执行 local_irq_save()、最外层退出才 local_irq_restore()。这个计数字段在 preempt_count 里原本不存在,必须先从 NMI 位域“借”出空间。
缺陷 3(HAS_SEPARATE 解决):当“需要重调度”标志(
PREEMPT_NEED_RESCHED)与计数字段挤在同一个 32/64 位字里时,任何对计数的加/减都必须先读出并保留该标志位,否则会把它冲掉;把标志挪到独立位置(arm64 的 preempt.need_resched 字段)后,计数操作不必再“保住位 31”,中断开关/重调度检查更直接。
spin_lock_irqsave()/spin_unlock_irqrestore() 家族)。改造后新增的 spin_lock_irq_disable()/spin_unlock_irq_enable() 在每次 lock/unlock 都走 local_interrupt_disable()/enable(),即 __preempt_count_add_return()/__preempt_count_sub_return()——这条路径的频率与自旋锁一样高(驱动、内核同步到处都是)。NMI 路径(
__nmi_enter()/__nmi_exit())是处理器最高优先级异常入口/出口,perf、watchdog、硬件错误处理都会触发;在 NMI 下内核原则上“不吃锁、不调度”,进出要求尽可能廉价。Rust 侧场景:即将接入的若干驱动(cover letter 只提 “unblock a few drivers in Rust”,具体驱动未列出,属推断)会使用
SpinLockIrq,其 guard 的 drop 走 spin_unlock_irq_enable() → local_interrupt_enable(),自动恢复中断状态。
🧩 核心机制
v4 系列的核心机制是三个环环相扣的改动:① 把 NMI 嵌套深度迁到 per-CPU 计数器(腾位域);② 用腾出的位域定义 HARDIRQ_DISABLE 计数,实现“计数式中断开关”(local_interrupt_{disable,enable}());③ 让“需要重调度”标志与计数分离(HAS_SEPARATE_PREEMPT_RESCHED_BITS),使计数加减不必保护标志位。
DEFINE_PER_CPU(unsigned int, nmi_nesting)。__nmi_enter() 里 __this_cpu_inc(nmi_nesting)(上限 15),再 __preempt_count_add(HARDIRQ_OFFSET) 保持“硬中断计数”语义,并用 preempt_count_set(preempt_count() | NMI_MASK) 置上唯一的 NMI 标志位;__nmi_exit() 反向:__this_cpu_dec_return(nmi_nesting) 归 0 才清标志。为什么这么改:嵌套深度不再占 preempt_count 的 4 bit,只留 1 bit“是否在 NMI 中”的布尔标志,in_nmi() 语义不变,腾出的位域交给 HARDIRQ_DISABLE。
逻辑点 2:计数式中断开关(05/17,主体)。新文件
include/linux/interrupt_rc.h 定义 local_interrupt_disable():hardirq_disable_enter() 即 __preempt_count_add_return(HARDIRQ_DISABLE_OFFSET),当返回的新计数 == HARDIRQ_DISABLE_OFFSET(说明从 0 进入第 1 层)才真正 local_irq_save();local_interrupt_enable() 反向:hardirq_disable_exit() 返回计数归 0(说明最外层退出)才 local_irq_restore()。为什么这么改:把“中断禁用层级”变成 preempt_count 里的一个计数字段,嵌套进出只做无锁计数加减,只有最外层才碰真正的 IRQ 屏蔽寄存器。配套 __irq_exit_rcu() 增加 !hardirq_disable_count() 判断,避免在 local_interrupt_disable() 进行中触发 softirq。
逻辑点 3:HAS_SEPARATE_PREEMPT_RESCHED_BITS(10/17 + arm64/s390/x86 enable,收尾/落地)。引入 Kconfig
HAS_SEPARATE_PREEMPT_RESCHED_BITS,在 arm64/s390/x86 上把“需要重调度”标志放在与计数独立的字段(arm64 已有 thread_info.preempt.need_resched,见 arch/arm64/include/asm/preempt.h:set_preempt_need_resched()/clear_preempt_need_resched()/test_preempt_need_resched())。为什么这么改:当标志独立后,__preempt_count_add/sub 不必在读-改-写时保住位 31,中断开关路径的重调度检查可用专用字段直接判断,语义更清晰(机制基于 arm64 现有 preempt.h + cover letter 描述,标“解读(AI 分析)”)。
nmi_nesting(NMI_BITS 4→1),腾出 bits 16-23 给 HARDIRQ_DISABLE 计数;② local_interrupt_{disable,enable}() 以 HARDIRQ_DISABLE 计数驱动:首层进入才 local_irq_save(),最外层退出才 local_irq_restore(),嵌套进出仅做无锁计数加减来源:基于 lore 真实补丁 diff(PATCH v4 01/17、PATCH v4 05/17)绘制
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h
index d57cab4d4c06..8d4895531a45 100644
--- a/include/linux/hardirq.h
+++ b/include/linux/hardirq.h
@@ -10,6 +10,8 @@
#include <linux/vtime.h>
#include <asm/hardirq.h>
+DECLARE_PER_CPU(unsigned int, nmi_nesting);
+
extern void synchronize_irq(unsigned int irq);
extern bool synchronize_hardirq(unsigned int irq);
@@ -102,14 +104,17 @@ void irq_exit_rcu(void);
*/
/*
- * nmi_enter() can nest up to 15 times; see NMI_BITS.
+ * nmi_enter() can nest - nesting is tracked in a per-CPU counter.
*/
#define __nmi_enter() \
do { \
lockdep_off(); \
arch_nmi_enter(); \
- BUG_ON(in_nmi() == NMI_MASK); \
- __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \
+ /* Maximum NMI nesting is 15. */ \
+ BUG_ON(__this_cpu_read(nmi_nesting) >= 15); \
+ __this_cpu_inc(nmi_nesting); \
+ __preempt_count_add(HARDIRQ_OFFSET); \
+ preempt_count_set(preempt_count() | NMI_MASK); \
} while (0)▲ 逻辑点 1 的核心:__nmi_enter() 把嵌套深度记到 per-CPU 计数器(__this_cpu_inc(nmi_nesting),同 CPU 无锁),preempt_count 只留 1 bit NMI 标志。关键:preempt_count_set(preempt_count() | NMI_MASK) 用 set 而非 sub,是为避免嵌套退出时计数下溢(本系列 commit message 明确记录)。这一段与 08-04 分析的版本逐字一致,说明 NMI 迁出在 v4 中保持不变。
diff --git a/include/linux/interrupt_rc.h b/include/linux/interrupt_rc.h
new file mode 100644
index 000000000000..b9a7f05ecf42
--- /dev/null
+++ b/include/linux/interrupt_rc.h
@@ -0,0 +1,82 @@
+static inline void local_interrupt_disable(void)
+{
+ int new_count;
+
+ WARN_ON_ONCE(in_nmi());
+
+ new_count = hardirq_disable_enter();
+
+ /* Interrupts can happen here, but it's OK, see __irq_exit_rcu(). */
+
+ if ((new_count & HARDIRQ_DISABLE_MASK) == HARDIRQ_DISABLE_OFFSET)
+ _local_interrupt_disable();
+}
+
+static inline void local_interrupt_enable(void)
+{
+ int new_count;
+
+ new_count = hardirq_disable_exit();
+
+ if ((new_count & HARDIRQ_DISABLE_MASK) == 0)
+ _local_interrupt_enable();
+}▲ 逻辑点 2 的核心:local_interrupt_disable() 先用 hardirq_disable_enter()(即 __preempt_count_add_return(HARDIRQ_DISABLE_OFFSET))把计数 +1,只有当新计数恰好等于一个 OFFSET(从 0 进入第 1 层)才真正 local_irq_save();local_interrupt_enable() 对称,计数归 0 才 local_irq_restore()。关键:中间层只做无锁计数加减、不碰 IRQ 屏蔽寄存器——这就是“可嵌套且最外层自动恢复”的来源。注意 v4 里这个函数已不含 08-04 报告分析的 local_interrupt_enable_reched() 重调度检查(该优化已按 Peter 意见删除)。此段为 interrupt_rc.h 新文件 diff 的核心部分(省略文件头 SPDX、头文件包含与底层 __local_interrupt_{disable,enable}() 定义,逐字取自 lore 原文)。
| 步骤 | 操作 | 目的 |
|---|---|---|
| NMI 进入 | __this_cpu_inc(nmi_nesting) + __preempt_count_add(HARDIRQ_OFFSET) + preempt_count_set(preempt_count() | NMI_MASK) | 嵌套深度记到 per-CPU 计数器;preempt_count 只留 1 bit NMI 标志 |
| NMI 退出 | __this_cpu_dec_return(nmi_nesting) 归 0 才清 NMI_MASK | 只有最外层 NMI 退出才清除“在 NMI 中”标志,保持 in_nmi() 语义 |
| 中断开关进入 | hardirq_disable_enter() 计数 +1,新计数 == OFFSET 才 local_irq_save() | 嵌套进入只计数,不重复关中断 |
| 中断开关退出 | hardirq_disable_exit() 计数 -1,新计数归 0 才 local_irq_restore() | 最外层退出才恢复中断,RAII 自动恢复的基础 |
📈 性能影响
① 位域腾挪(功能前提,非直接减指令):NMI 路径改造后仍要
__preempt_count_add/sub(HARDIRQ_OFFSET) + __this_cpu_inc/dec(nmi_nesting) + preempt_count_set()(cmpxchg 循环),单次 NMI 进出的指令数未必更少——Peter Zijlstra 此前正是因此批评 preempt_count_set() 偏贵。真正收益是空出 3 bit、解锁 Rust SpinLockIrq(功能/生态收益)。② HAS_SEPARATE_PREEMPT_RESCHED_BITS(on-CPU 计数操作简化):把“需要重调度”标志与计数位域分离后,
__preempt_count_add/sub 不必在读-改-写时保住标志位,中断开关/重调度检查可用专用字段直接判断——这是本系列最接近“热路径减指令”的改动(解读(AI 分析),无实测)。③ 曾被分析过的“中断开关省一次 preempt_count 读”已删除:08-04 报告的
irq: Optimize reschedule check in local_interrupt_enable() 在 v4 中按 Peter 意见整体移除,该项 on-CPU 减读收益不再生效。
- Rust 驱动接入(主要受益者):
SpinLockIrqguard 在 drop 时自动local_interrupt_enable(),消除手动 flags 保存/恢复的漏配对 bug——这是本系列的“主战场”,收益是功能与正确性,非吞吐。 - arm64/s390/x86 的 preempt_count 计数路径(间接):HAS_SEPARATE 落地后,计数加减与 NEED_RESCHED 解耦,理论上有轻微指令/分支简化(解读(AI 分析))。
- NMI 路径:位域迁出让 NMI 进出不再动 4 bit 嵌套字段,但引入了
preempt_count_set()的 cmpxchg,净指令数未减——更多是“为功能腾位”的代价而非收益。 - sched 调试路径:
__cant_migrate()的preempt_count() > 0改preempt_count(),避免对无符号/有符号的隐式比较(1 行,语义等价,性能影响可忽略)。
| 场景/用例 | 运行环境 | 改进前 | 改进后 |
|---|---|---|---|
| (补丁未提供基准数据) | — | — | — |
补丁未提供任何 benchmark 数据,也不含“作者自报”的量化提升。以上为基于 diff 的机制层面逻辑分析(解读(AI 分析)),非实测。on-CPU vs off-CPU:本系列改动集中在 on-CPU(计数加减/位域操作)层面;无 off-CPU(锁等待/唤醒延迟)数据。
🔄 方案演进
本报告是 08-04 分析的“早期 2 补丁”到“v4 完整 17 补丁”的进展更新,演进受 Peter Zijlstra 的 review 直接推动。
irq: Optimize reschedule check in local_interrupt_enable()(13/24)。v4(2026-08-04,17 补丁完整系列):相对 07-31 PR 的 changelog——
- 删除
local_interrupt_enable()里的 preempt_count 重调度检查(“Removed the preempt_count check in local_interrupt_enable() per Peter”)——即 08-04 分析的 irq 优化补丁整体移除; - 简化
local_interrupt_disable_state从 struct 包装改为裸unsigned long(“Simplified the local_interrupt_disable_state struct to avoid unnecessary wrapper, Thanks Peter”); - 新增 HAS_SEPARATE_PREEMPT_RESCHED_BITS 机制 + arm64/s390/x86 enable(改进 preempt_count 布局文档);
- 调整
do_sched_cfs_*_timer()用户侧、更新 s390 asm 注释、SoB/拼写修复。
- Peter Zijlstra 对“计数式中断开关”整体必要性的质疑(08-03):针对 07-31 PR 的 irq 优化补丁回复“As stated before; this whole thing is a mystery to me, this should not be needed”(来源:20260803114128,08-04 旧报告已记录)。作者回应:在 v4 中整体删除该补丁。
- Peter 对 interrupt_rc.h 结构简化的意见(08-04 09:26)(来源:20260804072640.GL687043):确认
local_interrupt_disable_state从 struct 包装简化成裸unsigned long合理,并确认_local_interrupt_disable()/_local_interrupt_enable()需要EXPORT_SYMBOL_GPL()(Peter 原话 “Quite so.”)。v4 补丁里这两个函数用EXPORT_SYMBOL(非 GPL),v4.1 修订版(8f +240/-2)应在处理此点。 - NMI 补丁的历史 review 遗留:08-04 旧报告记录了 Peter 对
preempt_count_set()的 cmpxchg 代价与nmi_nesting缓存局部性的两条意见(20260203121520、20260203114454),本 v4 系列中 NMI 补丁 diff 未变,这两点仍未解决。
spin_lock_irqsave/restore 语义)。作者以“删除最具争议的 irq 优化补丁 + 简化结构 + 单独 v4.1 修订核心补丁”回应,但保留了 NMI 位域迁出与计数式中断开关主体——它独立解决“位域紧张 + Rust 需要可嵌套自动恢复中断”的问题。
⚠️ 风险与局限
- 架构前提:HAS_SEPARATE_PREEMPT_RESCHED_BITS 只在 arm64/s390/x86 上 enable;其余架构继续把 NEED_RESCHED 放在 preempt_count 位 31,相关“计数简化”收益不成立(no-op)。
- 生态前提:Rust
SpinLockIrq的价值依赖 Rust 驱动生态真正落地;在无 Rust 驱动的内核上,整个系列只留下位域重排,属“为未来功能腾位”,无直接用户可见收益。 - NMI 深度前提:NMI 嵌套实际上限 15 的
BUG_ON(nmi_nesting >= 15)是防御性断言,现实中几乎不可达;若未来出现递归 NMI 风暴会直接 BUG_ON 崩溃(失败模式)。
- 新 API 只影响新调用方:
spin_lock_irq_disable()/spin_unlock_irq_enable()/spin_trylock_irq_disable()是新增原语,现有spin_lock_irqsave/restore()调用方零行为变化;迁移是增量式的。 - preempt_count 位域重排是全架构影响面:
NMI_MASK从0x00f00000变0x00100000、新增HARDIRQ_DISABLE_MASK,所有读in_nmi()/in_interrupt()/preempt_count()的代码位掩码都变;若某个架构未同步,会静默破坏中断上下文判断——这是合入前最需要关注的一致性问题。 - NMI 路径引入 cmpxchg:
preempt_count_set()是 cmpxchg 循环,把 NMI 进出变贵(Peter 历史批评);对 perf/watchdog 高频 NMI 场景有轻微延迟影响(严重度 MINOR,解读(AI 分析))。 - 中断开关进行中的 softirq 门控:
__irq_exit_rcu()新增!hardirq_disable_count()判断,防止local_interrupt_disable()进行中触发 softirq——若该判断有误会延迟 softirq 处理,需 KUnit 与实测覆盖。
preempt.h 与 spinlock_api_*.h,需要各架构维护者同步 Ack。Rust 侧新增 kernel/interrupt.rs、SpinLockIrq 依赖 Rust-for-Linux 工具链同步;KUnit 测试覆盖计数式 enable/disable 的嵌套语义(对应测试文件 kernel/irq/refcount_interrupt_test.c,cover letter 文件统计 +109 行)。
- Peter 对“计数式中断开关”整体必要性的质疑已通过“删除 irq 优化补丁”部分回应,但
HARDIRQ_DISABLE计数本身是否最终被接受,仍待合入评审(来源:20260803114128)。 EXPORT_SYMBOL_GPL()意见:v4 中_local_interrupt_disable/enable用EXPORT_SYMBOL,Peter 明确要求EXPORT_SYMBOL_GPL()(“Quite so.”),v4.1 是否修正尚未核实。- NMI 补丁的
preempt_count_set()cmpxchg 与nmi_nesting缓存局部性两条历史意见在 v4 中仍未解决。
🔗 交叉引用
[PATCH v4 01/17] preempt: Track NMI nesting to separate per-CPU counter — 前提层:NMI 嵌套计数迁出(与 08-04 分析版本一致)。
[PATCH v4 05/17] irq & spin_lock: Add counted interrupt disabling/enabling — 主体层:计数式中断开关 + 新 spinlock 原语(核心)。
[PATCH v4 10/17] preempt: Introduce HAS_SEPARATE_PREEMPT_RESCHED_BITS — 收尾层:NEED_RESCHED 与计数分离的 Kconfig 机制(9f +115/-37)。
[PATCH v4 09/17] sched: Avoid signed comparison of preempt_count() in __cant_migrate() — sched 清理(1 行)。
[PATCH v4 04/17] openrisc: Include <linux/cpumask.h> in smp.h — 构建修复(Lyude,1 行)。
(arm64/s390/x86 的 HAS_SEPARATE enable、KUnit 测试与其余 Rust 侧补丁:message-id 未能在本次 lore 索引中精确解析,见 cover letter 的 17 补丁清单与文件统计。)
[PATCH v4.1 05/17] irq & spin_lock(核心补丁修订版) — v4 发布当日按 Peter review 修订。
Boqun v3(2026-06-05) — 计数式中断开关的 v3。
Lyude v17(2026-01-21) — NMI 补丁原始系列。
Peter Zijlstra review(2026-08-04) — interrupt_rc.h 结构简化 + EXPORT_SYMBOL_GPL。
Peter Zijlstra(2026-08-03) — “整个机制存疑”→ 触发 irq 优化补丁删除。
本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。