当前位置:   article > 正文

Linux内核上游提交完整流程及示例_linux内核代码提交

linux内核代码提交

参考博客文章:

向linux内核提交代码 - 知乎

一、下载Linux内核源码

通过git下载Linux内核源码,具体命令如下:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

实际命令及结果如下:

  1. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
  2. 正克隆到 'linux'...
  3. remote: Enumerating objects: 9727840, done.
  4. remote: Counting objects: 100% (249/249), done.
  5. remote: Compressing objects: 100% (125/125), done.
  6. 接收对象中: 100% (9727840/9727840), 2.65 GiB | 126.00 KiB/s, 完成.
  7. remote: Total 9727840 (delta 166), reused 146 (delta 124), pack-reused 9727591
  8. 处理 delta 中: 100% (7980690/7980690), 完成.
  9. 正在更新文件: 100% (81766/81766), 完成.

注: 整个过程耗时非常长,笔者是经过了大约一晚上的时间,头天下班前开始下载,第二天一上班已下载完(具体是什么时候下载完成的不确定,但至少得需要4—6小时)。

二、修改要存在问题的代码

针对于你所发现的Linux内核代码所存在的不足,进行相应的修改。

实例:

本次修改的代码位于Linux Kernel源码根目录的drivers/gpu/drm/drm_framebuffer.c中,在framebuffer_check函数中。

原来的代码片段如下:

  1. static int framebuffer_check(struct drm_device *dev,
  2. const struct drm_mode_fb_cmd2 *r)
  3. {
  4. const struct drm_format_info *info;
  5. int i;
  6. ……
  7. /* now let the driver pick its own format info */
  8. info = drm_get_format_info(dev, r);
  9. for (i = 0; i < info->num_planes; i++) {
  10. unsigned int width = fb_plane_width(r->width, info, i);
  11. unsigned int height = fb_plane_height(r->height, info, i);
  12. unsigned int block_size = info->char_per_block[i];
  13. ……
  14. }
  15. ……
  16. return 0;
  17. }

经过修改后的代码如下:

  1. static int framebuffer_check(struct drm_device *dev,
  2. const struct drm_mode_fb_cmd2 *r)
  3. {
  4. const struct drm_format_info *info;
  5. int i;
  6. ……、
  7. /* now let the driver pick its own format info */
  8. info = drm_get_format_info(dev, r);
  9. if (!info) {
  10. drm_dbg_kms(dev, "no matched format info\n");
  11. return -EFAULT;
  12. }
  13. for (i = 0; i < info->num_planes; i++) {
  14. unsigned int width = fb_plane_width(r->width, info, i);
  15. unsigned int height = fb_plane_height(r->height, info, i);
  16. unsigned int block_size = info->char_per_block[i];
  17. ……
  18. }
  19. ……
  20. return 0;
  21. }

可以看到,是加入了对于info为空的判断,增强了代码的健壮性。

三、查看修改是否正确

完成上述修改并保存后,使用git diff命令查看所修改的内容是否符合预期。

