Linux内核上游提交完整流程及示例
参考博客文章:
向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 of
drm_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 of
drm_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.com
name = Peng Hao
[safe]
……
向其中添加以下内容:
[sendemail]
smtpEncryption = ssl
smtpServer = smtp.feishu.cn
smtpServerPort = 465
smtpUser = penghao@dingdao.com
smtpPass = jeplgdBxk3MqLcib
以上信息是从哪里来的?
由于我们的邮箱用的是飞书,因此是在飞书中获得的设置。如下图所示:
信息就是从这里得到的。只是密码每次会有所不同,需要每次修改.gitconfig文件(是不是每次必须换需要进一步尝试)。
[sendemail]
smtpEncryption = ssl
smtpServer = smtp.feishu.cn
smtpServerPort = 465
smtpUser = penghao@dingdao.com
smtpPass = 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: 8bit
The Cc list above has been expanded by additional
addresses found in the patch commit message. By default
send-email prompts before sending whenever this occurs.
This behavior is controlled by the sendemail.confirm
configuration 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。