1.设置队列的mq_ops(q->mq_ops)为set->ops (例如scsi对应的实现是scsi_mq_ops) 2.设置request超时时间,初始化timeout_work(处理函数是blk_mq_timeout_work) 3.设置队列的make_request回调为blk_mq_make_request (bio的提交时会用到) 4.分配和初始化percpu软件队列(ctx) 5.关联request_queue和块设备的t...
具体是放在链表头,还是链表尾取决于磁盘的相对位置;如果不行再变成request,然后放到plug list中;然后在等待特定时机释放plug list中的request到I/O调度器,这样可以提高bio处理的效率(如果没有plug,那么每个进程在将request放到请求队列时就会竞争request_queue的锁,有个plug list之后,就可以等到当前进程堆积到一定量的re...
blk_queue_max_segments(mq->queue, host->max_segs); blk_queue_max_segment_size(mq->queue, host->max_seg_size); INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler); INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work); mutex_init(&mq->complete_lock); init_waitqueue_head(&...
这个request_queue 的初始化过程在 blk_mq_init_queue 中。它会调用 blk_mq_init_allocated_queue->blk_queue_make_request。在这里面,我们可以将 make_request_fn 函数设置为 blk_mq_make_request,也就是说,一旦上层有写入请求,我们就通过 blk_mq_make_request 这个函数,将请求放入 request_queue 队列中。 ...
voidmmc_cleanup_queue(struct mmc_queue *mq){structrequest_queue*q=mq->queue;unsignedlongflags;/* Mark that we should start throwing out stragglers */spin_lock_irqsave(q->queue_lock, flags); q->queuedata =NULL; spin_unlock_irqrestore(q->queue_lock, flags);/* Make sure the queue isn'...
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 ...
Mark flush request as IDLE in its .end_io(), aligning it with how normal requests behave. The flush request stays in in-flight tags if we're not using an IO scheduler, so we need to change its state into IDLE. Otherwise, we will hang in blk_mq_tagset_wait_completed_request() durin...
> blk_mq_sched_insert_requests() > insert requests to sw queue or scheduler queue > blk_mq_run_hw_queue > > Because of concurrent run queue, all requests inserted above may be > completed before calling the above blk_mq_run_hw_queue. Then queue can ...
System crash in blk_mq_free_request() following NVMe controller reset due to NULL mq_hctx. Example 1: Raw nvme nvme0: I/O 71 QID 1 timeout, aborting nvme nvme0: Abort status: 0x0 nvme nvme0: I/O 71 QID 1 timeout, reset controller nvme nvme0: 2/0/0 default/read/poll queues...
blk_mq_.. wb_wor.. vfs_read sc.. xf.. wb_writ.. xfs_d.. __writ.. worker_.. kworker.. wait_on_page_bit_killable xf.. xf.. __vfs_read wa.. xf.. xfs_file_read_iter sys_read xfs_vm_.. fi.. blk_m.. blk_m.. bit_wait_io submit_.. writeb.. xf.. xf.. finish_...