Linux内核上游提交完整流程及示例的后续上游反馈

接前篇文章:Linux内核上游提交完整流程及示例

在Linux内核上游提交完整流程及示例中,笔者做了一次针对于DRM的上游提交。起初以为需要几天、一周甚至更长的时间才会有回复,没想到在24小时内就得到了上游的回复,内容如下:

可以看到,上游维护者Ville Syrjälä给出的反馈是:

Not in this case since we already checked it earlier.

但实际上结合代码来看,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;/* check if the format is supported at all */if (!__drm_format_info(r->pixel_format)) {drm_dbg_kms(dev, "bad framebuffer format %p4cc\n",&r->pixel_format);return -EINVAL;}if (r->width == 0) {drm_dbg_kms(dev, "bad framebuffer width %u\n", r->width);return -EINVAL;}if (r->height == 0) {drm_dbg_kms(dev, "bad framebuffer height %u\n", r->height);return -EINVAL;}/* 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];u64 min_pitch = drm_format_info_min_pitch(info, i, width);if (!block_size && (r->modifier[i] == DRM_FORMAT_MOD_LINEAR)) {drm_dbg_kms(dev, "Format requires non-linear modifier for plane %d\n", i);return -EINVAL;}if (!r->handles[i]) {drm_dbg_kms(dev, "no buffer object handle for plane %d\n", i);return -EINVAL;}if (min_pitch > UINT_MAX)return -ERANGE;if ((uint64_t) height * r->pitches[i] + r->offsets[i] > UINT_MAX)return -ERANGE;if (block_size && r->pitches[i] < min_pitch) {drm_dbg_kms(dev, "bad pitch %u for plane %d\n", r->pitches[i], i);return -EINVAL;}if (r->modifier[i] && !(r->flags & DRM_MODE_FB_MODIFIERS)) {drm_dbg_kms(dev, "bad fb modifier %llu for plane %d\n",r->modifier[i], i);return -EINVAL;}if (r->flags & DRM_MODE_FB_MODIFIERS &&r->modifier[i] != r->modifier[0]) {drm_dbg_kms(dev, "bad fb modifier %llu for plane %d\n",r->modifier[i], i);return -EINVAL;}/* modifier specific checks: */switch (r->modifier[i]) {case DRM_FORMAT_MOD_SAMSUNG_64_32_TILE:/* NOTE: the pitch restriction may be lifted later if it turns* out that no hw has this restriction:*/if (r->pixel_format != DRM_FORMAT_NV12 ||width % 128 || height % 32 ||r->pitches[i] % 128) {drm_dbg_kms(dev, "bad modifier data for plane %d\n", i);return -EINVAL;}break;default:break;}}for (i = info->num_planes; i < 4; i++) {if (r->modifier[i]) {drm_dbg_kms(dev, "non-zero modifier for unused plane %d\n", i);return -EINVAL;}/* Pre-FB_MODIFIERS userspace didn't clear the structs properly. */if (!(r->flags & DRM_MODE_FB_MODIFIERS))continue;if (r->handles[i]) {drm_dbg_kms(dev, "buffer object handle for unused plane %d\n", i);return -EINVAL;}if (r->pitches[i]) {drm_dbg_kms(dev, "non-zero pitch for unused plane %d\n", i);return -EINVAL;}if (r->offsets[i]) {drm_dbg_kms(dev, "non-zero offset for unused plane %d\n", i);return -EINVAL;}}return 0;
}

