当前位置: 首页 > news >正文

blk_mq_alloc_tag_set函数struct blk_mq_tag_set结构体学习

struct blk_mq_tag_set结构体

include/linux/blk-mq.h

struct blk_mq_tag_set {unsigned int		*mq_map;const struct blk_mq_ops	*ops;unsigned int		nr_hw_queues;unsigned int		queue_depth;	/* max hw supported */unsigned int		reserved_tags;unsigned int		cmd_size;	/* per-request extra data */int			numa_node;unsigned int		timeout;unsigned int		flags;		/* BLK_MQ_F_* */void			*driver_data;struct blk_mq_tags	**tags;struct mutex		tag_list_lock;struct list_head	tag_list;
};

后面再分析每个成员的作用。

blk_mq_alloc_tag_set函数分析

/** Alloc a tag set to be associated with one or more request queues.* May fail with EINVAL for various error conditions. May adjust the* requested depth down, if it's too large. In that case, the set* value will be stored in set->queue_depth.*/
int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
{int ret;//...set->tags = kcalloc_node(nr_cpu_ids, sizeof(struct blk_mq_tags *),GFP_KERNEL, set->numa_node);if (!set->tags)return -ENOMEM;ret = -ENOMEM;set->mq_map = kcalloc_node(nr_cpu_ids, sizeof(*set->mq_map),GFP_KERNEL, set->numa_node);if (!set->mq_map)goto out_free_tags;ret = blk_mq_update_queue_map(set);if (ret)goto out_free_mq_map;ret = blk_mq_alloc_rq_maps(set);if (ret)goto out_free_mq_map;mutex_init(&set->tag_list_lock);INIT_LIST_HEAD(&set->tag_list);return 0;out_free_mq_map:kfree(set->mq_map);set->mq_map = NULL;
out_free_tags:kfree(set->tags);set->tags = NULL;return ret;
}
EXPORT_SYMBOL(blk_mq_alloc_tag_set);

这个函数一进来的话先是对其,这两个成员的合法性做一个检查,这两个成员的值,一般是从硬件获取的,在调用该函数时已经赋值了。

nr_hw_queues
queue_depth

然后是tags成员的赋值,申请内存,它是一个二级指针,申请的元素个数是cpu个数,可以理解是一个指针数组,数组里的每一个成员都是一个指针,例如,下面的这个小demo,

#include<stdio.h>
#include<stdlib.h>int main(int argc, char **argv)
{int **p;int i, j, x, y;p = malloc(sizeof(int) * 4);p[0] = &x;p[1] = &y;x = 10;y = 20;printf("p = %d\n", *(*(p + 0)));return 0;
}

然后是mq_map这个成员,它申请的内存空间也是cpu的个数。

blk_mq_update_queue_map

然后深入到这个函数,

static int blk_mq_update_queue_map(struct blk_mq_tag_set *set)
{if (set->ops->map_queues) {/** transport .map_queues is usually done in the following* way:** for (queue = 0; queue < set->nr_hw_queues; queue++) {* 	mask = get_cpu_mask(queue)* 	for_each_cpu(cpu, mask)* 		set->mq_map[cpu] = queue;* }** When we need to remap, the table has to be cleared for* killing stale mapping since one CPU may not be mapped* to any hw queue.*/blk_mq_clear_mq_map(set);return set->ops->map_queues(set);} elsereturn blk_mq_map_queues(set);
}

继续,

int blk_mq_map_queues(struct blk_mq_tag_set *set)
{unsigned int *map = set->mq_map;unsigned int nr_queues = set->nr_hw_queues;unsigned int cpu, first_sibling;for_each_possible_cpu(cpu) {/** First do sequential mapping between CPUs and queues.* In case we still have CPUs to map, and we have some number of* threads per cores then map sibling threads to the same queue for* performace optimizations.*/if (cpu < nr_queues) {map[cpu] = cpu_to_queue_index(nr_queues, cpu);} else {first_sibling = get_first_sibling(cpu);if (first_sibling == cpu)map[cpu] = cpu_to_queue_index(nr_queues, cpu);elsemap[cpu] = map[first_sibling];}}return 0;
}
EXPORT_SYMBOL_GPL(blk_mq_map_queues);

前面说了mq_map其实是一个指针,这里终于看到它赋值的地方了,根据注释不难看出,这个指针(其实就是个一维数组),的下标是cpu编号,然后每个数组元素的值是硬件队列的编号。到这里这个函数就结束了,其实功能就是给mq_map赋值的。

blk_mq_alloc_rq_maps

然后到blk_mq_alloc_rq_maps这个函数的分析
待后续。。。。。

相关文章:

blk_mq_alloc_tag_set函数struct blk_mq_tag_set结构体学习

