struct queue_limits结构体参数学习

struct queue_limits结构体参数含义总结

参考:
1:https://developer.aliyun.com/article/784610
2:https://developer.aliyun.com/article/770780

内核版本:4.19.1
结构体定义如下:

struct queue_limits {unsigned long		bounce_pfn;unsigned long		seg_boundary_mask; unsigned long		virt_boundary_mask;unsigned int		max_hw_sectors;unsigned int		max_dev_sectors;unsigned int		chunk_sectors;unsigned int		max_sectors;unsigned int		max_write_same_sectors;unsigned int		max_write_zeroes_sectors;unsigned short		max_segments; unsigned int		max_segment_size; unsigned int		physical_block_size;unsigned short		logical_block_size;unsigned int		io_min;unsigned int		io_opt;unsigned int		alignment_offset;unsigned int		max_discard_sectors;unsigned int		max_hw_discard_sectors;unsigned int		discard_granularity;unsigned int		discard_alignment;unsigned short		max_discard_segments;unsigned char		discard_misaligned;unsigned short		max_integrity_segments;unsigned char		misaligned;unsigned char		cluster;unsigned char		raid_partial_stripes_expensive;enum blk_zoned_model	zoned;
};

内核提供了相关的API接口去设置这些相关的参数,
在blk-settings.c文件。

seg_boundary_mask参数

该参数我的理解是 这个参数的描述的地址是一个dma地址,也就是给控制器用的,我猜测应该是通过dma_xx这系列函数将内核态的虚拟地址映射为dma地址以后,这个dma地址不能超过seg_boundary_mask 的值。

这个参数起作用的地方应该主要是在bio合并的时候调用了
这个宏,该宏会对给seg_boundary_mask 的值做一些相关的限制操作。
include/linux/bio.h

BIOVEC_SEG_BOUNDARY
/*** blk_queue_segment_boundary - set boundary rules for segment merging* @q:  the request queue for the device* @mask:  the memory boundary mask**/
void blk_queue_segment_boundary(struct request_queue *q, unsigned long mask)
{if (mask < PAGE_SIZE - 1) {mask = PAGE_SIZE - 1;printk(KERN_INFO "%s: set to minimum %lx\n", __func__, mask);}q->limits.seg_boundary_mask = mask;
}
EXPORT_SYMBOL(blk_queue_segment_boundary);

virt_boundary_mask参数

这个参数我的理解是最后生成的dma地址,必须要满足nvme 的prp模型。
在bio生成的时候也会做类型的限制,比如在bio_add_pc_page函数当中调用的
bvec_gap_to_prev函数,就是做类似的操作的。
block/bio.c

/*** blk_queue_virt_boundary - set boundary rules for bio merging* @q:  the request queue for the device* @mask:  the memory boundary mask**/
void blk_queue_virt_boundary(struct request_queue *q, unsigned long mask)
{q->limits.virt_boundary_mask = mask;
}
EXPORT_SYMBOL(blk_queue_virt_boundary);

max_segments和max_segment_size参数

这两个参数比较容易理解,但是个人感觉加上physical字段会更好,比如
段这个概念是在bio里的bvec去表示的,它可能是page的一部分,也可能等于page,但是在驱动里描述的时候,用的是内核态的虚拟地址,而且不同的bvec表示的page在虚拟地址当中可能不是连续的,但是在物理上可能是连续的,比如bvec[0]和bvec[1],是连续的,那么这个时候对于当前io请求来说,它的段的个数是1,这个1会和max_segments值进行比较。

同理,max_segment_size值就是bvec[0]和bvec[1]的地址长度大小了。
max_segments:

/*** blk_queue_max_segments - set max hw segments for a request for this queue* @q:  the request queue for the device* @max_segments:  max number of segments** Description:*    Enables a low level driver to set an upper limit on the number of*    hw data segments in a request.**/
void blk_queue_max_segments(struct request_queue *q, unsigned short max_segments)
{if (!max_segments) {max_segments = 1;printk(KERN_INFO "%s: set to minimum %d\n", __func__, max_segments);}q->limits.max_segments = max_segments;
}
EXPORT_SYMBOL(blk_queue_max_segments);

