0.前言
内核版本:4.19
文档目的: 主要以null_dev为例来研究多队列的工作机制, 为了能够凸显多队列的工作流程。
本文主要罗列了null blk dev设备以及与之关联的多队列的基本数据结构之间的关联,并做简要说明。
2.主要数据结构
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集合描述符,每个cpu core一个blk_mq_tags结构体, 每个blk_mq_tags是通过bitmap来描述,每个bit代表一个tag。
mq_map中保存了软硬件队列之间的映射关系;
numa_node相关的bitmap将从哪个node分配。
struct blk_mq_tags
用于tag空间管理
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 backing_dev_info
blk_stat_callback
每个request_queue队列都有一个blk_stat_callback与之对应,会通过定时器回调函数来定时统计request状态