struct blk_mq_tag_set结构体 include/linux/blk-mq.h struct blk_mq_tag_set {unsigned int *mq_map;const struct blk_mq_ops *ops;unsigned int nr_hw_queues;unsigned int queue_depth; /* max hw supported */unsigned int reserved_tags;unsigned int cmd_size; /…...

Windows搭建Snort环境及使用方式

目录 0x01 前置环境0x02修改配置文件0x03 自测0x04 使用0x05 感言 0x01 前置环境 环境描述windows10snort2.9.2https://www.snort.org/downloads 先把上面环境下载好&#xff01; 需要注意的是安装npcap这个软件 0x02修改配置文件 软件安装目录&#xff1a;C:/Snort/ 配置文…...

Android network — iptables四表五链

Android network — iptables四表五链 1. iptables简介2. iptables的四表五链2.1 iptables流程图2.2 四表2.3 五链2.4 iptables的常见情况 3. NAT工作原理3.1 BNAT3.2 NAPT 4. iptables配置 本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。 1. i…...

【C++从0到王者】第十六站:stack和queue的使用

文章目录 一、stack的使用1.stack的介绍2.stack的使用 二、queue的使用1.queue的护额晒2.queue的使用 三、stack和queue相关算法题1.最小栈2.栈的压入、弹出序列3.逆波兰表达式4.两个栈实现一个队列5.用两个队列实现栈6.二叉树的层序遍历1.双队列2.用一个变量levelSize去控制 7…...

centos7 部署Tomcat和jpress应用

目录 一、静态、动态、伪静态 二、Web 1.0 和 Web 2.0 三、centos7 部署Tomcat 3.1 安装、配置jdk 3.2 安装 Tomcat 3.3 配置服务启动脚本 3.3.1 创建用户和组 3.3.2 创建tomcat.conf文件 3.3.3 创建服务脚本(tomcat.service) 3.3.4 重新加载守护进程并且测试 四、部…...

Unity Shader:常用的C#与shader交互的方法

俗话说久病成医&#xff0c;虽然不是专业技术美术&#xff0c;但代码写久了自然会积累一些常用的shader交互方法。零零散散的&#xff0c;总结如下&#xff1a; 1&#xff0c;改变UGUI的材质球属性 有时候我们需要改变ui的一些属性&#xff0c;从而实现想要的效果。通常UGUI上…...

luajit 使用 clang编译的坑

为了尝试将LuaJIT接入虚幻Lua插件之中&#xff0c;需要预编译LuaJIT链接库&#xff0c;在桌面平台问题不大, 主要是移动平台&#xff0c;涉及跨平台编译&#xff0c;因为对跨平台编译具体细节没有系统研究&#xff0c;这里先记录一下跨平台编译LuaJIT的主要过程 由于官方提供的…...

[SWPUCTF 2021 新生赛]Do_you_know_http

打开环境&#xff0c;根据题目提示&#xff0c;应该是考察http相关的东西 打开环境提示说请使用wLLm浏览器访问 那我们更改浏览器信息&#xff0c;在burp重发器中发包后发现是302重定向&#xff0c;但是提示说success成功&#xff0c;说明 我们修改是成功的&#xff0c;既然是…...

web前端之CSS

文章目录 一、CSS简介1.1 CSS语法规则 二、CSS的引用方法2.1 定义行内样式表2.2定义内部样式表2.3链入外部样式表2.4导入外部样式表 三、CSS选择符3.1 基本选择符3.1.1 标签选择符3.1.2 class类选择符3.1.3 id选择符 3.2 复合选择符3.2.1 交集选择符&#xff08;合并选择器&…...

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容&#xff1a;微卡、小卡、中卡、大卡&#xff0c;根据不同卡片特征显示同一个字的不同内容&#xff0c;基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新&#xff1a;用户点击卡片刷新按钮查看新内容&#xff0c;同时…...

xLua学习

xLua教程&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ&#xff1a;https://github.com/Tencent/xLua/blob/maste…...

​Web3到底是个啥?

Web3到底是个啥&#xff1f; Web3是近两年来科技领域最火热的概念之一&#xff0c;但是目前对于Web3的定义却仍然没有形成标准答案&#xff0c;相当多对于Web3的理解&#xff0c;都是建立在虚拟货币行业&#xff08;即俗称的“币圈”&#xff09;的逻辑基础之上的。 区块链服务…...

pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)

文章目录 pycharm、idea、golang系列修改行分隔符我应该选择什么换行符JetBrains IDE&#xff0c;默认行分隔符 是跟随系统修改JetBrains IDE&#xff0c;默认行分隔符 pycharm、idea、golang系列修改行分隔符 一般来说,不同的开发环境和项目对换行格式的使用偏好不同: Windo…...

ThinkPHP函数深度解析