max_segment_size:

/*** blk_queue_max_segment_size - set max segment size for blk_rq_map_sg* @q:  the request queue for the device* @max_size:  max size of segment in bytes** Description:*    Enables a low level driver to set an upper limit on the size of a*    coalesced segment**/
void blk_queue_max_segment_size(struct request_queue *q, unsigned int max_size)
{if (max_size < PAGE_SIZE) {max_size = PAGE_SIZE;printk(KERN_INFO "%s: set to minimum %d\n", __func__, max_size);}q->limits.max_segment_size = max_size;
}
EXPORT_SYMBOL(blk_queue_max_segment_size);

续:

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

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

相关文章

物联网水表和4G水表的区别有哪些?

随着科技的发展&#xff0c;水表也不再是传统的机械表&#xff0c;而是经过数字化和智能化改造的物联网水表和4G水表。这两种水表具有很多的不同点。那么&#xff0c;物联网水表和4G水表的区别有哪些&#xff1f; 首先&#xff0c;物联网水表和4G水表的通信方式不同。物联网水表…

Zabbix监控接收SNMPTrap消息与SNMPTT结合

一.SNMP 协议 1.协议介绍 snmp 协议是日常使用的较多的一种协议&#xff0c;绝大多数网络设备/存储等都支持 snmp 协议&#xff0c;通过此协议可以实现设备状态的监控及管理。 2.主要组成 SNMP 协议包括以下三个部分: SNMP Agent&#xff1a;负责处理 snmp 请求&#xff0c…

LeetCode-二叉树OJ题

1.单值二叉树 965. 单值二叉树https://leetcode.cn/problems/univalued-binary-tree/ 先判断这棵树是否为空&#xff0c;如果是空树则是true。再判断左子树是否为空&#xff0c;并且左子树的值val和当前节点的val不相同&#xff0c;如果这左子树不为空且val不等于root的val则…

二百一十二、Flume——Flume实时采集Linux中的目录文件写入到HDFS中(亲测、附截图)

一、目的 在实现Flume实时采集Linux中的Hive日志写入到HDFS后&#xff0c;再做一个测试&#xff0c;用Flume实时采集Linux中的目录文件&#xff0c;即使用 Flume 监听Linux整个目录的文件&#xff0c;并上传至 HDFS中 二、前期准备 &#xff08;一&#xff09;安装好Hadoop、…

【Python函数】闭包函数

定义&#xff1a; 函数内部定义另外一个函数并且该内部函数可访问和修改外部变量的值 原理&#xff1a; 外部函数执行完后&#xff0c;有变量被内部函数使用则会将该变量绑定到内部变量后&#xff0c;再释放内存 语法 def outer_function():def inner_function():return 语句r…

一张网页截图,AI帮你写前端代码,前端窃喜,终于不用干体力活了

简介 众所周知&#xff0c;作为一个前端开发来说&#xff0c;尤其是比较偏营销和页面频繁改版的项目&#xff0c;大部分的时间都在”套模板“&#xff0c;根本没有精力学习前端技术&#xff0c;那么这个项目可谓是让前端的小伙伴们看到了一丝丝的曙光。将屏幕截图转换为代码&a…

02_W5500网络初始化

目录 1.如何与W5500通信&#xff1f; 2.SPI数据帧&#xff1a; 3.W5500寄存器&#xff1a; 通用寄存器&#xff1a; Socket 寄存器区: 4.代码分析&#xff1a; 5.测试&#xff1a; 1.如何与W5500通信&#xff1f; 我们在W5500介绍中可以看到W5500支持SPI通信协议&#x…

RoPE旋转位置编码浅析

RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…

MySQL数据库基础篇

文章目录 前言1.MySQL数据库概述2.SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作 2.4 图形化界面工具2.5 DML2.5.1 添加数据2.5.2 修改数据2.5.3 删除数据 2.6 DQL2.6.1 基本语法2.6.2 基础查询2.6.3 条件查询2.6.4 聚合函数2.6.5 分组查询2.6.6 排序查询…

怎样创建自己的百度百科词条?

