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

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...