主要流程
request_queue初始化
块设备初始化时通过blk_mq_init_queue()创建request_queue并初始化,主要功能包含:
- request_queue与块设备的blk_mq_tag_set相互绑定,根据blk_mq_tag_set设置一些参数。
- 创建软硬件队列及进行绑定。
- 设置io请求入口函数make_request_fn 为 blk_mq_make_request()。
IO提交/转换request
IO请求的入口为blk_mq_make_request(),其中首先判断IO是否可以跟其他request合并,若无法合并再将IO转换为request进一步处理。
request获取
request是事先在硬件队列的tags或者sched_tags中分配好的,通过blk_mq_get_request()获取,期间有可能会因获取不到request而被io_schedule,进入iowait状态。(扩展阅读IOwait 到底在wait什么)