0.前言
内核版本:4.19
文档目的: 主要以null_dev为例来研究多队列的工作机制, 为了能够凸显多队列的工作流程。
本文主要罗列了null blk dev设备以及与之关联的多队列的基本数据结构之间的关联,并做简要说明。
1.主要数据结构

- struct nullb
null block设备数据描述符,它与request_queue关联,nullb->q->queuedata被初始化为nullb
其中list用于链入null block链表的连接件
- struct nullb_device
null block设备描述符
- struct nullb_queue
null block硬件队列描述符
- struct nullb_cmd
null block命令描述符
- struct blk_mq_tag_set
tag集合描述符,每个硬队列一个blk_mq_tags结构体,保存在set->tags[hctx_idx]中, 每个blk_mq_tags是通过bitmap_tags来描述,每个bit代表一个tag;
mq_map中保存了软硬件队列之间的映射关系;
numa_node相关的bitmap将从哪个node分配。
- struct blk_mq_tags
用于tag空间管理。tags中包含了对request及payload的分配, page_list就是用于链接分配出的page;
- struct request_queue
request_queue为nullb的派发队列,在null_init->null_add_dev->blk_mq_init_queue时创建,通过nullb->q来指向它。
bio_split是队列的bio池描述符,用来分配bio和bio_vec;
poll_cb为用于统计的回调函数;
mq_map即为blk_mq_tag_set->mq_map,它在null_init_tag_set时分配,保存了软硬件队列的映射关系;
nr_requests表示软队列的个数;
- struct blk_mq_hw_ctx
硬队列描述符;
tags用来保存硬队列本身所具有的blk_mq_tags
sched_tags用来保存硬队列所对应的调度队列的blk_mq_tags
- struct backing_dev_info
- blk_stat_callback
每个request_queue队列都有一个blk_stat_callback与之对应,会通过定时器回调函数来定时统计request状态
- struct elevator_queue
通用调度队列描述符,每个request_queue,都有一个struct elevator_queue与之对应。其中hash为哈希表,用于快速查找队列中的request。
- struct elevator_type
具体调度队列描述符,如mq-deadline调度器等
- struct deadline_data
blk mq deadline调度器私有数据描述符。dispatch和fifo_list看上去都是暂存请求,有什么区别?
本文以nullblkdev设备为例,详细介绍了Linux内核4.19版本中多队列的工作机制。通过分析nullblock设备数据描述符nullb及相关数据结构,如blk_mq_tag_set、blk_mq_tags等,阐述了多队列的硬件队列描述符、命令描述符等关键概念。

2492

被折叠的 条评论
为什么被折叠?



