请求队列是由struct request_queue表示的,每一个gendisk对象都有一个request_queue对象,保存对该gendisk对象的所有请求。定义在include/linux/blkdev.h: View Code 其部分参数含义如下: queue_head:通过list_head可以用来构建一个request_queue类型的双向链表; make_request_fn:设置bio提交时的回调函数,一般设置为blk_...
它有两个函数,一个是 make_request_fn 函数,用于生成 request;另一个是 request_fn 函数,用于处理 request。 这个request_queue 的初始化过程在 blk_mq_init_queue 中。它会调用 blk_mq_init_allocated_queue->blk_queue_make_request。在这里面,我们可以将 make_request_fn 函数设置为 blk_mq_make_request,...
blk_mq_alloc_tag_set: 为一个或者多个请求队列分配tag和request集合(tag set可以是多个request queue共享的,例如UFS设备,一个host controller只有一个tag set,但器件可能划分成多个LU--Logical Unit,每个LU有单独的request queue, 这些不同的request queue共享一个tag set),主要流程如下: 设置硬件队列数量(nr_hw_...
Expand DownExpand Up@@ -1186,7 +1186,6 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio) intret; blk_mq_bio_to_request(rq,bio); blk_mq_start_request(rq); /* * For OK queue, we are done. For error, kill it. Any other ...
void blk_requeue_request(struct request_queue *q, struct request *rq) { blk_delete_timer(rq); blk_clear_rq_complete(rq); trace_block_rq_requeue(q, rq); if (rq->cmd_flags & REQ_QUEUED) blk_queue_end_tag(q, rq); BUG_ON(blk_queued_rq(rq)); ...
13. __elv_add_request 1. __blk_run_queue 1. void __blk_run_queue(struct request_queue *q) { if (unlikely(blk_queue_stopped(q))) return; __blk_run_queue_uncond(q); inline void __blk_run_queue_uncond(struct request_queue *q) ...
调度算法发挥作用的地方 } 整个调用完成之后,会绑定当前块设备的request_queue两个重要方法 q->make_request_fn = blk_queue_bio;//linux默认实现 q-...request_queue *q, struct bio *bio) submit_bio会调用make_request_fn将bio封装成request插入到request_queue,默认会使用linux...系统实现的blk_queue_bio...
So, looking back at the virtio_blk_cmd() function, it should make a lot more sense. We allocate that virtio_blk_req structure, and fill out the request type and sector. Then, we create three descriptors (virtio_alloc_desc() uses that desc_free variable along with the next pointers to...
void blk_insert_flush(struct request *rq) { struct request_queue *q = rq->q;unsigned long fflags = q->queue_flags; /* may change, cache */ @@ -409,7 +409,7 @@ bool blk_insert_flush(struct request *rq) */ if (!policy) { blk_mq_end_request(rq, 0); ...
可以直接执行make 命令。 PS:需要安装libaio-dev包。 1.1.3blktrace原理即io栈 一个I/O请求进入block layer之后,会经历下面的过程: l ÂRemap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备 l ÂSplit: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(...