当前位置: 首页 > 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。

相关文章:

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

参考博客文章&#xff1a; 向linux内核提交代码 - 知乎 一、下载Linux内核源码 通过git下载Linux内核源码&#xff0c;具体命令如下&#xff1a; git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 实际命令及结果如下&#xff1a; penghaoDin…...

TS学习——快速入门

TypeScript简介 TypeScript是JavaScript的超集。它对JS进行了扩展&#xff0c;向JS中引入了类型的概念&#xff0c;并添加了许多新的特性。TS代码需要通过编译器编译为JS&#xff0c;然后再交由JS解析器执行。TS完全兼容JS&#xff0c;换言之&#xff0c;任何的JS代码都可以直…...

深圳锐科达风力发电广播对讲解决方案

深圳锐科达风力发电广播对讲解决方案 风力发电对讲通常是在风塔的底部与机舱室安装一键对讲终端&#xff0c;可以一键呼叫控制中心值班人员&#xff0c;结构简单&#xff0c;组网方便&#xff0c;设备可以接入局域网或广域网构成功能应急呼叫系统。 系统实现的功能&#xff1…...

极智芯 | 解读国产AI算力 璧仞产品矩阵

欢迎关注我,获取我的更多经验分享 大家好,我是极智视界,本文分享一下 解读国产AI算力 璧仞产品矩阵。 璧仞在国产 AI 芯领域就是 "迷" 一样的存在,你要说它在市场上的 "建树" 泛善可陈的话,它又 "赫然" 在美国芯片禁令名单中。而这一切的一…...

Echarts折线图常见问题及案例代码

前言 ECharts 是一个使用 JavaScript 实现的开源可视化库,它可以帮助用户以简单的方式创建复杂的时间序列、条形图、饼图、地图等图形。 初学者,可参考下我的另外两篇文章,从基础到深入,解读饼状图的运用。 ECharts初始案例(入门) ECharts之折线图 常见问题及案例代码 …...

javaTCP协议实现一对一聊天

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 package d21z; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.a…...

机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务&#xff0c;指的是检测偏离期望行为的事件或模式&#xff0c;可以是简单地检测数值型数据中&#xff0c;是否存在远超出正常取值范围的离群值&#xff0c;也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中&#xff0c;异常检测的典型…...

Java -jar参数详解

java -jar 命令用于执行打包成可执行 JAR 文件的 Java 应用程序。在运行时&#xff0c;你可以通过命令行传递参数给这个应用程序。 1. -jar 参数&#xff1a; 说明&#xff1a; 指定要执行的 JAR 文件。示例&#xff1a;java -jar your-application.jar 2. -D 参数&#xff…...

RocksDB 在 vivo 消息推送系统中的实践

作者&#xff1a;vivo 互联网服务器团队 - Zeng Luobin 本文主要介绍了 RocksDB 的基础原理&#xff0c;并阐述了 RocksDB 在vivo消息推送系统中的一些实践&#xff0c;通过分享一些对 RocksDB 原生能力的探索&#xff0c;希望可以给使用RocksDB的读者带来启发。 一、背景 在…...

【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(上)

前言&#xff1a; 由于c语言的程序编译链接的这块知识点不清楚&#xff0c;回来复习一遍&#xff0c;以便于好理解c知识&#xff0c;我会尽快更新下一篇文章。 目录 1.程序的翻译环境和执行环境 2.翻译环境&#xff08;编译链接&#xff09; 编译&#xff08;编译器&#xf…...

点滴生活记录1

2023/10/10 今天骑小电驴上班&#xff0c;带着小鸭子一起。路上的时候&#xff0c;我给小鸭子说&#xff0c;你要帮我看着点路&#xff0c;有危险的时候提醒我&#xff0c;也就刚说完没几分钟&#xff0c;一个没注意&#xff0c;直接撞到一个拦路铁墩子上&#xff0c;车子连人歪…...

gitea仓库迁移

&#xff08;1&#xff09;先安装git&#xff0c;再直接将源机器上的gitea文件夹复制到新机器上。这样原始数据及账号信息都还在。 &#xff08;2&#xff09;根据实际情况修改gitea\custom\conf\app.ini文件夹下app.ini文件的相关路径。 &#xff08;3&#xff09;如下命令启…...

〖大前端 - 基础入门三大核心之JS篇㊽〗- BOM特效开发

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…...

【扩散模型】ControlNet从原理到实战

ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 Cont…...

AI并行计算:CUDA和ROCm

1 介绍 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是Nvidia于2006年推出的一套通用并行计算架构&#xff0c;旨在解决在GPU上的并行计算问题。其易用性和便捷性能够方便开发者方便的进行GPU编程&#xff0c;充分利用GPU的并行能力&#xff0…...

2023/12/1JAVAmysql(mysql连接,数据定义语言,数据类型,数据操作语言,数据查询语言)

>0...

2023五岳杯量子计算挑战赛数学建模思路+代码+模型+论文

目录 计算力网络&#xff08;CPN&#xff09;是一种新型的信息基础设施&#xff0c;完整论文代码见文末 问题描述 2.1 问题1 2.2 问题2 2.3 问题3 问题1的解答过程&#xff1a; 问题3的解答过程&#xff1a; 决策优化应用场景&#xff1a;人工智能模型超参数调优 背景信…...

生信数据分析高效Python代码

1. Pandas glob获取指定目录下的文件列表 import pandas as pd import globdata_dir "/public/data/" # 获取文件后缀为.txt的文件列表 df_all pd.concat([pd.read_csv(f, sep\t) for f in glob.glob(data_dir *.txt)]) print(df_all)2. 使用 enumerate 函数获取…...

Spring Kafka常用配置详解

目录 前言producer配置consumer 配置listener 配置 前言 在 Spring Kafka 中&#xff0c;主要的配置分为三大块&#xff0c;分别是producer、consumer、listener&#xff0c;下面我们就按模块介绍各个模块的常用配置 producer配置 在 Spring Kafka 中&#xff0c;spring.kaf…...

跨域的多种方案详解

浏览器的同源策略是为了保护用户的安全&#xff0c;限制了跨域请求。同源策略要求请求的域名、协议和端口必须完全一致&#xff0c;只要有一个不同就会被认为是跨域请求。 本文列举了一些处理跨域请求的解决方案&#xff1a; JSONPCORS跨域资源共享http proxynginx反向代理web…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...