nullb driver分析1-基本数据结构说明

本文以nullblkdev设备为例,详细介绍了Linux内核4.19版本中多队列的工作机制。通过分析nullblock设备数据描述符nullb及相关数据结构,如blk_mq_tag_set、blk_mq_tags等,阐述了多队列的硬件队列描述符、命令描述符等关键概念。

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看上去都是暂存请求,有什么区别?

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值