Sholck

不积跬步,无以至千里.不积小流,无以成江海

0%

内核补丁提交

内核补丁提交

本文将总结介绍提交内核补丁前的须知规范

linux官方文档下有详细的关于此部分的描述与Linux 内核社区一起工作


补丁提交须知

linux分支迭代维护规则

开发者提交到子系统,然后由linus拉取进入主分支,详见下面两张图

linux-maintainers.png

来自宋宝华的ppt截图

Developing-model.png

mainline, stable, longterm 版本和linux-next都在https://www.kernel.org/有明确标注,也可以通过以下网址浏览

1
2
3
4
5
6
mainline: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
stable/longterm: git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
next: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

单拉仓也是通过git.kernel.org,比如linux-meida
git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git, 见https://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media.git/

linux官网

linux官网

有对其他相关网址的补充,之后会进行比较详细的描述

linux-other-resource.png

LXR

我们可以查看从v2.6.12到最新版本的全部代码

linux-lxr

子系统

如果需要提交我们的补丁到内核,我们需要明确我们更改子系统的维护者。

子系统邮件服务器

假如当我们需要给V4L打补丁前,我们可以订阅该子系统邮件,点击subscribe,会通过Majordomo@vger.kernel.org进行邮件订阅, 之后提交补丁以后可以通过邮件看到

而邮件也是我们提交代码和代码review的方式

建议使用如下规则回复进行订阅,否则可能会出现订阅失败

1
2
auth authid subscribe linux-subsys \
your-email

订阅成功会受到如下

1
Welcome to the linux-media mailing list!

也可以通过linux/MAINTAINERS来查找,比如V4L框架

1
2
3
4
5
6
7
8
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)      
M: Mauro Carvalho Chehab <mchehab@kernel.org>
L: linux-media@vger.kernel.org
S: Maintained
W: https://linuxtv.org
Q: http://patchwork.kernel.org/project/linux-media/list/
T: git git://linuxtv.org/media_tree.git
F: Documentation/admin-guide/media/

高通camera子系统camss架构,主要是csid-csiphy-ispif部分