实际命令及结果如下:

  1. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux/drivers/gpu/drm$ git diff
  2. diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
  3. index aff3746dedfb..be7dd1998c04 100644
  4. --- a/drivers/gpu/drm/drm_framebuffer.c
  5. +++ b/drivers/gpu/drm/drm_framebuffer.c
  6. @@ -194,6 +194,10 @@ static int framebuffer_check(struct drm_device *dev,
  7. /* now let the driver pick its own format info */
  8. info = drm_get_format_info(dev, r);
  9. + if (!info) {
  10. + drm_dbg_kms(dev, "no matched format info\n");
  11. + return -EFAULT;
  12. + }
  13. for (i = 0; i < info->num_planes; i++) {
  14. unsigned int width = fb_plane_width(r->width, info, i);

四、添加到本地Git仓库

使用git add命令将修改添加到本地Git仓库。

实际命令及结果如下:

  1. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git add drivers/gpu/drm/drm_framebuffer.c
  2. 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的一般格式是:

  1. <标题>
  2. <空行>
  3. <详细描述>

标题一般的格式是:

修改的大类:patch的主要描述(尽量简短)

如:
platform/x86/samsung-laptop: Add support for Samsung's NP7[34]0U3E models

注意:
标题下面一定要有一个空行!标题下面一定要有一个空行!标题下面一定要有一个空行!

本次实例如下:

  1. Add judgement for return value of
  2. drm_get_format_info().
  3. Since drm_get_format_info() may return NULL, so a judgement of return
  4. value is needed to add.
  5. Signed-off-by: Peng Hao <penghao@dingdao.com>

六、生成patch

都确认无误后,生成patch。使用git format-patch命令将修改添加到本地Git仓库。

实际命令及结果如下:

  1. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ git format-patch -1
  2. 0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
  3. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ cat 0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
  4. From 6f04db02f2fbb5851797ee5a63bb53483ea4fdb4 Mon Sep 17 00:00:00 2001
  5. From: Peng Hao <penghao@dingdao.com>
  6. Date: Thu, 26 Oct 2023 10:45:54 +0800
  7. Subject: [PATCH] gpu/drm/drm_framebuffer.c: Add judgement for return value of
  8. drm_get_format_info().
  9. Since drm_get_format_info() may return NULL, so a judgement of return
  10. value is needed to add.
  11. Signed-off-by: Peng Hao <penghao@dingdao.com>
  12. ---
  13. drivers/gpu/drm/drm_framebuffer.c | 4 ++++
  14. 1 file changed, 4 insertions(+)
  15. diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
  16. index aff3746dedfb..be7dd1998c04 100644
  17. --- a/drivers/gpu/drm/drm_framebuffer.c
  18. +++ b/drivers/gpu/drm/drm_framebuffer.c
  19. @@ -194,6 +194,10 @@ static int framebuffer_check(struct drm_device *dev,
  20. /* now let the driver pick its own format info */
  21. info = drm_get_format_info(dev, r);
  22. + if (!info) {
  23. + drm_dbg_kms(dev, "no matched format info\n");
  24. + return -EFAULT;
  25. + }
  26. for (i = 0; i < info->num_planes; i++) {
  27. unsigned int width = fb_plane_width(r->width, info, i);
  28. --
  29. 2.37.1

七、获取相应模块的内核代码维护者列表

生成补丁文件之后,就可以通过邮件工具来发送补丁的内容了。
由于linux整个内核十分庞大,所以内核的维护也是由很多人负责。我们需要将补丁发送给该模块、该文件的维护者。
使用命令 ./scripts/get_maintainer.pl xxx得到所修改文件的维护者的邮箱列表。实际命令及结果如下:

  1. penghao@Ding-Perlis-MP26JBT0:~/kernel_commit/linux$ ./scripts/get_maintainer.pl drivers/gpu/drm/drm_framebuffer.c
  2. Maarten Lankhorst <maarten.lankhorst@linux.intel.com> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
  3. Maxime Ripard <mripard@kernel.org> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
  4. Thomas Zimmermann <tzimmermann@suse.de> (maintainer:DRM DRIVERS AND MISC GPU PATCHES)
  5. David Airlie <airlied@gmail.com> (maintainer:DRM DRIVERS)
  6. Daniel Vetter <daniel@ffwll.ch> (maintainer:DRM DRIVERS)
  7. dri-devel@lists.freedesktop.org (open list:DRM DRIVERS)
  8. linux-kernel@vger.kernel.org (open list)

八、配置.gitconfig文件

在执行git send-email之前,需要配置好git配置文件。
git配置文件路径是 ~/.gitconfig , 打开并编辑该文件,原始内容如下:

  1. [user]
  2. email = penghao@dingdao.com
  3. name = Peng Hao
  4. [safe]
  5. ……

向其中添加以下内容:

  1. [sendemail]
  2. smtpEncryption = ssl
  3. smtpServer = smtp.feishu.cn
  4. smtpServerPort = 465
  5. smtpUser = penghao@dingdao.com
  6. smtpPass = jeplgdBxk3MqLcib

以上信息是从哪里来的?
由于我们的邮箱用的是飞书,因此是在飞书中获得的设置。如下图所示:

信息就是从这里得到的。只是密码每次会有所不同,需要每次修改.gitconfig文件(是不是每次必须换需要进一步尝试)。

  1. [sendemail]
  2. smtpEncryption = ssl
  3. smtpServer = smtp.feishu.cn
  4. smtpServerPort = 465
  5. smtpUser = penghao@dingdao.com
  6. smtpPass = jeplgdBxk3MqLcib

九、发送邮件

完成了邮箱的SMTP服务配置之后,就可以发送邮件了。 使用git send-email发送邮件,实际命令及结果如下:

  1. 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
  2. 0001-gpu-drm-drm_framebuffer.c-Add-judgement-for-return-v.patch
  3. (mbox) Adding cc: Peng Hao <penghao@dingdao.com> from line 'From: Peng Hao <penghao@dingdao.com>'
  4. (body) Adding cc: Peng Hao <penghao@dingdao.com> from line 'Signed-off-by: Peng Hao <penghao@dingdao.com>'
  5. From: Peng Hao <penghao@dingdao.com>
  6. To: maarten.lankhorst@linux.intel.com,
  7. mripard@kernel.org,
  8. tzimmermann@suse.de,
  9. airlied@gmail.com,
  10. daniel@ffwll.ch
  11. Cc: dri-devel@lists.freedesktop.org,
  12. linux-kernel@vger.kernel.org,
  13. penghao@dingdao.com
  14. Subject: [PATCH] gpu/drm/drm_framebuffer.c: Add judgement for return value of drm_get_format_info().
  15. Date: Thu, 26 Oct 2023 12:34:42 +0800
  16. Message-Id: <20231026043442.3170975-1-penghao@dingdao.com>
  17. X-Mailer: git-send-email 2.37.1
  18. MIME-Version: 1.0
  19. Content-Transfer-Encoding: 8bit
  20. The Cc list above has been expanded by additional
  21. addresses found in the patch commit message. By default
  22. send-email prompts before sending whenever this occurs.
  23. This behavior is controlled by the sendemail.confirm
  24. configuration setting.
  25. For additional information, run 'git send-email --help'.
  26. To retain the current behavior, but squelch this message,
  27. run 'git config --global sendemail.confirm auto'.
  28. Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll): yes

注意:此过程可能会出现问题。具体问题及解决方法请参考以下笔者博文

注: 建议先通过git send-email --to <自己的邮箱>,看看自己能不能收到,收到后打开邮件是什么样子。确认无误再发给上游邮件列表。

十、提交后的后续工作

邮件发送后就是等待别人的review了,可能会有review的人给你回复邮件,你只要正常的邮件沟通就可以。如果可能会指出你的问题,可能会NACK掉你的patch或者让你重新修改后重新发送patch。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号