BLOCK层代码分析(10)IO下发之IO下发函数总结
BLOCK层IO下发涉及直接下发,调度器,没有设置调度类型以及plug/unplug等,因此下发函数纷繁复杂,这里做介绍几个主要的函数。
前面介绍了函数blk_mq_try_issue_directly()和blk_mq_sched_insert_request(),以及最终调用的函数blk_mq_run_hw_queue()。这里再对blk_mq_run_hw_queue()进一步细化所涉及的下发函数做介绍(见BLOCK层代码分析(9)IO下发之IO下发)。
(1)函数blk_mq_dispatch_rq_list(&rq_list)
bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,unsigned int nr_budgets)
执行rq_list中的request(属于同一个hctx),若资源不足时没有执行完成时返回true,否则执行完成返回false;
(2)函数blk_mq_do_dispatch_sched(hctx)
static int blk_mq_do_dispatch_sched(struct blk_mq_hw_ctx *hctx)
从调度器中取出max_dispatch个IO,若属于多个hctx,根据hctx idx排序下发;否则blk_rq_dispatch_rq_list()直接下发。
(3)函数blk_mq_do_dispatch_ctx(hctx)
static int blk_mq_do_dispatch_ctx(struct blk_mq_hw_ctx *hctx)
一般硬件队列hctx对应多个ctx,该函数依次轮流(RR)从多个ctx中取IO发送,最后仍是通过blk_rq_dispatch_rq_list下发。
它们之间调用如下:
BLOCK层代码分析(10)IO下发之IO下发函数总结相关推荐
- BLOCK层代码分析(9)IO下发之IO下发
看着题目是不是很奇怪,想不出好的名字,就这样将就吧. 前面bio bounce过程,bio的切分和合并,request的获取是为IO请求下发做准备工作.当这些准备工作完成后,才进入到真正的IO下发过程 ...
- BLOCK层代码分析(8)IO下发之plug/unplug机制
前面bio bounce过程,bio的切分和合并,request的获取是为IO请求下发做准备工作.当这些准备工作完成后,才进入到真正的IO下发过程.之前在前面章节中介绍过,IO下发基本上有三条路径:经 ...
- BLOCK层代码分析(1)数据的组织BIO
对于BLOCK层,表示一个IO的数据结构为BIO和request.对于request在后续的章节中做介绍,这里只介绍与BIO相关的结构体. 1. bio/bio_vec结构体 bio结构体用于表示数据 ...
- BLOCK层代码分析(6)IO下发之SGL聚散列表
原本计划本节介绍request的分配,发现会涉及到数据组织从bio到sgl的映射,因此本节介绍数据的SGL组织方式. 在BLOCK层数据的组织形式为bio和request,通过这两个结构体就可以找到数 ...
- BLOCK层代码分析(5)IO下发之BIO bounce过程
若bio中存在数据处于高端内存时,外设无法在此高端内存上执行DMA,这里需要创建反弹缓冲区,将处于高端内存的缓存区和反弹缓冲区之间进行数据的复制.此过程称为bounce过程.但对于大部分驱动来説,并不 ...
- 三:Sensor SLPI层代码分析---
三:Sensor SLPI层代码分析 在学习SLPI侧代码前我们先了解下SEE的registry&config. registry 放在/persist/sensors/registry/re ...
- perf-perf stat用户层代码分析
perf_event 源码分析 前言 简单来说,perf是一种性能监测工具,它首先对通用处理器提供的performance counter进行编程,设定计数器阈值和事件,然后性能计数器就会在设定事件发 ...
- 四--RIL层代码分析--整个电话来访过程
最近公司开发一个几百万的项目,要求重写系统RIL层,看了几个招聘信息,只要你会RIL层开发的,工资上w每个月不是梦,这是几天研究的成果,希望对大家有所帮助,兄弟们加油吧! 先来一个总的流程图: 拨出电 ...
- RIL层代码分析--拨号整个流程
拨出电话流程: 1 在系统源码这个路径下/packages/apps/Phone/src/com/android/phone/DialtactsActivity.java contacts的andro ...
最新文章
- 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | ClassLoader#loadClass 函数分析 | BaseDexClassLoader#findClass 分析 )
- pyghon list指定位置插入字符的方法
- 【Linux】一步一步学Linux——bg命令(131)
- kafka 集群启动失败:FATAL [KafkaServer id=0] Fatal error during KafkaServer startup.
- 模板:拉格朗日插值(多项式)
- spring+hibernate+Struts2 整合(全注解及注意事项)
- Tekton基础概念介绍
- Hibernate入门案例及增删改查
- Android Studio 2.0来啦
- PHP经验——获得PHP版本信息及版本比较
- java中用Executor代替Thread的四大理由
- testbench文件显示波形_十大基本功之testbench
- 酷派android4.4.4到5.0,酷派大神F1电信版升级安卓5.0刷机教程[多图]
- UnityHub 安装失败
- 时间管理—重要紧急四象限法则
- Chaotica for Mac(分形艺术作品创作工具)
- golang runtime.Caller 学习笔记
- 逻辑漏洞之无密码登录(vlcms)
- 回顾1024长沙程序员节的收获
- AXURE手机版注册登录原型(下载+教学)