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下发。
它们之间调用如下:



