第一次提交内核patch尝试

虽然很早就对linux kernel的开发流程比较熟悉了,但是一直没有尝试过向内核社区贡献 patch , 最近看到一个内核开发者写的A Kernel Developer`s Notes专栏文章,介绍了自己对内核理解、跟踪学习内核 patch 流程,以及复现内核 bug 、提交 patch 的流程等等,写的很好,很有可操作性。因此也想跟着学习一番。
本文是阅读以下文章后的尝试: https://www.linkedin.com/pulse/fixing-one-line-learning-whole-process-moon-hee-lee-uu0cc/?trackingId=wxTo5KYjT5KhL8zO9ZXqIw%3D%3D

准备内核

1
2
3
4
5
6
7
8
9
sudo apt install git

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux/

sudo apt install make llvm lld clang flex bison libssl-dev # 编译的时候缺什么就装什么

make O=llvm-build LLVM=1 defconfig
make O=llvm-build LLVM=1 -j$(nproc)

准备patch

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
make htmldocs
# 会提醒缺少依赖,全部安装一下
sudo apt-get install imagemagick graphviz dvipng python3-venv gcc latexmk librsvg2-bin texlive-lang-chinese texlive-xetex python3-sphinx
# 会发现有很多报错,也可以研究一下,fix掉,提patch

sudo apt install codespell
find Documentation/   -path Documentation/translations -prune -o   -name '*.rst' -print | xargs codespell
# 会发现有很多报错,可以尝试找几个简单的尝试修复一下 

git commit  -s
git format-patch -1
scripts/checkpatch.pl  ./0001-docs-f2fs-fix-typos-in-f2fs.rst.patch

生成gmail的应用专用密码

Google账号→ 安全性 → 您的账号登录选项 → 两部验证 → 应用专用密码 → 输入应用名字后点创建 → 保存好密码后点完成

image.png

image.png

image.png

设置git-email的smtp服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sudo apt install git-email
vim ~/.gitconfig

[user]
        email = xxxx@gmail.com
        name = xxxx
[core]
        editor = vim
[sendemail]
        smtpserver = smtp.gmail.com
        smtpserverport = 587
        smtpencryption = tls
        smtpuser = xxxx@gmail.com
        smtpPass = passwd

端口号在https://support.google.com/mail/answer/7104828?hl=zh-Hans&sjid=11981818515342586304-NC

发送patch

1
2
# 查找收件人
./scripts/get_maintainer.pl xxxxx.patch

image.png

这么多收件人,哪些应该是 --to 哪些应该是 --cc ? 看看 ChatGPT 怎么说: image.png

1
2
3
4
5
6
7
8
9
# 发送patch 
git send-email \
--to=jaegeuk@kernel.org  \
--to=chao@kernel.org \
--to=linux-f2fs-devel@lists.sourceforge.net \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
0001-docs-f2fs-fix-typos-in-f2fs.rst.patch

image.png

记得 --cc=xxxx@gmail.com 抄送自己的邮箱

Kernel Mail List : https://lore.kernel.org/all/20250618225546.104949-1-yuanye.ma20@gmail.com/T/#t

patch被接受

过了两天,收到了 patch 被接受的邮件: image.png

https://lore.kernel.org/all/877c14dfa5.fsf@trenco.lwn.net/

patch 被合入上游仓库

patch先被合入了next tree : https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=0242b8b0cc89599b3e4162add672179ce2dd4131 linux-next 还需要等待patch进入上游仓库。

总结

整个过程并不复杂,重要的是要去做,只有做了才知道哪里理解的不到位,才能进一步去改进。

此外,patch 的 commitmsg 很重要,patch 并不只是提交代码,更重要的是和社区的其他开发者们交流/协作,因此要认真对待,不仅要写清楚“改了什么”,更要说明“为什么改”,以及“怎么发现的”。

补丁不仅仅是一个改动,它是一份贡献 —— 而它必须是自洽、独立成立的。这也包括说明问题是如何被发现的,以及为什么这个修复是合理的。尤其是对于新贡献者来说,这比 diff 的大小更重要。这不仅仅是“提交补丁”,更是在帮助他人理解这个改动为什么正确。
一个合格的 commit message 不只是描述“改了什么”,更要说明“为什么改”,以及“怎么发现的”。