參考博客文章:
向linux內核提交代碼 - 知乎
一、下載Linux內核源碼
通過git下載Linux內核源碼,具體命令如下:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
正克隆到 'linux'...
remote: Enumerating objects: 9727840, done.
remote: Counting objects: 100% (249/249), done.
remote: Compressing objects: 100% (125/125), done.
接收對象中: 100% (9727840/9727840), 2.65 GiB | 126.00 KiB/s, 完成.
remote: Total 9727840 (delta 166), reused 146 (delta 124), pack-reused 9727591
處理 delta 中: 100% (7980690/7980690), 完成.
正在更新文件: 100% (81766/81766), 完成.
注: 整個過程耗時非常長,筆者是經過了大約一晚上的時間,頭天下班前開始下載,第二天一上班已下載完(具體是什么時候下載完成的不確定,但至少得需要4—6小時)。
二、修改要存在問題的代碼
針對于你所發現的Linux內核代碼所存在的不足,進行相應的修改。
實例:
本次修改的代碼位于Linux Kernel源碼根目錄的drivers/gpu/drm/drm_framebuffer.c中,在framebuffer_check函數中。
原來的代碼片段如下:
static int framebuffer_check(struct drm_device *dev,const struct drm_mode_fb_cmd2 *r)
{const struct drm_format_info *info;int i;……/* now let the driver pick its own format info */info = drm_get_format_info(dev, r);for (i = 0; i < info->num_planes; i++) {unsigned int width = fb_plane_width(r->width, info, i);unsigned int height = fb_plane_height(r->height, info, i);unsigned int block_size = info->char_per_block[i];……}……return 0;
}
經過修改后的代碼如下:
static int framebuffer_check(struct drm_device *dev,const struct drm_mode_fb_cmd2 *r)
{const struct drm_format_info *info;int i;……、/* now let the driver pick its own format info */info = drm_get_format_info(dev, r);if (!info) {drm_dbg_kms(dev, "no matched format info\n");return -EFAULT;}for (i = 0; i < info->num_planes; i++) {unsigned int width = fb_plane_width(r->width, info, i);unsigned int height = fb_plane_height(r->height, info, i);unsigned int block_size = info->char_per_block[i];……}…… return 0;
}
可以看到,是加入了對于info為空的判斷,增強了代碼的健壯性。
三、查看修改是否正確
完成上述修改并保存后,使用git diff命令查看所修改的內容是否符合預期。
實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux/drivers/gpu/drm$ git diff
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index aff3746dedfb..be7dd1998c04 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -194,6 +194,10 @@ static int framebuffer_check(struct drm_device *dev,/* now let the driver pick its own format info */info = drm_get_format_info(dev, r);
+ if (!info) {
+ drm_dbg_kms(dev, "no matched format info\n");
+ return -EFAULT;
+ }for (i = 0; i < info->num_planes; i++) {unsigned int width = fb_plane_width(r->width, info, i);
四、添加到本地Git倉庫
使用git add命令將修改添加到本地Git倉庫。
實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git add drivers/gpu/drm/drm_framebuffer.c
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$
五、將暫存區里的改動給提交到本地的版本庫
使用git commit命令將暫存區里的改動給提交到本地的版本庫,同時輸入詳細提交信息。
實際過程及結果如下:
(1)運行git commit -s命令
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git commit -s
(2)輸入提交信息
一定要寫好commit log!commit log的一般格式是:
<標題>
<空行>
<詳細描述>
標題一般的格式是:
修改的大類:patch的主要描述(盡量簡短)如: platform/x86/samsung-laptop: Add support for Samsung's NP7[34]0U3E models
注意:
標題下面一定要有一個空行!標題下面一定要有一個空行!標題下面一定要有一個空行!
本次實例如下:
Add judgement for return value ofdrm_get_format_info().Since drm_get_format_info() may return NULL, so a judgement of return
value is needed to add.Signed-off-by: Peng Hao <penghao@dingdao.com>
六、生成patch
都確認無誤后,生成patch。使用git format-patch命令將修改添加到本地Git倉庫。
實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git format-patch -1
0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ cat 0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
From 6f04db02f2fbb5851797ee5a63bb53483ea4fdb4 Mon Sep 17 00:00:00 2001
From: Peng Hao <penghao@dingdao.com>
Date: Thu, 26 Oct 2023 10:45:54 +0800
Subject: [PATCH] gpu/drm/drm_framebuffer.c: Add judgement for return value ofdrm_get_format_info().Since drm_get_format_info() may return NULL, so a judgement of return
value is needed to add.Signed-off-by: Peng Hao <penghao@dingdao.com>
---drivers/gpu/drm/drm_framebuffer.c | 4 ++++1 file changed, 4 insertions(+)diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index aff3746dedfb..be7dd1998c04 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -194,6 +194,10 @@ static int framebuffer_check(struct drm_device *dev,/* now let the driver pick its own format info */info = drm_get_format_info(dev, r);
+ if (!info) {
+ drm_dbg_kms(dev, "no matched format info\n");
+ return -EFAULT;
+ }for (i = 0; i < info->num_planes; i++) {unsigned int width = fb_plane_width(r->width, info, i);
--
2.37.1
七、獲取相應模塊的內核代碼維護者列表
生成補丁文件之后,就可以通過郵件工具來發送補丁的內容了。
由于linux整個內核十分龐大,所以內核的維護也是由很多人負責。我們需要將補丁發送給該模塊、該文件的維護者。
使用命令 ./scripts/get_maintainer.pl xxx得到所修改文件的維護者的郵箱列表。實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ ./scripts/get_maintainer.pl drivers/gpu/drm/drm_framebuffer.c
Maarten Lankhorst <maarten.lankhorst@linux.intel.com> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
Maxime Ripard <mripard@kernel.org> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
Thomas Zimmermann <tzimmermann@suse.de> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
David Airlie <airlied@gmail.com> (maintainer:DRM DRIVERS)
Daniel Vetter <daniel@ffwll.ch> (maintainer:DRM DRIVERS)
dri-devel@lists.freedesktop.org (open list:DRM DRIVERS)
linux-kernel@vger.kernel.org (open list)
八、配置.gitconfig文件
在執行git send-email之前,需要配置好git配置文件。
git配置文件路徑是 ~/.gitconfig , 打開并編輯該文件,原始內容如下:
[user]email = penghao@dingdao.comname = Peng Hao
[safe]……
向其中添加以下內容:
[sendemail]smtpEncryption = sslsmtpServer = smtp.feishu.cnsmtpServerPort = 465smtpUser = penghao@dingdao.comsmtpPass = jeplgdBxk3MqLcib
以上信息是從哪里來的?
由于我們的郵箱用的是飛書,因此是在飛書中獲得的設置。如下圖所示:
信息就是從這里得到的。只是密碼每次會有所不同,需要每次修改.gitconfig文件(是不是每次必須換需要進一步嘗試)。
[sendemail]smtpEncryption = sslsmtpServer = smtp.feishu.cnsmtpServerPort = 465smtpUser = penghao@dingdao.comsmtpPass = jeplgdBxk3MqLcib
九、發送郵件
完成了郵箱的SMTP服務配置之后,就可以發送郵件了。 使用git send-email發送郵件,實際命令及結果如下:
penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git send-email --to maarten.lankhorst@linux.intel.com,mripard@kernel.org,tzimmermann@suse.de,airlied@gmail.com,daniel@ffwll.ch --cc dri-devel@lists.freedesktop.org,linux-kernel@vger.kernel.org,penghao@dingdao.com 0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
(mbox) Adding cc: Peng Hao <penghao@dingdao.com> from line 'From: Peng Hao <penghao@dingdao.com>'
(body) Adding cc: Peng Hao <penghao@dingdao.com> from line 'Signed-off-by: Peng Hao <penghao@dingdao.com>'From: Peng Hao <penghao@dingdao.com>
To: maarten.lankhorst@linux.intel.com,mripard@kernel.org,tzimmermann@suse.de,airlied@gmail.com,daniel@ffwll.ch
Cc: dri-devel@lists.freedesktop.org,linux-kernel@vger.kernel.org,penghao@dingdao.com
Subject: [PATCH] gpu/drm/drm_framebuffer.c: Add judgement for return value of drm_get_format_info().
Date: Thu, 26 Oct 2023 12:34:42 +0800
Message-Id: <20231026043442.3170975-1-penghao@dingdao.com>
X-Mailer: git-send-email 2.37.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bitThe Cc list above has been expanded by additionaladdresses found in the patch commit message. By defaultsend-email prompts before sending whenever this occurs.This behavior is controlled by the sendemail.confirmconfiguration setting.For additional information, run 'git send-email --help'.To retain the current behavior, but squelch this message,run 'git config --global sendemail.confirm auto'.Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): yes
注意:此過程可能會出現問題。具體問題及解決方法請參考以下筆者博文
注: 建議先通過git send-email --to <自己的郵箱>,看看自己能不能收到,收到后打開郵件是什么樣子。確認無誤再發給上游郵件列表。
十、提交后的后續工作
郵件發送后就是等待別人的review了,可能會有review的人給你回復郵件,你只要正常的郵件溝通就可以。如果可能會指出你的問題,可能會NACK掉你的patch或者讓你重新修改后重新發送patch。