ThinkPHP是一个具有丰富功能和强大灵活性的PHP开发框架。在这篇文章中&#xff0c;我们将详细介绍ThinkPHP的一些关键函数&#xff0c;以帮助开发人员更好地理解和使用这个框架。 1. 入门&#xff1a;ThinkPHP的核心函数 1.1 C()函数 C()函数用于读取和设置配置参数。它是Thin…...

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言&#xff1a;maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…...

LeetCode150道面试经典题-合并两个有序数组(简单)

合并两个有序数组 题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&a…...

记录 运维三剑客一件部署的的docker-compose,yml文件

CAdvisor: 收集 InfluxDB: 存储 Grafana&#xff1a; 展示 version: 3.1volumes:grafana_data: {}services:influxdb:image: tutum/influxdb:0.9restart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083:8083"- "8086:8086"volumes:- ./data/inf…...

Xposed框架开发

文章目录 xpose插件开发步骤清单文件新建一个类&#xff08;插件入口点&#xff09;设置入口点 Hook第一个实例zhuceji.apk一些常用的HOOKHookH5PluginHookProxyPluginHookSystem 资料Xposed原理初探 xpose插件开发步骤 magisk安装与配置 Xpose Framework API LSPosed magisk …...

2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)

1.long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) 描述:从指定的用户环形缓冲区中排出样本,并为每个此类样本调用提供的回调: long (*callback_fn)(struct bpf_dynptr *dynptr, void *ctx); 如果callback_fn返回0,帮助函数…...

关于游戏的笔记

关于搭建秦时明月2一键端&#xff0c;并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…...

Win11 右键菜单缺少“新建文本文档“win11 某些软件中文乱码

Win11 右键菜单缺少“新建文本文档“Win11 右键菜单缺少"新建文本文档"是‌常见系统配置问题‌&#xff0c;主要通过注册表修复或记事本应用重装即可解决。‌‌核心解决方法&#xff08;win11 亲测可行&#xff09;‌注册表修复&#xff08;最常用&#xff09;‌按Wi…...

【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程

目录 为什么需要设备树&#xff1f;传统驱动的终极痛点DTS/DTB/DTC 大白话定义核心区别三者关系完整编译流程图最简单的DTS示例语法解析设备树编译与反编译实操命令内核如何加载和使用设备树核心总结面试必背考点 1. 为什么需要设备树&#xff1f;传统驱动的终极痛点 在设备树…...

Word文档保护技巧:防止内容被轻易复制

Word文档如何防止复制呢&#xff1f;其实&#xff0c;Word根本没有真正意义上的禁止复制&#xff0c;因为用户按一下手机截图&#xff0c;或者拍张照片&#xff0c;内容照样能拿走。但是&#xff0c;我们可以提高复制门槛&#xff0c;也就是让其他用户通过“CtrlC”无法直接复制…...

淘宝淘金币自动化脚本:3步解放你的双手,每天多赚30分钟自由时间

淘宝淘金币自动化脚本&#xff1a;3步解放你的双手&#xff0c;每天多赚30分钟自由时间 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/t…...

进口与国产扁线电感参数PK:Coilcraft SER2918H-103KL vs TONEVEE ZER2918-H103K

在大电流电源设计领域&#xff0c;扁线电感因低直流电阻、高饱和电流及良好的散热性能&#xff0c;成为 DC-DC 转换器、VRM 及工业控制等场景的核心器件。美国 Coilcraft&#xff08;线艺&#xff09;作为国际品牌&#xff0c;其 SER2900 系列长期占据高端市场&#xff1b;国产…...

Heavy Fighter动画包:Unity战斗系统根运动与状态机深度解析

1. 这套动画包不是“拿来就能用”的资源&#xff0c;而是需要你亲手校准的战斗系统骨架我在2021年接手一个横版ARPG项目时&#xff0c;美术总监甩给我三套Mecanim动画包&#xff0c;其中一套就是Heavy Fighter Mecanim Animation Pack。当时我第一反应是“终于不用手调IK了”&a…...

基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&a…...

3个核心功能揭秘:JiYuTrainer如何让极域电子教室不再束缚你的学习自由

3个核心功能揭秘&#xff1a;JiYuTrainer如何让极域电子教室不再束缚你的学习自由 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在学校机房被极域电子教室的全屏广播困…...

3个核心操作:让网络架构可视化变得如此简单

3个核心操作&#xff1a;让网络架构可视化变得如此简单 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 在数字时代的网络管理中&#xff0c;技术文档的可视化呈现已经成为专业沟通的关键。面对…...

如何高效配置Diva Mod Manager:初音未来MOD管理完整操作指南

如何高效配置Diva Mod Manager&#xff1a;初音未来MOD管理完整操作指南 【免费下载链接】DivaModManager 项目地址: https://gitcode.com/gh_mirrors/di/DivaModManager Diva Mod Manager是一款专为《初音未来&#xff1a;Project Diva Mega Mix》设计的MOD管理工具&a…...