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.rhkb.cn/news/214153.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

生成式AI赋能千行百业加速创新,2023亚马逊云科技re:Invent行业盘点

2023亚马逊云科技re:Invent全球大会已于上周圆满闭幕&#xff0c;在本次大会中&#xff0c;亚马逊云科技又为大家带来了很多功能/项目迭代更新&#xff0c;也重磅发布了很多全新的功能。今天从行业视角来盘点回顾哪些重磅发布适用于垂直行业客户&#xff0c;以及面向汽车、制造…

MySQL 数据库如何实现 XA 规范?

本文我们来讨论 MySQL 的 XA 规范有哪些应用相关的内容。 MySQL 为我们提供了分布式事务解决方案&#xff0c;在前面的内容中提到过 binlog 的同步&#xff0c;其实是 MySQL XA 规范的一个应用&#xff0c;那么 XA 规范是如何定义的&#xff0c;具体又是如何应用的呢&#xff…

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)

Si24R03是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…

Linux:进程优先级与命令行参数

目录 1.进程优先级 1.1 基本概念 1.2 查看系统进程 1.3 修改进程优先级的命令 2.进程间切换 2.1 相关概念 2.2 Linux2.6内核进程调度队列&#xff08;了解即可&#xff09; 3.命令行参数 1.进程优先级 1.1 基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优…

MySql复习笔记03(小滴课堂) 事务,视图,触发器,存储过程

mysql 必备核心知识之事务的详细解析&#xff1a; 创建一个数据库表&#xff1a; 添加数据并开启事务。 添加数据并查询。 登录另一台服务器发现查不到这个表中的数据。 这是因为事务开启了&#xff0c;但是没有提交&#xff0c;只是把数据存到了内存中&#xff0c;还没有写入…

海外地区开启IPV6无法访问服务器问题

前言 最近有海外地区的用户反馈无法访问公司的网络&#xff0c;无法下载应用和系统进行升级。了解到浏览器可以正常访问公司域名&#xff0c;谷歌&#xff0c;油管等都能正常使用。日志分析GET请求服务器数据时没有得到应答&#xff0c;最终查询网络相关修改确认与网络IPV6有关…

【Jeecg Boot 3 - 保姆级】第1节 docker + redis + nginx + redis一键安装启动

一、前言 ▶ JEECG-BOOT 开源版难以吃透的原因 ▶ 为了针对上面痛点&#xff0c;笔者做了如下安排 ▶ 你能收获什么 二、效果(第一节效果) ▶ 启动后端 &#xff1e; 日志 &#xff1e; 接口文档 ▶ 启动前端 三、准备工作 四、实战 ▶ 1、服务器安装 Stag…

C#注册表技术及操作

目录 一、注册表基础 1.Registry和RegistryKey类 &#xff08;1&#xff09;Registry类 &#xff08;2&#xff09;RegistryKey类 二、在C#中操作注册表 1.读取注册表中的信息 &#xff08;1&#xff09;OpenSubKey()方法 &#xff08;2&#xff09;GetSubKeyNames()…

天池SQL训练营(三)-复杂查询方法-视图、子查询、函数等

-天池龙珠计划SQL训练营 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 视图 我们先来看一个查询语句&#xff08;仅做示例&#xff0c;未提供相关数据&#xff09; SELECT stu_name FROM view_students_info;单从表面上看起来…

unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)

一、c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

shell基本知识

Linux 系统中 shell 的基本知识 1 什么是 shell Shell 是一种命令行解释器&#xff0c;它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序。用户可以用 shell 来启动、挂起、停止甚至是编写一些程序。 2 Linux 启动过程 Linux 系统的启动过程可以概括为…

【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)

目录 前提概要监控工作可以分为四个部分 监控开发任务Metrics中的基础数据类型计数器&#xff08;Counter&#xff09;统计 API 访问中异常&#xff08;1000/1500&#xff09;的次数统计 API 的调用量统计特定事件发生的次数Counter的底层原理基础 (Base) 计数器单元 (Cell) 数…

【华为数据之道学习笔记】2-建立企业级数据综合治理体系

数据作为一种新的生产要素&#xff0c;在企业构筑竞争优势的过程中起着重要作用&#xff0c;企业应将数据作为一种战略资产进行管理。数据从业务中产生&#xff0c;在IT系统中承载&#xff0c;要对数据进行有效治理&#xff0c;需要业务充分参与&#xff0c;IT系统确保遵从&…

mmdetection里的测速脚本

由于大论文里需要对各个算法进行测速&#xff0c;因此抛开官方文档的使用说明&#xff0c;记录一下我是怎么使用mmdetection里的脚本进行测速的。 mmdetection版本&#xff1a;2.23.0 一、新版本benchmark.py&#xff08;需要分布式&#xff09; 打开tools/analysis_tools/b…

xml文本转Java对象

Java对象转String public static String toData(Object object) throws Exception {JAXBContext jc JAXBContext.newInstance(object.getClass());Marshaller m jc.createMarshaller();StringWriter output new StringWriter(2048);m.marshal(object, output);String data …

C# 任务并行类库Parallel调用示例

写在前面 Task Parallel Library 是微软.NET框架基础类库&#xff08;BCL&#xff09;中的一个&#xff0c;主要目的是为了简化并行编程&#xff0c;可以实现在不同的处理器上并行处理不同任务&#xff0c;以提升运行效率。Parallel常用的方法有For/ForEach/Invoke三个静态方法…

如何确认网站是否有漏洞,如何找出网站存在的漏洞,找到漏洞该如何处理

如何确认网站或者服务器是否有漏洞 判断一个网站是否是存在漏洞的方法&#xff1a; 1.可以借助德迅云安全漏洞扫描功能来检查漏洞。 2.打开德迅云安全首页&#xff0c;点击最上面导航栏中的“安全产品”。 3.滑到“漏洞扫描”&#xff0c;选择“产品价格”服务。 4.选择您需…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

ThinkPHP如何讲链接多个数据库

为什么要使用多个数据库 数据分片&#xff1a; 当数据量非常大时&#xff0c;可能需要将数据分布在不同的数据库中&#xff0c;以提高查询性能。这被称为数据分片&#xff0c;其中不同的数据库负责存储不同范围的数据。 业务分离&#xff1a; 有时&#xff0c;一个大型项目可…