赞
踩
参考博客文章:
通过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 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。使用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)
在执行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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。