本文簡介
?????? 本文一步一步的演示如何生成一個簡單Linux內核補丁,并提交給Linux社區(qū)。用以展示向社區(qū)提交補丁的步驟。本文英文名稱:《Submit Patches Step by Step》
作者簡介
???????謝寶友,在編程一線工作已經有20年時間,其中接近10年時間工作于Linux操作系統(tǒng)。目前,他是Linux ZTE平臺的Maintainer,向社區(qū)提交了130個補丁,4000多行代碼。同時,他也是《深入理解并行編程》一書的譯者。該書作者Paul E.McKeney是IBM Linux中心領導者,Linux RCU Maintainer。
?????? 作者聯系方式:baoyou.xie@gmail.com
?????? 微信或者QQ:373364645
歡迎關注微信公眾號:linux閱碼場 (id: linuxdev)
一、應有的心態(tài)
Paul在《深入理解并行編程》一書第11.1.2節(jié)中說,驗證和測試工作都需要良好的心態(tài)。應當以一種破壞性的、甚至帶一點仇恨的心理來驗證代碼,有時也應當考慮到:不少人的生命依賴于我們代碼正確性的幾率??傊?,心態(tài)對事情的成敗有重要的影響。
同樣的,在向社區(qū)提交補丁之前,我們也應當有正確的心態(tài):
1. 我們的代碼,可能會影響不少人的生命,所以一定要細心。
2. 悲觀的說,如果補丁做得不好,會被社區(qū)大牛的口水淹死。當然,更可能的情況是,大牛懶得向你吐口水:)所以在提交補丁前,請為自己的聲譽負責。
3. 樂觀的說,社區(qū)牛人一般都比較Nice,如果你的水平真的比較牛的話。
4. 更進一步樂觀的說,你提交的高質量的補丁,可能會為你帶來良好的聲譽、滿意的工作。
5. 需要強調一點的是,在社區(qū),千萬不要和Maintainer作對。要象對待學校老師那樣,謙恭的對待Maintainer。不管你信不信這一點,反正我信了:)
如果你和我一樣,有著近乎自大的自信,請接著讀完本文^-^
二、準備工作
在開始工作之前,請準備如下工作:
1.安裝一份Linux。
不論是ubuntu、centos還是其他Linux發(fā)行版本,都是可以的。我個人習慣使用ubuntu 16.04版本。雖然我曾經嘗試在windows下面安裝git,但是最終你會發(fā)現,在windows下面使用git提交補丁幾乎可以用痛苦來描述。
2.安裝git。
默認的Linux發(fā)行版,一般都已經安裝好git。如果沒有,隨便找一本git的書都可以。這里不詳述。比較好的git資料有:
http://git.oschina.net/progit/
https://item.jd.com/11615420.html
3.配置git
A.配置用戶名和郵箱
在配置用戶名的時候,請注意社區(qū)朋友習慣用英語溝通,也就是名在前,姓在后。這一點會影響社區(qū)郵件討論,因此需要留意。
在配置郵箱時,也要注意。社區(qū)會將國內某些著名的郵件服務器屏蔽。因此建議你申請一個gmail郵箱。
以下是我的配置:
```
? ? ? ?xiebaoyou@ThinkPad-T440$git config -l | grep "user"
?????? user.email=baoyou.xie@linaro.org
?????? user.name=Baoyou Xie
```
B.配置 sendemail
你可以手工修改~/.gitconfig,或者git倉庫下的.git/config文件,添加\[sendemail\]節(jié)。該配置用于指定發(fā)送補丁時用到的郵件服務器參數。
以下是我的配置,供參考:
```
? ? ? ?[sendemail]
????????????? smtp encryption= tls
????????????? smtp server= smtp.gmail.com
????????????? smtp user= baoyou.xie@linaro.org
????????????? smtp serverport= 587
```
gmail郵箱的配置比較麻煩,需要按照google的說明,制作證書。配置完成后,請用如下命令,向自己發(fā)送一個測試補?。?/p>
```
?????? git send-email your.patch --to your.mail --cc your.mail
```
C.下載源碼
首先,請用如下命令,拉取linus維護的Linux主分支代碼到本地:
```
?????? git clone ssh://git@dev-private.git.linaro.org/zte/kernel.git
```
這個過程比較長,請耐心等待。
一般情況下,Linux主分支代碼不夠新,如果你基于這個代碼制作補丁,很有可能不會順利的合入到Maintainer那里,換句話說,Maintainer會將補丁發(fā)回給你,要求你重新制作。所以,一般情況下,你需要再用以下命令,添加其他分支,特別是linux-next分支。強調一下,你需要習慣基于linux-next分支進行工作。
```
? ? ? ?git remote add linux-nexthttps://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
?????? git remote add staging https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
?????? git remote add net git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git
```
然后用如下命令拉取這三個分支的代碼到本地:
```
? ? ? ?git fetch --tags linux-next
?????? git fetch --tags staging
?????? git fetch --tags net
```
有些Maintainer維護了自己的代碼分支,那么,你可以在內核源碼目錄\\MAINTAINERS文件中,找一下相應文件的維護者,及其git地址。
例如,watchdog模塊的信息如下:
```
? ? ? ?WATCHDOGDEVICE DRIVERS
?????? M:????? Wim Van Sebroeck <wim@iguana.be>
?????? R:????? Guenter Roeck <linux@roeck-us.net>
?????? L:????? linux-watchdog@vger.kernel.org
?????? W:????? http://www.linux-watchdog.org/
?????? T:????? gitgit://www.linux-watchdog.org/linux-watchdog.git
?????? S:????? Maintained
?????? F:????? Documentation/devicetree/bindings/watchdog/
?????? F:????? Documentation/watchdog/
?????? F:????? drivers/watchdog/
?????? F:????? include/linux/watchdog.h
?????? F:????? include/uapi/linux/watchdog.h
```
其中,git://www.linux-watchdog.org/linux-watchdog.git是其git地址。
你可以用如下命令拉取watchdog代碼到本地:
```
?????? gitremote add watchdog git://www.linux-watchdog.org/linux-watchdog.git
?????? gitfetch --tags watchdog
```
當然,這里友情提醒一下,MAINTAINERS里面的信息可能不一定準確,這時候你可能需要借助google,或者問一下社區(qū)的朋友,或者直接問一下作者本人。不過,一般情況下,基于linux-next分支工作不會有太大的問題。實在有問題再去打擾作者本人。
**4.閱讀Documentation/SubmittingPatches,這很重要。**
5.檢出源碼
```
? ? ? git branch mybranch next-20170807
```
這個命令表示將linux-next分支的20170807這個tag作為本地mybranch的基礎。
```
? ? ? git checkout? mybranch
```
三、尋找軟柿子
如果沒有奇遇,大廚一般都是從小工做起的。我們不可能一開始就維護一個重要的模塊,或者修復一些非常重要的故障。那么我們應當怎么樣入手參與社區(qū)?這當然要尋找軟柿子了。拿著軟柿子做出來的補丁,可以讓Maintainer無法拒絕合入你的補丁。當然,這么做主要還是為了在Maintainer那里混個臉熟。否則,以后你發(fā)的重要補丁,人家可能不會理你。
什么樣的柿子最軟?下面是答案:
1. 消除編譯警告
2. 編碼格式,例如注釋里面的單詞拼寫錯誤、對齊不規(guī)范、代碼格式不符合社區(qū)要求。
建議是從“消除編譯警告”入手。社區(qū)很多大牛,都是這樣成長起來的。
我們平時編譯內核,基本上遇不到編譯警告。是不是內核非常完美,沒有編譯警告,非矣!你用下面這個步驟試一下:
首先,配置內核,選擇所有模塊:
```
? ? ? makeARCH=arm64 allmodconfig
```
請注意其中“allmodconfig”,很有用的配置,我們暫且可以理解為,將所有模塊都編譯。這樣我們就可以查找所有模塊中的編譯警告了。
下面這個命令開始編譯所有模塊:
```
? ? ? make ARCH=arm64 EXTRA_CFLAGS="-Wmissing-declarations -Wmissing-prototypes" CROSS_COMPILE=/toolchains/aarch64-linux-gnu/bin/aarch64-linux-gnu-
```
其中 **EXTRA_CFLAGS="-Wmissing-declarations-Wmissing-prototypes"** 參數表示追蹤所有missing-declarations、missing-prototypes類型的警告。
CROSS_COMPILE=/toolchains/aarch64-linux-gnu/bin/aarch64-linux-gnu-是指定交叉編譯工具鏈路徑,需要根據你的實際情況修改。當然,如果是x86架構,則不需要指定此參數。
在編譯的過程中,我們發(fā)現如下錯誤:
```
? ? ? scripts/Makefile.build:311:recipe for target 'drivers/staging/fsl-mc/bus/dpio/qbman-portal.o' failed
```
我們可以簡單的忽略drivers/staging/fsl-mc/bus/dpio/qbman-portal.c這個文件。在drivers/staging/fsl-mc/bus/dpio/Makefile文件中,發(fā)現這個文件的編譯依賴于宏CONFIG\_FSL\_MC\_DPIO。
于是,我們修改編譯命令,以如下命令繼續(xù)編譯:
```
? ? ? make CONFIG_ACPI_SPCR_TABLE=n ARCH=arm64 EXTRA_CFLAGS="-Wmissing-declarations -Wmissing-prototypes" CROSS_COMPILE=/toolchains/aarch64-linux-gnu/bin/aarch64-linux-gnu-
```
請注意該命令中的“CONFIG\_ACPI\_SPCR\_TABLE=n”,它強制關閉了 CONFIG\_ACPI\_SPCR\_TABLE配置。
當編譯完成以后,我們是不是發(fā)現有很多警告?特別是在drivers目錄下。
下面是我在next-20170807版本中發(fā)現的警告:
```
? ? ? ?/dimsum/git/kernel.next/drivers/clk/samsung/clk-s3c2410.c:363:13:warning: no previous prototype for 's3c2410_common_clk_init'[-Wmissing-prototypes]
?void__init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
????????????^
?CC?????drivers/clk/samsung/clk-s3c2412.o
/dimsum/git/kernel.next/drivers/clk/samsung/clk-s3c2412.c:254:13:warning: no previous prototype for 's3c2412_common_clk_init'[-Wmissing-prototypes]
?void__init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
????????????^
?CC?????drivers/clk/samsung/clk-s3c2443.o
/dimsum/git/kernel.next/drivers/clk/samsung/clk-s3c2443.c:388:13:warning: no previous prototype for 's3c2443_common_clk_init' [-Wmissing-prototypes]
?void__init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
```
下一節(jié),我們就基于這幾個警告來制作補丁。
四、制作補丁
要消除這幾個警告,當然很簡單了。將這幾個函數聲明為static即可。下面是我的修改:
```
git diff
diff --git a/drivers/clk/samsung/clk-s3c2410.c b/drivers/clk/samsung/clk-s3c2410.c
index e0650c3..8f4fc5a 100644
--- a/drivers/clk/samsung/clk-s3c2410.c
+++ b/drivers/clk/samsung/clk-s3c2410.c
@@ -360,7 +360,7 @@ static void __inits3c2410_common_clk_register_fixed_ext(
???????samsung_clk_register_alias(ctx, &xti_alias, 1);
?}
-void __init s3c2410_common_clk_init(structdevice_node *np, unsigned long xti_f,
+static void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
??????????????????????????????????? intcurrent_soc,
??????????????????????????????????? void__iomem *base)
?{
diff --git a/drivers/clk/samsung/clk-s3c2412.c b/drivers/clk/samsung/clk-s3c2412.c
index b8340a4..2a2ce06 100644
--- a/drivers/clk/samsung/clk-s3c2412.c
+++ b/drivers/clk/samsung/clk-s3c2412.c
@@ -251,7 +251,7 @@ static void __init s3c2412_common_clk_register_fixed_ext(
???????samsung_clk_register_alias(ctx, &xti_alias, 1);
?}
-void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
+static void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
??????????????????????????????????? unsigned long ext_f, void __iomem *base)
?{
???????struct samsung_clk_provider *ctx;
diff --gita/drivers/clk/samsung/clk-s3c2443.c b/drivers/clk/samsung/clk-s3c2443.c
index abb935c..f0b88bf 100644
--- a/drivers/clk/samsung/clk-s3c2443.c
+++ b/drivers/clk/samsung/clk-s3c2443.c
@@ -385,7 +385,7 @@ static void __inits3c2443_common_clk_register_fixed_ext(
???????????????????????????????ARRAY_SIZE(s3c2443_common_frate_clks));
?}
-void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
+static void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
??????????????????????????????????? int current_soc,
??????????????????????????????????? void __iomem *base)?
```
再編譯一次,警告果然被消除了。原來,社區(qū)工作如此簡單:)
但是請允許我澆一盆冷水!
你先試著用下面的命令做一個補丁出來看看!
```
? ? ? ?git add drivers/clk/samsung/clk-s3c2410.c
?????? git add drivers/clk/samsung/clk-s3c2412.c
?????? git add drivers/clk/samsung/clk-s3c2443.c
?????? git commit drivers/clk/samsung/
????????????? [zxic/67184930591] this is my test
????????????? ?3 files changed, 3 insertions(+), 3deletions(-)
?????? gitformat-patch -s -v 1 -1
```
生成的補丁內容如下:
```
cat v1-0001-this-is-my-test.patch
From 493059190e9ca691cf08063ebaf945627a5568c7 Mon Sep 17 00:00:00 2001
From: Baoyou Xie<baoyou.xie@linaro.org>
Date: Thu, 17 Aug 2017 19:23:13 +0800
Subject: [PATCH v1] this is my test
Signed-off-by: Baoyou Xie<baoyou.xie@linaro.org>
---
?drivers/clk/samsung/clk-s3c2410.c | 2 +-
?drivers/clk/samsung/clk-s3c2412.c | 2 +-
?drivers/clk/samsung/clk-s3c2443.c | 2 +-
?3files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/samsung/clk-s3c2410.c b/drivers/clk/samsung/clk-s3c2410.c
index e0650c3..8f4fc5a 100644
--- a/drivers/clk/samsung/clk-s3c2410.c
+++ b/drivers/clk/samsung/clk-s3c2410.c
@@ -360,7 +360,7 @@ static void __init s3c2410_common_clk_register_fixed_ext(
????? samsung_clk_register_alias(ctx,&xti_alias, 1);
?}
-void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
+static void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
?????????????????????????? ??? int current_soc,
?????????????????????????? ??? void __iomem *base)
?{
diff --git a/drivers/clk/samsung/clk-s3c2412.c b/drivers/clk/samsung/clk-s3c2412.c
index b8340a4..2a2ce06 100644
--- a/drivers/clk/samsung/clk-s3c2412.c
+++ b/drivers/clk/samsung/clk-s3c2412.c
@@ -251,7 +251,7 @@ static void __inits3c2412_common_clk_register_fixed_ext(
????? samsung_clk_register_alias(ctx,&xti_alias, 1);
?}
-void __init s3c2412_common_clk_init(structdevice_node *np, unsigned long xti_f,
+static void __init s3c2412_common_clk_init(struct device_node *np, unsigned long xti_f,
?????????????????????????? ??? unsigned long ext_f, void __iomem *base)
?{
????? struct samsung_clk_provider *ctx;
diff --git a/drivers/clk/samsung/clk-s3c2443.c b/drivers/clk/samsung/clk-s3c2443.c
index abb935c..f0b88bf 100644
--- a/drivers/clk/samsung/clk-s3c2443.c
+++ b/drivers/clk/samsung/clk-s3c2443.c
@@ -385,7 +385,7 @@ static void __inits3c2443_common_clk_register_fixed_ext(
?????????????????????????? ARRAY_SIZE(s3c2443_common_frate_clks));
?}
-void __init s3c2443_common_clk_init(structdevice_node *np, unsigned long xti_f,
+static void __init s3c2443_common_clk_init(struct device_node *np, unsigned long xti_f,
?????????????????????????? ??? int current_soc,
?????????????????????????? ??? void __iomem *base)
?{
--
2.7.4
```
你可以試著用git send-email v1-0001-this-is-my-test.patch --to baoyou.xie@linaro.org將補丁發(fā)給Maintainer。記得準備好一個盆子,接大家的口水:)
在制作正確的補丁之前,我們需要這個錯誤的補丁錯在何處:
1.應該將它拆分成三個補丁。
也許這一點值得商酌,因為這三個文件都是同一個驅動:clk: samsung。也許Maintainer認為它是同一個驅動,做成一個補丁也是可以的。
我覺得應該拆分成三個。
當然了,應當以Maintainer的意見為準。不同的Maintainer也許會有不同的意見。
2.補丁描述實在太LOW。
3.補丁格式不正確。
4.補丁內容不正確。
下一節(jié)我們逐個解決這幾個問題。
但是首先我們應當將補丁回退。使用如下命令:
```
? ? ? git reset HEAD~1
```
五、制作正確的補丁
1.補丁描述
補丁第一行是標題,比較重要。它首先應當是模塊名稱。
但是我們怎么找到drivers/clk/samsung/clk-s3c2412.c文件屬于哪個模塊?
可以試試下面這個命令,看看drivers/clk/samsung/clk-s3c2412.c文件的歷史補?。?/p>
```
? ? ? ?root@ThinkPad-T440:/dimsum/git/kernel.next#?git log drivers/clk/samsung/clk-s3c2412.c
?????? commit 02c952c8f95fd0adf1835704db95215f57cfc8e6
?????? Author:Martin Kaiser <martin@kaiser.cx>
?????? Date:?? Wed Jan 25 22:42:25 2017 +0100
??? ??????clk: samsung:mark s3c...._clk_sleep_init() as __init?
```
ok,模塊名稱是 “clk:samsung”
下面是我為這個補丁添加的描述,其中第一行是標題:
```
clk: samsung: mark symbols static where possible for s3c2410
We get 1 warnings when building kernel withW=1:
/dimsum/git/kernel.next/drivers/clk/samsung/clk-s3c2410.c:363:13:warning: no previous prototype for 's3c2410_common_clk_init'[-Wmissing-prototypes]
?void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
In fact, this function is only used in thefile in which they are
declared and don't need a declaration, butcan be made static.
So this patch marks these functions with 'static'.
```
這段描述是我從其他補丁中拷貝出來的,有幾下幾點需要注意:
1. 標題中故意添加了“for s3c2410”,以區(qū)別于另外兩個補丁
2. “1 warnings”這個單詞中,錯誤的使用了復數,這是因為復制的原因
3. “/dimsum/git/kernel.next/”這個路徑名與我的本地路徑相關,不應當出現在補丁中。
4. 警告描述超過了80個字符,但是這是一個特例,這里允許超過80字符。
這些問題,如果不處理的話,Maintainer會不高興的!如果Maintainer表示了不滿,而你不修正的話,這個補丁就會被忽略。
修正后的補丁描述如下:
```
clk: samsung: mark symbols static wherepossible for s3c2410
We get 1 warning when building kernel withW=1:
drivers/clk/samsung/clk-s3c2410.c:363:13:warning: no previous prototype for 's3c2410_common_clk_init'[-Wmissing-prototypes]
?void__init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
In fact, this function is only used in thefile in which they are
declared and don't need a declaration, but can be made static.
So this patch marks these functions with 'static'.
```
我們的補丁描述一定要注意用詞,不要出現將“unused”寫為“no used”這樣的錯誤。
反復使用git add,git commit將補丁提交到git倉庫。
終于快成功,是不是想慶祝一下。用git命令看看我們剛才提交的三個補?。?/p>
```
root@ThinkPad-T440:/dimsum/git/kernel.next#git log drivers/clk/samsung/
commit0539c5bc17247010d17394b0dc9f788959381c8f
Author: Baoyou Xie<baoyou.xie@linaro.org>
Date:??Thu Aug 17 20:43:09 2017 +0800
???clk: samsung: mark symbols static where possible for s3c2443
???We get 1 warning when building kernel with W=1:
???drivers/clk/samsung/clk-s3c2443.c:388:13: warning: no previous prototypefor 's3c2443_common_clk_init' [-Wmissing-prototypes]
????void __init s3c2443_common_clk_init(struct device_node *np, unsignedlong xti_f,
???In fact, this function is only used in the file in which they are
???declared and don't need a declaration, but can be made static.
???So this patch marks these functions with 'static'.
commitc231d40296b4ee4667e3559e34b00f738cae1e58
Author: Baoyou Xie<baoyou.xie@linaro.org>
Date:??Thu Aug 17 20:41:38 2017 +0800
???clk: samsung: mark symbols static where possible for s3c2412
???We get 1 warning when building kernel with W=1:
???drivers/clk/samsung/clk-s3c2412.c:254:13: warning: no previous prototypefor 's3c2412_common_clk_init' [-Wmissing-prototypes]
????void __init s3c2412_common_clk_init(struct device_node *np, unsignedlong xti_f,
???In fact, this function is only used in the file in which they are
???declared and don't need a declaration, but can be made static.
???So this patch marks these functions with 'static'.
commit ff8ea5ed4947d9a643a216d51f14f6cb87abcb97
Author: Baoyou Xie<baoyou.xie@linaro.org>
Date:??Thu Aug 17 20:40:50 2017 +0800
???clk: samsung: mark symbols static where possible for s3c2410
```
**但是,你發(fā)現補丁描述里面還有什么不正確的嗎??**
不過Maintainer也許發(fā)現不了這個問題,然后~這個補丁也可能被接收入內核。
下面我們生成補?。?/p>
```
root@ThinkPad-T440:/dimsum/git/kernel.next#git format-patch -s -3
0001-clk-samsung-mark-symbols-static-where-possible-for-s.patch
0002-clk-samsung-mark-symbols-static-where-possible-for-s.patch
0003-clk-samsung-mark-symbols-static-where-possible-for-s.patch
```
實際上,我們的補丁仍然是錯誤的。
在發(fā)送補丁前,我們需要用腳本檢查一下補丁:
```
root@ThinkPad-T440:/dimsum/git/kernel.next#./scripts/checkpatch.pl 000*
---------------------------------------------------------------
0001-clk-samsung-mark-symbols-static-where-possible-for-s.patch
---------------------------------------------------------------
WARNING: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#9:
?void__init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
WARNING: line over 80 characters
#29: FILE:drivers/clk/samsung/clk-s3c2410.c:363:
+static void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
total: 0 errors, 2 warnings, 8 lineschecked?
```
請留意輸出警告,其中第一個警告是說我們的描述中,有過長的語句。前面已經提到,這個警告可以忽略。
但是第二個警告告訴我們代碼行超過80個字符了。這是不能忽略的警告,必須處理。
使用“git resetHEAD~3”命令將三個補丁回退。重新修改代碼:
```
? static void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
```
修改為
```
? ? ? static void __init
? ? ? s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
```
也可以修改為
```
? ? ? static void __init s3c2410_common_clk_init(struct device_node *np, unsigned long xti_f,
```
我個人習慣用第一種方法,因為看其他代碼也是第一種修改方法。
重新提交補丁,并用gitformat-patch命令生成補丁。
#### 六、發(fā)送補丁
生成正確的補丁后,請再次用**checkpatch.pl**檢查補丁正確性。
確保無誤后,可以準備將它發(fā)送給Maintainer了。
但是應該將補丁發(fā)給誰?這可以用**get_maintainer.pl**來查看:
```
? root@ThinkPad-T440:/dimsum/git/kernel.next#./scripts/get_maintainer.pl 000*
Kukjin Kim <kgene@kernel.org>(maintainer:ARM/SAMSUNG EXYNOS ARM ARCHITECTURES)
Krzysztof Kozlowski <krzk@kernel.org>(maintainer:ARM/SAMSUNG EXYNOS ARM ARCHITECTURES)
Sylwester Nawrocki<s.nawrocki@samsung.com> (supporter:SAMSUNG SOC CLOCK DRIVERS)
Tomasz Figa <tomasz.figa@gmail.com>(supporter:SAMSUNG SOC CLOCK DRIVERS)
Chanwoo Choi <cw00.choi@samsung.com>(supporter:SAMSUNG SOC CLOCK DRIVERS)
Michael Turquette<mturquette@baylibre.com> (maintainer:COMMON CLK FRAMEWORK)
Stephen Boyd <sboyd@codeaurora.org>(maintainer:COMMON CLK FRAMEWORK)
linux-arm-kernel@lists.infradead.org(moderated list:ARM/SAMSUNG EXYNOS ARM ARCHITECTURES)
linux-samsung-soc@vger.kernel.org (moderatedlist:ARM/SAMSUNG EXYNOS ARM ARCHITECTURES)
linux-clk@vger.kernel.org (open list:COMMONCLK FRAMEWORK)
linux-kernel@vger.kernel.org (open list)
```
接下來,可以用git send-email命令發(fā)送補丁了:
```
git send-email 000* --tokgene@kernel.org,krzk@kernel.org,s.nawrocki@samsung.com,tomasz.figa@gmail.com,cw00.choi@samsung.com,mturquette@baylibre.com,sboyd@codeaurora.org--cc linux-arm-kernel@lists.infradead.org,linux-samsung-soc@vger.kernel.org,linux-clk@vger.kernel.org,linux-kernel@vger.kernel.org
```
注意,哪些人應當作為郵件接收者,哪些人應當作為抄送者。在本例中,補丁是屬于實驗性質的,可以不抄送給郵件列表帳戶。
提醒:你應當將補丁先發(fā)給自己,檢查無誤后再發(fā)出去。如果你有朋友在社區(qū)有較高的威望,也可以抄送給他,必要的時候,也許他能給你一些幫助。這有助于將補丁順利的合入社區(qū)。
重要提醒:本文講述的,主要是實驗性質的補丁,用于打開社區(qū)大門。真正重要的補丁,可能需要經過反復修改,才能合入社區(qū)。我知道有一些補丁,超過兩年時間都沒能合入社區(qū),因為總是有需要完善的地方,也許還涉及一些社區(qū)政治:)
更多精彩更新中……歡迎關注公眾號 linux閱碼場 id: linuxdev