最近剛好需要進 code 到 Linux kernel。 經過漫長的等待,我的 code 終於進到 Linus 的 tree 了 🥳

發現這個 open source 的開發方式與一般常見的不太一樣,稍微紀錄一下 Linux 的運作方式

Linux 開發概念

Linus Torvalds 會維護一個 Linux source repo。他會定期 release 新的 Linux kernel 版本,並 master 切 branch 出去,交由 stable tree maintainer 維護

如果我們想要進 code 到 Linus 的 repo,要如何進行呢?

直覺上的做法很簡單就是透過寄 email 給 Linus 的方式

  1. 發出 pull request
  2. 寄出 patch 請他 commit

這兩個方法實際上也是可行的,但 Linux 的 source code 相當龐大,每天的 submit 數量也很多,全部由 Linus 一個人負擔不太實際

故在 Linux 中每個 subsystem 與 file 都會有各自的 maintainer 及 reviewer 負責, 這些 subsystem 通常會有各自的 Linux repo,最新的變動會先 commit 到 subsystem 的 tree。 這些 subsystem maintainer 會在 Linus 的 merge window open 時,送 pull request 給 Linus。 故我們只要將 code 進到 subsystem 的 tree 中,最終就有機會會進到 Linus tree

如何 Submit Patch

流程大概是這樣

  1. 寄 patch 給 subsystem maintainer
  2. Subsystem maintainer 將 patch commit 進 subsystem tree
  3. Subsystem maintainer 送 pull request 給 Linus
  4. Linus merge

故一般來講要進 code 最少會需要兩個人的同意

  1. Subsystem maintainer
  2. Linus

我們要怎麼知道他們要求什麼呢?

因為每個 subsystem 的規範差異很大,這邊就不描述了。如果我們想要 submit 一個 general 的 patch 要怎麼做呢? 最主要需要看這份文件

確切的可以分為五個步驟

  • 第一步,將 code commit 起來,並在 commit message 中加入 Signed-off-by NAME 的字串,表示你簽了 Linux 的條文 (Developer Certificate of Origin)
  • 第二步,使用 git format-patch master..your_branch 來產生 patch file
  • 第三步,使用 checkpatch.pl 來幫忙檢查 patch 是否有不符合規範的地方,例如 ./scripts/checkpatch.pl 0001-xxxxxx-xxxxx.patch
  • 第四步,找到 maintainer 的 email,可以直接看 MAINTAINERS 這份文件,或是使用 get_maintainer.pl 來幫你找該寄給誰
    • 例如 ./scripts/get_maintainer.pl 0001-xxxxxx-xxxxx.patch
    • 這邊至少需要寄給一個 maintainer 與一個 open mail list,不過建議依照 script 的結果全部寄出
  • 第五步,透過 email 將 patch 寄出,這邊會推薦使用 git send-email 來寄出
    • git send-email --to xxx@kernel.org --cc xxx@vger.kernel.org 0001-xxxxxx-xxxxx.patch

到這裡,已經成功寄出 patch 了,之後只需要透過 email 與 reviewer/maintainer 來溝通就可以了 (這邊要注意如果使用 gmail 回信,需要把格式改成 plain text)

附錄

附錄一: 如何找到 mail list 的 archive

http://vger.kernel.org/vger-lists.html

附錄二: 如何進 code 到 stable tree

stable tree 由 Greg Kroah-Hartman 維護,相關規定可以參考這份文件
規定中要進到 stable 的 commit 必須先進到 Linus 的 tree,進到 Linus tree 後再根據 subsystem 的規定不同,有些可以直接進信給 stable ,有些需要請 maintainer 幫你送進 stable queue

附錄三: 如果 patch 還要修正怎麼辦

不能將新的 patch 回覆在 email thread 中,需要重新寄出一個 email,只需要在 email title 加入前綴 PATCH v2
git format-patch --subject-prefix='PATCH v2' master..your_branch

附錄四: 除了 email 有其他方法追蹤我的 patch 進度嗎?

可以透過 https://patchwork.kernel.org/ 來追蹤 patch 的進度