如果你已经在用 AI 编程助手写业务代码,那你大概率也动过“让 AI 帮我提交一个内核补丁”的念头。但 Linux 无线子系统维护者最近在公开邮件列表里的表态,给这个想法浇了一盆冷水:不要提交 AI 生成的垃圾补丁,内核社区不接受没有作者负责的东西。
这个表态看起来像是老派维护者对新工具的抗拒,但本质上是一场关于“质量成本由谁承担”的讨论。AI 能快速生成补丁,却不能替维护者承担硬件验证、代码审查和长期维护的责任。无线子系统尤其特殊:它面对的是型号繁多的网卡、固件交互和复杂的芯片行为,一个看起来完全符合编码规范的补丁,可能让某个 Realtek 网卡在特定环境下无法连接 WiFi。
这篇文章不打算复述邮件列表里的一两句原话,而是想讲清楚几个更实际的问题:Linux 内核的补丁审核流程到底有多严?为什么无线子系统对 AI 补丁格外敏感?如果你确实想用 AI 辅助做内核开发,怎样做才不会变成社区的负担?
1. 事件背景:无线子系统维护者为何公开拒绝 AI 补丁
用 AI 生成代码早已不是新鲜事。大模型能从自然语言描述中生成函数、修复明显错误、甚至补全整个驱动文件。但当这些代码以补丁形式涌入 Linux 内核邮件列表时,维护者的态度和普通开发者完全不同。
Linux 无线子系统维护者近期在社区讨论中明确表达了对“AI generated slop patches”的不满。这里的 “slop” 是英文社区对低质量内容的戏称,可以理解为“一看就是模型拼凑出来的、没有经过作者理解的东西”。这类补丁往往表面上像模像样,实际上可能只是把某个函数改名、调整了代码缩进、或者在错误的文件里“修复”了一个不存在的问题。
为什么维护者会特别生气?因为提交补丁这件事,本质上是在“申请占用别人的时间”。维护者每天要处理几十封补丁邮件,每一封都需要阅读、理解、判断、回复。如果提交者没有对代码负责,没有在真实环境中验证,那么维护者做的不是审阅,而是替 AI 的错误分类垃圾。
更关键的是,维护者反对的并不是“使用 AI 辅助开发”,而是“使用 AI 代替思考”。在 Linux 内核社区,补丁的署名(Signed-off-by)意味着作者愿意为这段代码负责。一个补丁如果只是 AI 根据错误日志自动生成的猜测性修复,提交者甚至看不懂它在干什么,那这个签名就是空头支票。
无线子系统恰恰是最不适合“猜测式修复”的地方。它涉及大量硬件驱动,包括 Realtek、Intel、Qualcomm、Atheros 等厂商的网卡。每一种芯片的寄存器行为、固件交互、电源管理都有差异,很多问题只能在实际硬件上复现。一个只跑过静态编译、没经过硬件测试的补丁,很可能帮倒忙。
所以,这次表态不是针对某个工具,而是对一种工作方式的拒绝:你可以用 AI 当帮手,但你不能用 AI 当作者。
2. 一张 Linux 内核补丁要过多少关
要理解维护者为什么对低质量补丁如此反感,先得看一张补丁进入 Linux 内核主线的完整路径。这个过程远不止“写代码 + 发邮件”这么简单。
2.1 邮件列表是第一道关卡
Linux 内核的补丁提交不走 GitHub Pull Request,而是通过邮件列表。开发者用git format-patch把提交转成补丁邮件,再用git send-email发送到相应的子系统列表,并抄送给维护者和相关 reviewer。
这意味着每一封补丁邮件都是一份公开的、可追溯的通信记录。维护者看到一封邮件时,第一眼会看标题前缀、改动文件、Signed-off-by,以及提交信息里有没有把“为什么”讲清楚。
如果提交信息只有一句“Fix issue”,或者“This patch is generated by AI”,维护者很难产生信任。邮件列表里没有机器人自动合并,真正决定补丁能不能被接收的,是人。
2.2 Signed-off-by 是责任声明
内核开发流程要求补丁必须包含Signed-off-by行。这不是一个格式摆设,而是开发者声明“这段代码是我写的,或者我以合适的方式引入,并且我愿意对它的来源和正确性负责”。
AI 生成的代码没有法律身份,也不存在“AI 愿意负责”这一说。如果一个人提交 AI 生成的补丁,却不理解代码逻辑,那这个 Signed-off-by 就失去了意义。提交者变成了“转述者”,而不是“作者”。
2.3 checkpatch.pl 只是最基础的过滤
内核自带一个脚本scripts/checkpatch.pl,用来检查补丁是否符合编码风格。它会检查缩进、空格、括号、提交信息格式、是否有Signed-off-by等等。
注意,checkpatch 通过只意味着“风格上没问题”,完全不代表“功能上正确”。很多 AI 生成的补丁能轻松通过 checkpatch,因为模型已经学会输出规范的内核代码格式,但代码所表达的逻辑可能是错的。
这也是维护者最头疼的地方:一个补丁从格式上看无懈可击,但一旦合入,可能会在真实硬件上引起回归。
2.4 构建测试和运行时验证
内核开发者至少在本地对目标架构进行编译,确认补丁不会引入编译错误。无线子系统还希望提交者在有条件的情况下做硬件测试,例如用iw命令检查网卡是否能正常扫描、连接 AP、切换频段。
这些验证成本对于个人开发者来说并不低。如果提交者只是让 AI 生成一个补丁,然后直接发到邮件列表,那么验证成本就全部转移到了维护者身上。维护者没有对应硬件时,只能靠代码 review 和经验判断,这种风险显然不能长期接受。
2.5 评审和迭代
即便补丁通过了前四关,维护者仍可能要求修改。可能是变量命名不清晰,也可能是需要补充注释解释寄存器配置的原因。AI 生成补丁的作者如果对代码没有充分理解,就无法在这个阶段做出有效的修改。
整个过程看起来繁琐,但正是这种繁琐保证了 Linux 内核在几十年里保持了极高的稳定性。维护者不是拒绝 AI,而是不愿意让 AI 破坏这条质量流水线。
3. 无线子系统为什么是 AI 补丁的“重灾区”
Linux 无线子系统(drivers/net/wireless)是内核中非常特殊的一块。它不像内存管理或文件系统那样有严格的抽象层,很多驱动代码是在跟具体的硬件寄存器、固件命令、射频参数打交道。
3.1 硬件驱动数量庞大
从老的realtek 8821ce wireless lan 802.11ac,到更早的qualcomm atheros ar956x network adapter,再到 Intel 的 Wireless-AC 系列,单是无线网卡驱动就占用了大量代码。这些驱动的维护者往往只负责少数几块硬件,没有条件为所有平台做回归测试。
当一个新的驱动补丁进来,维护者只能通过代码审查去判断它是否会影响其他芯片。如果提交者没有在真实网卡上测试,维护者就不知道这个改动的实际效果。
3.2 无线行为难以用静态分析验证
内存泄漏、空指针这类问题,通过代码审查和 build 测试就能发现。但无线网卡能不能连上路由器、信号强度怎么样、休眠唤醒后能不能恢复正常,这些行为依赖环境,很难通过纯代码推理得出结论。
例如,一个补丁“优化”了某款 Realtek 驱动的电源管理逻辑,静态检查完全通过,但在某些路由器环境下,可能会导致 5GHz 频段连接失败。这类问题只有经过实际场景测试才能暴露,而这恰恰是 AI 生成补丁最缺乏的。
3.3 用户问题的“最后一道出口”
在 CSDN 上搜索无线网卡驱动问题,能看到大量用户求助帖子:Linux 下 Realtek 8821CE 无法启用 802.11ac、Intel Wireless-AC 9560 出现感叹号、WIFI 6 网卡识别失败等等。这些用户往往最希望有人快速提交一个修复补丁。
然而,硬件问题的修复不是简单改个配置值就能完成的。真实的内核驱动开发流程要求开发者在多个硬件版本、多种路由器环境、不同的休眠唤醒状态下做回归测试。把 AI 生成的补丁草草发到邮件列表,反而会消耗维护者精力,推迟真正有效的修复。
在嵌入式 Linux 项目中,无线网卡适配同样是个高频问题。很多开发者需要在定制内核中编译某个无线驱动模块,遇到问题时想让 AI 帮忙“推断”一个修复方案。这时候必须明白:AI 能帮你写代码,但它不能帮你证明这个代码在你的硬件上能工作。
4. AI 生成补丁的典型特征与识别清单
作为提交者,你可以用下面这个清单自查:如果补丁符合多个特征,很可能就是维护者讨厌的 “slop patch”。
4.1 提交信息言之无物
AI 生成的提交信息通常很模板化,比如:
- “Fix issue”
- “Improve performance”
- “Refactor code”
内核要求提交信息解释“为什么做这个改动”。没有上下文,维护者无法判断改动意图。
诚然,有些新手提交者写人工描述时也写不清楚,但 AI 补丁的问题是它连“尝试解释”都没有。它只是把 diff 贴在邮件里,仿佛代码自己能说话。
4.2 改动逻辑与业务场景脱节
AI 模型是根据训练数据生成下一个 token,它不理解驱动代码背后的硬件行为。一个典型的表现是:补丁修改了某个寄存器初始化顺序,但完全没有解释为什么这个顺序在某个硬件上能解决实际问题。
维护者看到这种没有测试报告、没有问题描述、没有场景分析的改动时,很难认为它是经过验证的。
4.3 依赖模型训练数据中的“经典写法”
很多 AI 生成的内核补丁会把常见的写法套到不合适的场景中。例如,在错误的位置添加kfree()、把printk()改成dev_dbg()、在锁内多加了mutex_unlock()等。
这些模式在训练数据里大量存在,模型会“背”出来,但放到具体驱动语境中可能完全错误。
4.4 缺少测试描述
正经的补丁即使没有附上完整测试报告,提交者至少会写一句“已在 XX 网卡上测试,可以正常扫描和连接”。AI 生成的补丁通常只写“Compile tested”甚至什么都不写,因为实际没有任何硬件测试发生。
4.5 补丁集合松散
有时 AI 会把多个无关改动打包成一个补丁,或者把一个改动拆成多个无法独立编译的补丁。内核开发要求每个补丁是自洽、可独立提交的单元。如果补丁粒度混乱,维护者会直接退回。
5. 用 AI 辅助提交内核补丁的正确流程
看到这里,你可能会问:是不是内核开发不能用 AI?当然不是。AI 可以帮你做格式化、查 API、写示例、甚至是生成补丁初稿。关键是要让它停留在“辅助”的位置,而不是取代你的判断。
下面梳理一条更安全的路径。
5.1 先把问题定义清楚
不要一上来就发一段错误日志给 AI,让它给你生成补丁。内核维护者需要的是问题描述:内核版本、驱动模块、硬件型号、复现步骤、dmesg 日志、期望行为和实际行为。
这一步应该由人完成,因为只有你知道自己的硬件和网络环境。
5.2 让 AI 生成初稿,但逐行解释 Diff
在问题定义清楚后,你可以让 AI 基于现有代码生成一个补丁草案。但拿到 diff 后,要逐行问自己:
- 这一行为什么要改?
- 它和其他代码的先后顺序有没有依赖?
- 如果没有测试条件,这个改动的依据是什么?
如果答不上来,那这条补丁就不该进入邮件列表。
5.3 运行 checkpatch 和构建测试
无论补丁看上去多合理,先过本地检查:
# 进入内核源码根目录 ./scripts/checkpatch.pl --strict --no-tree 0001-fix.patch然后为无线驱动编译相关配置。实际命令取决于你的.config,但可以先把内核编一遍:
# 至少确保没有编译错误 make -j$(nproc)如果你的环境没有无线网卡,也要说明“仅编译测试,未做硬件验证”。不要隐瞒。
5.4 用 git format-patch 生成规范的补丁
内核补丁使用 git 提交生成:
git format-patch HEAD~1这会生成0001-xxx.patch,文件头部包含作者信息、提交信息和 diff。你需要检查:
- 提交信息是否足够详细
- 是否包含
Signed-off-by行 - 补丁是否只包含相关改动
5.5 发送到合适的列表
无线子系统的补丁应该发送到linux-wireless@vger.kernel.org,并在标题或说明里标明影响范围:
git send-email --to=linux-wireless@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org 0001-xxx.patch发送前最好先订阅列表,观察一段时间,了解社区的语言习惯和技术规范。
5.6 明确说明 AI 参与程度
截至目前,内核社区并没有强制要求提交者声明补丁是否由 AI 生成,但从这次维护者的表态来看,主动说明是有利的。
你可以在 cover letter 里写:
This patch was initially drafted with AI assistance. I reviewed every line, compiled the kernel, and tested on Realtek 8821CE hardware.这样做实际上是给维护者一个信号:你不是甩锅给模型,而是以真实工程师的身份对代码负责。
6. 完整示例:从 AI 草稿到可合并补丁
为了让流程更具体,我们做一个最小示例。假设你想修改某个无线驱动中的日志输出,把pr_debug换成驱动自己的dev_dbg。这个改动很小,但足够说明补丁的完整生命周期。
6.1 原始的 AI 草稿
AI 可能会生成这样的 diff:
drivers/net/wireless/example/example.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/example/example.c b/drivers/net/wireless/example/example.c index abc1234..def5678 100644 --- a/drivers/net/wireless/example/example.c +++ b/drivers/net/wireless/example/example.c @@ -42,7 +42,7 @@ static void example_irq_handle(struct example_dev *dev) dev_err(dev->dev, "IRQ status error\n"); return; } - pr_debug("IRQ handled\n"); + dev_dbg(dev->dev, "IRQ handled\n"); }看起来没什么问题,但你要意识到:dev_dbg只有在定义了DEBUG或者CONFIG_DYNAMIC_DEBUG时才会输出。直接替换并不一定是改进。这个判断不能甩给 AI。
6.2 用 git 提交并生成补丁
修改文件后,用 git 提交:
git add drivers/net/wireless/example/example.c git commit -s-s会自动添加Signed-off-by。提交信息可以这样写:
wifi: example: use dev_dbg for IRQ status handling The IRQ status message is device-specific and should match the coding style used by other functions in this driver. Replace pr_debug with dev_dbg to keep the log output consistent across the module. Signed-off-by: Your Name <your@email.com>注意第一行wifi: example:是内核常见的提交标题格式:子系统前缀 + 模块名 + 改动摘要。
然后生成补丁:
git format-patch HEAD~16.3 运行 checkpatch
检查生成好的补丁:
./scripts/checkpatch.pl --strict --no-tree 0001-wifi-example-use-dev_dbg.patch如果输出total: 0 errors, 0 warnings, 0 checks,说明风格过关。如果有警告,例如缺少Signed-off-by,需要先修掉再发送。
6.4 编译验证
无线子系统代码可以通过内核配置编译:
make menuconfig # 进入 Device Drivers -> Network device support -> Wireless LAN # 选择对应的驱动。 make -j$(nproc) drivers/net/wireless/如果编译报错,先看 error 信息。如果是驱动文件路径错误,需要检查.config是否启用了相关驱动。
6.5 在硬件上测试
如果你有对应网卡,可以这样验证:
# 查看无线网卡识别 lspci -nn | grep -i network # 查看内核日志 dmesg | grep -i wifi # 扫描可用网络 sudo iw dev wlan0 scan | head -50 # 连接 AP(根据环境修改) sudo iw dev wlan0 connect "YourSSID" key 0:YourPassword把测试结果写进补丁邮件的说明里。比如:“已在 Realtek 8821CE 网卡上验证,可以正常扫描并连接 2.4GHz 网络。”这样的说明能极大提升维护者信任度。
6.6 发送补丁
最后发送:
git send-email --to=linux-wireless@vger.kernel.org 0001-wifi-example-use-dev_dbg.patch记住,发送前再检查一遍补丁中是否包含任何调试残留、临时文件、无用空白符。
7. 常见问题与排查思路
即使使用了 AI 辅助,开发者仍然会在提交补丁时遇到各种问题。以下表格整理了一些典型情况。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 补丁被维护者拒绝 | 没有说明改动原因 | 查看维护者回复邮件 | 补充完整提交信息,解释动机和测试结果 |
| checkpatch 报 ERROR | 多行字符串、缩进、空格不符合风格 | 运行./scripts/checkpatch.pl --strict | 按提示修正,或参考相近驱动文件的写法 |
| 编译失败,找不到对应文件 | 内核.config未启用该驱动 | 查看drivers/net/wireless/Kconfig | 用make menuconfig启用相关驱动选项 |
Signed-off-by缺失 | 提交时忘了加-s | git log -1检查提交信息 | 使用git commit --amend -s重新提交 |
| 补丁邮件发送到错误列表 | 误用了 linux-kernel 列表 | 查看内核文档Documentation/process/submitting-patches.rst | 确认子系统维护者信息并重新发送 |
| AI 补丁逻辑与硬件行为不符 | 模型不理解驱动代码 | 用git blame查看历史改动 | 回退补丁,向维护者请求测试建议 |
| 无法做真实硬件测试 | 没有对应网卡 | 确实无硬件条件时不要硬测 | 在邮件里明确说明“仅编译测试”,请求维护者协助 |
这里要提醒一个常见心态:维护者反馈后不要立刻让 AI 重新生成一个补丁再发。正确做法是先理解反馈,定位问题,再考虑如何修改。如果每一步都由 AI 代劳,你会失去对补丁的控制权。
8. 最佳实践与工程建议
8.1 把 AI 当成“结对程序员”,而不是“外包团队”
AI 在生成代码草稿、搜索 API 用法、解释陌生代码方面非常高效。但内核开发的价值恰恰在于对硬件行为、边界条件、历史演进的理解。让 AI 替代这部分思考,等于把最核心的工程质量交给了概率模型。
一个可行的方式是:让 AI 帮你生成多个候选方案,你逐个分析利弊,选出最合适的一个,再补上测试和提交信息。
8.2 保持小补丁、单目标原则
内核社区非常推崇小补丁。一次只解决一个问题,每个补丁都能独立编译,描述里讲清“为什么”。小补丁也更容易定位问题。
如果 AI 生成了一个同时改了三个文件的补丁,优先考虑拆分。不要因为“省事”而一次给维护者一个难以 review 的大块头。
8.3 补丁提交前先检查“负责任三要素”
- 你理解这段代码的意图吗?
- 你在合适的环境里编译测试过吗?
- 你有办法向维护者解释每一行改动的理由吗?
三条里只要有一条不满足,补丁就不应该发送。
8.4 嵌入式项目中的落地建议
很多读者是嵌入式工程师,并不直接参与上游无线子系统开发,但会在自己的项目里编译修改驱动。这时 AI 同样有用,但建议严格遵守以下流程:
- 在干净的 Git 分支里做实验
- 记录所有修改对应的内核版本
- 使用 patch 文件管理改动,而不是直接改源码
- 每次改动后记录 dmesg 和 iw 输出
- 如果决定回上游,先清理实验性代码
这样即使后续要升级内核版本,也能快速评估同一个 AI 补丁是否还适用。
8.5 保护个人与项目安全
AI 生成代码时可能会引用网络上不安全的代码片段。在驱动代码里尤其要注意指针释放、锁操作、内存边界。补丁提交前应经过静态分析和代码 review,不要盲目相信“AI 说它修复了内存泄漏”。
同时,不要用 AI 去生成绕过授权限制、破解固件、干扰其他设备的功能。内核社区的协作是建立在合法、合规、尊重彼此劳动的前提下的。
9. 总结与后续学习方向
无线子系统维护者对 AI 生成垃圾补丁的拒绝,本质上是在提醒所有开发者:AI 可以成为工具,但不能成为借口。补丁能不能进入内核,最终取决于“作者有没有对代码负责”,而不是“模型生成了什么”。
如果你对内核补丁提交流程还不熟悉,建议先去读内核官方文档:
Documentation/process/submitting-patches.rstDocumentation/process/5.Posting.rstDocumentation/process/6.Followthrough.rst
然后找一个你熟悉的无线驱动,尝试从代码阅读开始,逐步理解驱动与固件交互的细节。当你对硬件有足够了解时,AI 辅助才能真正发挥作用。
下一次,当你准备训练一个“AI 提交补丁”的工作流时,我可以给你一个更准确的标准:好的 AI 补丁不是看起来像人写的补丁,而是在补丁提交人愿意签字的那一刻,人已经真正理解了它。如果理解这一层,AI 就不再是垃圾补丁制造机,而是帮助你更快成为内核贡献者的捷径。建议把这篇内容收藏备用,下次动手提交补丁前,再对照一遍你的工作流程。