Try   HackMD

第一次發 patch 到 LKML

contributed by < Risheng1128 >

前言

這次發 patch 的機會主要是在修 jserv 老師的 Linux 核心實作課程,寫 quiz3 的作業時,我有對第一題的巨集 GENMASK 做一些的分析,也從老師得知在 kernel 裡其實有很多同名且功能相似甚至相同的函式或巨集,因此老師鼓勵我可以試著發送 patch 看看,我就想說來既然機會來了就嘗試看看,也就有了這次的提交,提交紀錄在這裡

準備提交 Patch 的 Email

git 有提供一個命令 git send-email 來做到發出信件的功能,或是也有很多人會使用 mutt 來幫忙發 plain text mail。我自己是 send patches 時會使用 git send-email,如果只是回覆 comment 之類就會用 mutt

安裝 git send-email

參考 How to configure and use git send-email with gmail 使用以下命令安裝 git send-email

$ sudo apt update
$ sudo apt install git-email

接著設定 smtp 的資料,輸入命令 vi ~/.gitconfig ,並且在最後加上以下的資料

[sendemail]
        smtpencryption=tls
        smtpserver=smtp.gmail.com
        smtpuser=<你的信箱@xxxx.com>
        smtpserverport=587
        smtpPass=<你的APP密碼> 

接著開始設定上述提到的 APP 密碼,這裡使用 gmail 做設定,可以參考 Sign in with App Passwords

  1. google 帳戶安全性 的「登入 Google」點選兩步驟驗證,並且完成設定

  2. 「開啟兩步驟驗證」的下方有一個「應用程式密碼」,點進去後選擇「郵件」跟「其他」,名字就取一個自己會認得的就可以,完成後會顯示密碼,複製貼到 .gitconfig 或是 .muttrc 就可以了

  3. 目前的 APP 密碼: ynphwrmqsqwgtfpu

安裝 mutt

在本地端建立一個 Repo

我是直接 clone 最新的 Linux kernel 使用命令 git clone https://github.com/torvalds/linux.git

接著輸入以下命令設定 git

$ cd linux
$ git init
$ git add .
$ git commit -m ""
$ git checkout -b my-patch

做到這裡後,就可以開始修改程式啦!

新增 Commit Messgae

完成自己的修改後就可以新增 commit:

$ git commit -asv

-a:加入剛剛修改並且有 track 的檔案
-s:commit 會加上 Signed-off-by: <你的名字> <你的信箱@XXX.com>
-v:verbose,會列出你的修改,看著寫 commit message 會比較方便

commit message 格式

Patch 的格式都有嚴格的限制,簡單來說就是會分成:標題、內容描述、自己的簽名,中間都會空一行:

subsystemName: short description
# blank line
patch content description
# blank line
Signed-off-by: "name" <email>

接著可以開始輸入 commit 訊息,以下為這次修改的訊息

tools/power/x86/intel-speed-select: Remove duplicate macro

There are some macros such as `GENMASK` and `GENMASK_ULL` are redefined in
`include/linux/bits.h`. Simultaneously, the `GENMASK` in
`include/linux/bits.h` is more secure and prevents the following situation.
1. [net: stmmac: Fix misuses of GENMASK macro](https://reurl.cc/loMWvl)
2. [clocksource/drivers/npcm: Fix misuse of GENMASK macro](
https://reurl.cc/b2yr96)

Therefore, I think these macro could be removed.

Signed-off-by: Risheng1128 <hi4u29ck02@gmail.com>

建立 patch

完成 commit 就可以建立等等要寄出去的 patch ,使用命令 git format-patch ,在建立 patch 時可以先使用 git log 找到目標 commit 的編號,接著給個這次使用的例子

git format-patch 763c7f453702e48d875131bf64519766a1a18856 -1

如上所示, 763c7 為要建立 patch 的 commit ,而 -1 則表示包含自己本身的前 1 個 commit ,在這個範例就是表示為自己本身,如此一來便會建立指定 commit 的 patch 檔

接著建立好的 patch 要先通過一些 scripts 裡面的檢查,輸入以下命令

$ ./scripts/checkpatch.pl ./patch_name.patch

如果你的 patch 有問題,會有提示訊息跟你說是哪裡需要修改,修改可以使用以下命令

$ git commit -a --amend

寄送 patch

接著就要找出 maintainer 是誰,並且將 patch 寄給他,使用以下命令

$ ./scripts/get_maintainer.pl ./patch_name.patch

並在這次的發送中有以下的結果

Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> (maintainer:INTEL SPEED SELECT TECHNOLOGY)
platform-driver-x86@vger.kernel.org (open list:INTEL SPEED SELECT TECHNOLOGY)
linux-kernel@vger.kernel.org (open list)

最後就可以寄信給維護人並且記得要副本給其他的人,以上述的範例可以對應到以下的命令

git send-email --to srinivas.pandruvada@linux.intel.com
--cc platform-driver-x86@vger.kernel.org
--cc linux-kernel@vger.kernel.org
./0001-tools-power-x86-intel-speed-select-Remove-duplicate-.patch

送出之後就可以在 LKML 找到自己的信件

參考資料

第一次給 Linux Kernel 發 patch