而其中的代码片段:

    /* now let the driver pick its own format info */info = drm_get_format_info(dev, r);for (i = 0; i < info->num_planes; i++) {……

info确实没有做参数检查。并且从以上代码的上文来看,在framebuffer_check函数开始定义了info之后(代码如下),

const struct drm_format_info *info;

再次使用到info的地方就是上边的那一代码片段,期间并没有任何使用的地方,也就是说上游维护者Ville Syrjälä给出的反馈

Not in this case since we already checked it earlier.

在上文中不成立。

再来看代码的下文。drm_get_format_info函数(在drivers/gpu/drm/drm_fourcc.c中)代码如下:

/*** drm_get_format_info - query information for a given framebuffer configuration* @dev: DRM device* @mode_cmd: metadata from the userspace fb creation request** Returns:* The instance of struct drm_format_info that describes the pixel format, or* NULL if the format is unsupported.*/
const struct drm_format_info *
drm_get_format_info(struct drm_device *dev,const struct drm_mode_fb_cmd2 *mode_cmd)
{const struct drm_format_info *info = NULL;if (dev->mode_config.funcs->get_format_info)info = dev->mode_config.funcs->get_format_info(mode_cmd);if (!info)info = drm_format_info(mode_cmd->pixel_format);return info;
}
EXPORT_SYMBOL(drm_get_format_info);

笔者经过进一步跟进,无论是

info = dev->mode_config.funcs->get_format_info(mode_cmd);

还是

info = drm_format_info(mode_cmd->pixel_format);

所调用的函数中,也没有检查info、保证其不为空的代码。因此,上游维护者的回复,笔者并不认同。于是笔者也没客气,直接针对于他的回复邮件又回复了邮件:

这次的回复就没有下文了。

后来,笔者又在DRM代码中发现了一处问题。还是在drivers/gpu/drm/drm_framebuffer.c的framebuffer_check函数中,以下代码片段:

    for (i = info->num_planes; i < 4; i++) {if (r->modifier[i]) {drm_dbg_kms(dev, "non-zero modifier for unused plane %d\n", i);return -EINVAL;}/* Pre-FB_MODIFIERS userspace didn't clear the structs properly. */if (!(r->flags & DRM_MODE_FB_MODIFIERS))continue;if (r->handles[i]) {drm_dbg_kms(dev, "buffer object handle for unused plane %d\n", i);return -EINVAL;}if (r->pitches[i]) {drm_dbg_kms(dev, "non-zero pitch for unused plane %d\n", i);return -EINVAL;}if (r->offsets[i]) {drm_dbg_kms(dev, "non-zero offset for unused plane %d\n", i);return -EINVAL;}}

其中以下一行

 for (i = info->num_planes; i < 4; i++) {

直接使用了数字4,导致可移植性有问题。于是笔者改为了

for (i = info->num_planes; i < DRM_FORMAT_MAX_PLANES; i++) {

DRM_FORMAT_MAX_PLANES宏在include/drm/drm_fourcc.h中定义:

/*** DRM_FORMAT_MAX_PLANES - maximum number of planes a DRM format can have*/
#define DRM_FORMAT_MAX_PLANES	4u

再次按照Linux内核上游提交完整流程及示例中的步骤进行上游提交尝试。这次也是在24小时之内得到了回复。第一个回复如下:

“reviewed”了!离DRM即内核上游提交就差一步了!正当笔者高兴之际,第二天迎来了当头一棒。又一位维护者回复了此patch:

Hi Am 02.11.23 um 03:29 schrieb Peng Hao: > Use Macro DRM_FORMAT_MAX_PLANES instead of 4, to improve modifiability. > > Signed-off-by: Peng Hao <penghao@dingdao.com> > --- > drivers/gpu/drm/drm_framebuffer.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c > index 2dd97473ca10..bf283dae9090 100644 > --- a/drivers/gpu/drm/drm_framebuffer.c > +++ b/drivers/gpu/drm/drm_framebuffer.c > @@ -254,7 +254,7 @@ static int framebuffer_check(struct drm_device *dev, > } > } > > - for (i = info->num_planes; i < 4; i++) { > + for (i = info->num_planes; i < DRM_FORMAT_MAX_PLANES; i++) { This change makes the code more fragile. '4' is a fixed constant in the UAPI struct, while DRM_FORMAT_MAX_PLANES is an internal constant. I agree that both should reasonably have the same value. But (potentially) changing the value of DRM_FORMAT_MAX_PLANES will break these loops with a possible OOB access. To make make this code more robust, it might be better to rewrite the tests like this for (i = num_planes; i < ARRAY_SIZE(r->modifier); +i) { // the test for modifier[i] } if (r->flags & DRM_MODE_FB_MODIFIERS) { for (i < ARRAY_SIZE(handles)) { // test for handles[i] } for (i < ARRAY_SIZE(pitches)) { // test for pitches[i] } for (i < ARRAY_SIZE(offsets)) { // test for offsets[i] } } Best regards Thomas > if (r->modifier[i]) { > drm_dbg_kms(dev, "non-zero modifier for unused plane %d\n", i); > return -EINVAL; -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)

这位维护者回复得比较有道理

看来真正想实现上游提交,还得自身知识和技术过硬才行。不能只看到一小处就以为“捡了漏”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257423.html

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

相关文章

超参数优化的多功能贝叶斯优化包SMAC3

地址 关键词 Bayesian optimization, hyperparameter optimization, SMAC3 文章概述 本文介绍了SMAC3&#xff0c;一个用于超参数优化的多功能贝叶斯优化包。SMAC3使用随机森林作为代理模型&#xff0c;并结合了多样性的BO和强化策略&#xff0c;如积极竞赛和多样性方法…

lazada来赞达API 开发系列:item_search - 按关键字搜索商品API返回值说明

Lazada关键词搜索商品API接口的作用主要是帮助开发者通过关键词搜索获取Lazada平台上的商品信息。通过这个接口&#xff0c;开发者可以在自己的应用或网站中实现类似Lazada平台的关键词搜索功能&#xff0c;让用户可以通过输入关键词来查找感兴趣的商品。 具体来说&#xff0c…

沪沽月家政服务系统开发功能介绍

随着人们生活和工作压力的增大&#xff0c;越来越多的人选择将家务、照顾老人和孩子等家务活交给家政服务公司。。家政系统作为一个家政服务公司的管理平台&#xff0c;需要具备一系列的功能来满足客户和家政服务管理者的需求。。 下面&#xff0c;我们将详细介绍家政服务系统…

了解linux ACL权限

本章主要介绍 ACL 权限 ACL 的用法 ACL 的 mask 权限 设置默认权限 10.1 ACL 介绍及基本用法 前面讲权限时&#xff0c;是对u、g、o设置权限的&#xff0c;现在假如有图10-1所示的需求。 有一个目录aa&#xff0c;要求tom、bob、mary具有不同的权限&#xff0c;利用前面讲过…

Navicat 技术指引 | 适用于 GaussDB 分布式的数据生成功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

基因组学分析的解决方案——比较基因组杂交(CGH)

作为生命科学工具的先驱者和创新者&#xff0c;Enzo Life Sciences根据其专有的核酸&#xff08;DNA&RNA&#xff09;标记技术&#xff0c;研发出比较基因组杂交&#xff08;Comparative Genomic Hybridization&#xff0c;CGH&#xff09;试剂盒。CGH试剂盒是一个检测与染…

urllib 异常、cookie、handler及代理(四)

目录 一、urllib异常 二、urllib cookie登录 三、urllib handler 处理器的基本使用 四、urllib 代理和代理池 参考 一、urllib异常 URLError/HTTPError 简介&#xff1a; 1.HTTPError类是URLError类的子类 2.导入的包urllib.error.HTTPError urllib.error.URLError 3.h…

最实用的UPS监控技巧,今天用一篇文章告诉你!

在现代信息技术高度依赖的环境中&#xff0c;机房扮演着至关重要的角色&#xff0c;而UPS&#xff08;不间断电源&#xff09;作为保障设备之一&#xff0c;对于确保数据中心和服务器系统的稳定运行至关重要。 为了更好地监控和管理UPS设备&#xff0c;提高机房设备的可靠性和稳…

做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record&#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数&#xff0c;输出按照日期升序排序&#xff0c;查询返回结果名称和顺序为&#xff1a; date|user_id|pass_count 表单创建…

数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景

1.5 数据清洗、特征工程和数据可视化、挖掘建模的应用场景 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.5节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应…

灾备行业常用术语

在灾备&#xff08;Disaster Recovery&#xff09;行业中&#xff0c;有一些常用的术语和概念&#xff0c;这些术语通常涉及到数据保护、业务连续性和灾难恢复方面。以下是一些常见的灾备行业术语&#xff1a; 备份&#xff08;Backup&#xff09; 对数据的定期复制&#xff…

MTU TCP-MSS(转载)

MTU MTU 最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;用来通知对方所能接受数据服务单元的最大尺寸&#xff0c;说明发送方能够接受的有效载荷大小。 是包或帧的最大长度&#xff0c;一般以字节记。如果MTU过大&#xff0c;在碰到路由器时…