1
2
3
4
5
6
7
8
QUALCOMM CAMERA SUBSYSTEM DRIVER      
M: Robert Foss <robert.foss@linaro.org>
M: Todor Tomov <todor.too@gmail.com>
L: linux-media@vger.kernel.org
S: Maintained
F: Documentation/admin-guide/media/qcom_camss.rst
F: Documentation/devicetree/bindings/media/*camss*
F: drivers/media/platform/qcom/camss/

patchwork

linux-patchwork

可以在patchwork中查看各子系统的通过mailing抓取的patch

bugzilla

linux-bugzilla

在这里我们可以查看最近提交的bug.

linux-bugzilla.png

wiki

wiki-linux

IRC

新建一个IRC网络,输入服务器地址irc.oftc.net和用户名,密码,通过以下进行register

1
REGISTER password e-mail

注册成功,提示

1
Successfully set +R on your nick.

如何加入一个子系统的irc聊天室,见linux-IRC

1
2
3
Start your favorite IRC client
/server irc.oftc.net
/join #kernelnewbies

确定子系统聊天室,比如linux-media

irc-linux-media.png

代码质量

代码编写规范

编码规范见Documentation/process/coding-style.rst

中文翻译:Documentation/output/translations/zh_CN/process/coding-style.html

如果通过make htmldocs生成过html文档,见Documentation/output/process/coding-style.html

代码提交清单

提交清单见Documentation/process/submit-checklist.rst

中文翻译:Documentation/output/translations/zh_CN/process/submit-checklist.html

html文档见Documentation/output/process/submit-checklist.html

代码测试

Sparse

Sparse是linus自己开发的内核静态分析工具.

对于sparse,可以警告程序员 用户空间和内核空间地址之间的混淆、big endian和small endian数量的混合、在需 要一组位标志的地方传递整数值等等

sparse说明见Documentation/dev-tools/sparse.rst

html文档见Documentation/output/dev-tools/sparse.html

本地安装sparse

1
sudo apt-get install sparse 

或者编译源码(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
git clone git://git.kernel.org/pub/scm/devel/sparse/sparse.git
make
make install

//如果缺少依赖包,根据Makefile编写code安装相关
apt-get install libxml2
apt-get install libxml2-dev

sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
//如果版本太老,需要从https://www.sqlite.org/download.html下载手动安装
wget https://www.sqlite.org/snapshot/sqlite-snapshot-202110132029.tar.gz --no-check-certificate
./configure
make
make install
cp sparse /bin/.
cp sparse /usr/bin/.

sudo apt-get install libgtk-3-dev
sudo apt-get install llvm

即使是本地编译的sparse,依旧会出现以下错误

1
2
➜  v4l2-core git:(master) sparse -a tuner-core.c
tuner-core.c:18:11: error: unable to open 'linux/module.h'

Coccinelle

Coccinelle能够发现各种潜在的编码问题;它还可以为这些问题提出修复方案.

sparse说明见Documentation/dev-tools/coccinelle.rst

内核语义补丁见scripts/coccinelle

html文档见Documentation/output/dev-tools/coccinelle.html

本地安装

1
sudo apt-get install coccinelle

源码编译安装Coccinelle

1
2
3
4
5
6
7
8
9
10
11
12
git clone git@github.com:coccinelle/coccinelle.git
sudo apt-get install autoconf

sudo apt-get install ocaml
sudo apt-get install ocaml-interp
sudo apt-get install ocaml-native-compilers
sudo apt-get install ocaml-nox

cp spatch.opt /usr/bin/.

test:
spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
➜  coccinelle git:(master) ✗ spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
init_defs_builtins: /usr/lib/coccinelle/standard.h
HANDLING: demos/simple.c
diff =
--- demos/simple.c
+++ /tmp/cocci-output-859-aeb2ab-simple.c
@@ -1,4 +1,4 @@
int main(int i) {
- f("ca va");
- f(g("ca va pas"));
+ f("ca va", 3);
+ f(g("ca va pas"), 3);
}

//测试ocamlrun报错
➜ coccinelle git:(master) ✗ ocamlrun spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
Fatal error: the file '/usr/bin/spatch' is not a bytecode executable file

版面check
➜ coccinelle git:(master) ✗ ocaml -version
The OCaml toplevel, version 4.02.3

➜ coccinelle git:(master) ✗ camlp4 -version
4.02.3

貌似从ocaml 4.0.2开始,camlp4已经被遗弃使用

提交补丁

配置git

在.git/config中增加以下部分

1
2
3
4
5
6
7
8
9
10
11
12
[user]    
email = xiaer1921@gmail.com
name = xiaer1921
[core]
editor = vim
[color]
ui = auto
[sendemail]
smtpserver = smtp.gmail.com
smtpserverport = 587
smtpencryption = tls
smtpuser = xiaer1921@gmail.com

制作补丁

举例:scripts/gdb/linux/tasks.py 没有增加SPDX许可,增加许可

文件规范检查

1
./scripts/checkpatch.pl --file scripts/gdb/linux/tasks.py

常见的错误如下

1
2
3
4
//第一行没有增加SPDX许可,警告如下
WARNING: Missing or malformed SPDX-License-Identifier tag in line 1
//第一行正确格式
# SPDX-License-Identifier: GPL-2.0

提交commit

1
2
git add scripts/gdb/linux/tasks.py
git commit -s //进行签名

提交描述中规范如下:

1
2
3
4
//第一行对修改的简短描述,将成为邮件的标题
//第二行空行
//第三行,对修改的详细描述,将成为邮件内容
...

生成patch

针对最近的commit生成patch git format-patch -1 -o . -1为最近的commit

1
2
➜  linux git:(master) git format-patch HEAD~
0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch

patch规范检查

1
2
3
4
5
./scripts/checkpatch.pl --file 0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch
//如果没有增加第三行详细描述部分,会进行警告
WARNING: Missing commit description - Add an appropriate one
//规范检查正确
0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch has no obvious style problems and is ready for submission.

获取patch的维护人员

1
2
3
4
5
6
7
➜  linux git:(master) ./scripts/get_maintainer.pl 0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch 
Jan Kiszka <jan.kiszka@siemens.com> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS,commit_signer:1/2=50%)
Kieran Bingham <kbingham@kernel.org> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS)
Andrew Morton <akpm@linux-foundation.org> (commit_signer:1/2=50%)
Ritesh Harjani <riteshh@linux.ibm.com> (commit_signer:1/2=50%,authored:1/2=50%,added_lines:5/6=83%,removed_lines:4/5=80%)
xiaer1921 <xiaer1921@aliyun.com> (commit_signer:1/2=50%,authored:1/2=50%,added_lines:1/6=17%,removed_lines:1/5=20%)
linux-kernel@vger.kernel.org (open list)

发送patch

1
git send-email --to jan.kiszka@siemens.com --to kbingham@kernel.org --cc linux-kernel@vger.kernel.org 0001-scripts-gdb-add-SPDX-license-for-scripts-gdb-linux-t.patch

参考

  1. 泰晓科技-Linux upstream: 给 Linus 发个 patch 吧
  2. 宋宝华-Linux community and Upstream Linux Codes
  3. 泰晓科技-how-to-contribute-to-linux-mainline
  4. 泰晓科技-如何贡献内核补丁
  5. 泰晓科技-如何获取某个 Linux 子系统上游的最新代码
  6. hello小崔的linux
  7. hello小崔-LTP提交补丁
  8. 内核工具 – Sparse 简介
  9. 请善用工具审核您的内核代码