当前位置: 首页 > news >正文

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 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。

http://www.lryc.cn/news/255124.html

相关文章:

  • TS学习——快速入门
  • 深圳锐科达风力发电广播对讲解决方案
  • 极智芯 | 解读国产AI算力 璧仞产品矩阵
  • Echarts折线图常见问题及案例代码
  • javaTCP协议实现一对一聊天
  • 机器学习应用 | 使用 MATLAB 进行异常检测(上)
  • Java -jar参数详解
  • RocksDB 在 vivo 消息推送系统中的实践
  • 【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(上)
  • 点滴生活记录1
  • gitea仓库迁移
  • 〖大前端 - 基础入门三大核心之JS篇㊽〗- BOM特效开发
  • 【扩散模型】ControlNet从原理到实战
  • AI并行计算:CUDA和ROCm
  • 2023/12/1JAVAmysql(mysql连接,数据定义语言,数据类型,数据操作语言,数据查询语言)
  • 2023五岳杯量子计算挑战赛数学建模思路+代码+模型+论文
  • 生信数据分析高效Python代码
  • Spring Kafka常用配置详解
  • 跨域的多种方案详解
  • Java / Scala - Trie 树简介与应用实现
  • JS/jQuery 获取 HTTPRequest 请求标头?
  • Leetcode—2034.股票价格波动【中等】
  • 【Linux】diff命令使用
  • 讯飞星火认知大模型与软件测试结合,提升软件质量与效率
  • 【Flink on k8s】- 4 - 在 Kubernetes 上运行容器
  • 软件重装或系统重装后避免重复踩坑
  • 【Jmeter】JSON Extractor变量包含转义字符,使用Beanshell脚本来消除
  • GO设计模式——5、建造者模式(创建型)
  • 《LeetCode力扣练习》代码随想录——字符串(反转字符串II---Java)
  • WMMSE方法的使用笔记