提交內核補丁到Linux社區的步驟

簡介

向Linux社區提交補丁並不頻繁,某一次提交後可能瞭然於胸,過段時間總會忘記,於是就有了這篇文章

這篇文章是我真實提交的步驟,沒有嚴格按官方的要求和建議來,但能覆蓋大多數問題

如果希望詳細學習如何提交,參考《如何讓你的改動進入內核》

下載代碼

在官網下載最新代碼,或者通過MAINTAINERS尋找對應子系統的倉庫代碼。

以我要提交pstore的子系統爲例,在MAINTAINERS中找到以下信息:

PSTORE FILESYSTEM
M:  Kees Cook <[email protected]>
M:  Anton Vorontsov <[email protected]>
M:  Colin Cross <[email protected]>
M:  Tony Luck <[email protected]>
S:  Maintained
T:  git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
F:  fs/pstore/
F:  include/linux/pstore*
F:  drivers/firmware/efi/efi-pstore.c
F:  drivers/acpi/apei/erst.c
F:  Documentation/admin-guide/ramoops.rst
F:  Documentation/admin-guide/pstore-block.rst
F:  Documentation/devicetree/bindings/reserved-memory/ramoops.txt
K:  \b(pstore|ramoops|blkoops)

既然子系統有獨立倉庫分支,那就下載這個分支的代碼,並切換到對應分支

git clone git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git pstore-tree
git checkout for-next/pstore

創建補丁

在下載的最新代碼倉庫中,本地提交自己的補丁後,就可以把補丁提取出文件來。

如果是單個補丁,用下面的命令:

git format-patch --subject-prefix='PATCH' -i HEAD~

如果是系列補丁,用下面的命令:

git format-patch --cover-letter --subject-prefix='PATCH' -N #這裏的N是你要提取的補丁個數

上面兩個命令比較通用了,其中

subject-prefix 是爲郵件標題添加個前綴
cover-letter 是爲系列郵件創建封面郵件

郵件前綴

一個郵件可有多個郵件前綴。有以下常見的郵件前綴,我的理解不確定是否準確,僅供參考

前綴 含義
PATCH 常規的且正式的補丁
RFC 不是要正式提上去的,希望一起討論這個補丁,用來說明方向,看看意見
RESEND 郵件發過了但好幾周都沒人鳥,可能被遺忘了,重新發

如果根據maintainer的意見,修改後重新提交,則需要在前綴後面加上版本。

例如第5個版本:

git format-patch --subject-prefix='PATCH v5' -i HEAD~

提取出來的補丁,效果大概是這樣:

[...]
Subject: [PATCH v5] ....
[...]

郵件封面

當有多個補丁來做某一件事情,我們需要提交系列補丁,那麼最好有個郵件封面,介紹這系列補丁

那麼,就會多出個0000編號的補丁:

0000-cover-letter.patch
0001-...
0002-...

在封面補丁裏,就會列出了系列補丁包含哪些補丁?改了啥文件?如下:

[...]
Subject: [PATCH v5] *** SUBJECT HERE *** 

*** BLURB HERE ***

WeiXiong Liao (1):
  mtd: ...

 drivers/mtd/Kconfig     |   8 + 
 drivers/mtd/Makefile    |   1 + 
[...]
 3 files changed, 540 insertions(+)

其中,封面補丁裏面郵件頭和正文需要自己寫,可別冒失就這麼發出去了

SUBJECT HERE : 封面郵件頭,一句話總結系列郵件
BLURB HERE : 封面郵件正文,講講系列郵件是爲了做什麼

編譯檢查

編譯進內核和編譯成模塊,都要試試,確保都能編譯過

風格檢查

Linux內核有提供腳本進行補丁的風格檢查,執行下面命令:

$ ./scripts/checkpatch.pl 00*.patch

腳本爆出錯誤啦,改!在本地倉庫改,然後提交到本地倉庫,重新提出補丁,再次檢查。只至沒有報錯爲止。

錯誤都改!如果是警告,建議改,除非你覺得修改是合理的,可以忽略

還有一些是誤報/建議,自己酌情看看是否要修,例如:

WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#71: 
new file mode 100644

上面警告信息顯示添加了新文件,需要我們確認新文件是否有在MAINTAINERS的記錄中。實際上是有的,因爲MAINTAINERS中文件是模糊匹配的,剛好囊括了我新添加的文件,因此可以忽略這警告。

確定郵件接受人

不知道把郵件發給誰?別怕,Linux內核牛叉到有提供腳本獲取郵件接收人地址:

$ ./scripts/get_maintainer.pl 00*.patch

會比較慢,慢慢等,輸出結果參考如下:

Kees Cook <[email protected]> (maintainer:PSTORE FILESYSTEM)
Anton Vorontsov <[email protected]> (maintainer:PSTORE FILESYSTEM)
Colin Cross <[email protected]> (maintainer:PSTORE FILESYSTEM)
[...]
[email protected] (open list:DOCUMENTATION)
[email protected] (open list)
[email protected] (open list:MEMORY TECHNOLOGY DEVICES (MTD))

因爲我的是系列補丁,涉及多個子系統,所以獲取到的郵件地址很多。

上面顯示的地址中,很明顯最後linux-開頭的三行不是代碼reviewer,類似於訂閱轉發地址的存在。把郵件發給這幾個地址,就會轉發給所有訂閱了子系統的人。

發送郵件

我們用 git send-mail 發送郵件,簡單,舒心

git send-mail --to <maintainerA> --to <maintainerB> .... --cc linux-XXXX@xxxx --cc ... 00*.patch

把上面獲取的maintainer地址,用 --to 指定,訂閱地址改用抄送 --cc

當然,在這之前,需要在git中配置你的sendmail信息

$ cat ~/.gitconfig
[...]
[sendemail]
    smtpserver = ...
    smtpserverport = 465 
    smtpencryption = ssl 
    smtpuser = ...

響應質疑與等待合併

如果有maintainer對你的補丁有疑惑,別擔心,他們郵件提問,我們郵件回覆。

郵件回覆的細節不累述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章