对于企业、名人、品牌等&#xff0c;拥有一条详实的百度百科词条更是形象塑造和品牌推广的有效途径。怎样创建自己的百度百科词条&#xff1f;创建百度百科词条并非难事&#xff0c;关键在于态度和执行力。接下来伯乐网络传媒就来给大家分享一下&#xff01; 一、创建百度百科词…

Zabbix自定义监控内容

自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1.在客户端创建自定义key //明确需要执行的 linux 命令 who | wc -l//创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key vim /etc/zabbix/zabbix_ag…

vue2-省市县三级联动选择框

Json数据&#xff1a;https://yjy-oss-files.oss-cn-zhangjiakou.aliyuncs.com/tuxian/area.json 如何访问本地文件参考&#xff1a;vue-访问本地json文件_vue3读取json文件-CSDN博客 .vue文件&#xff1a; <template><select v-model"mailAddress1" style…

为什么游戏公司不太愿意采用“微服务”架构?

为什么游戏公司可能不太愿意采用微服务架构&#xff1a; 实时性和性能需求&#xff1a; 游戏服务器对实时性能的要求非常高&#xff0c;微服务的网络开销和复杂性可能会影响游戏的实时性&#xff0c;尤其是在需要高速多向通讯的场景。 通信模式的复杂性&#xff1a; 游戏服务器…

【云备份】客户端实现 及 项目整体总结

文章目录 客户端客户端实现思想客户端文件操作类的设计与拷贝Util.hpp的设计data.hpp的设计Storage —— 持久化存储Initload——数据初始化加载 cloud.hpp的设计GetFileIdentifier——创建文件唯一标识Upload—— 文件上传IsNeedupload —— 客户端文件是否需要上传判断RunMod…

chineseocr项目不使用web推理-docker容器化

整个流程介绍 拉取 ufoym/deepo 镜像 -- 因为包含了主流深度学习框架&#xff0c;镜像4G出头。拉取 chineseocr 项目代码。修改代码&#xff0c;不使用web&#xff0c;增加命令行传入图片路径的功能打包成docker镜像。 开始 拉取 ufoym/deepo 镜像 &#xff1a;cpu版本为例 do…

用php上传图片到阿里云oss

如果你想自动创建目录并将文件上传到新的目录下&#xff0c;你可以使用阿里云 OSS 的 createObject 方法来实现。下面是更新后的示例代码&#xff1a; php <?php require_once __DIR__ . /vendor/autoload.php; // 引入 SDKuse OSS\OssClient; use OSS\Core\OssException;…

设计必备网站,每天必看,无需翻墙。

设计师每天需要浏览各类设计互交网站&#xff0c;找素材、找灵感、看教程等等&#xff0c;下面就推荐几个非常好用的设计网站&#xff0c;我本人用了好几年&#xff0c;对广大设计师们一定有帮助&#xff0c;感觉收藏起来吧&#xff01; 1、免费设计素材——菜鸟图库 https://…

Java Websocket实现即时通讯功能入门教程

近年来&#xff0c;即时通讯&#xff08;Instant Messaging&#xff09;已经成为了人们日常生活中不可缺少的一部分。而Java Websocket技术则提供了一种简便高效的方式来实现即时通讯功能。本文将介绍如何使用Java Websocket来实现即时通讯&#xff0c;并提供具体的代码示例。 …

Vue自定义hook函数

hook 本质是一个函数&#xff0c;可以把 setup 函数中使用的 Composition API 进行封装。 hook 类似于 Vue2 中的 mixin 混合。 自定义 hook 的优势&#xff1a;复用代码&#xff0c;让 setup 中的逻辑更加清晰易懂。 自定义hook函数&#xff1a; 1、在 src 目录下创建 hooks…

android 签名文件生成

1.生成keystore文件 keytool -genkey -v -keystore app.keystore -alias app -keyalg RSA -keysize 2048 -validity 36500 -genkey: 生成一个新的秘钥对 -v:显示生成过程 -keystore&#xff1a;指定生成的文件名字 -alias:签名文件别名 -keyalg:指定算法名字 -keysize:指…