调用blk_mq_rq_ctx_init 初始化tag对应的request(tags->static_rqs[tag]) 图8. blk-mq bio提交时request分配流程 request_queue初始化 基于blk-mq的块设备驱动初始化时,通过调用blk_mq_init_queue初始化IO请求队列(request_queue)。例如,scsi-mq驱动中,每次添加scsi设备(scsi_device)时都会调用blk_mq_init_qu...
* especially blk_mq_rq_ctx_init() to take care of the added fields.*/structrequest {structrequest_queue *q;structblk_mq_ctx *mq_ctx;structblk_mq_hw_ctx *mq_hctx; unsignedintcmd_flags;/*op and common flags*/req_flags_t rq_flags;intinternal_tag;/*the following two fields are inter...
第一个成员queue_rq指定blk-mq向驱动提交request的函数,第二个map_queue定义如何将software queue和hardware queue对应,第三个init_hctx是hardware Queue创建时调用(可以在这里将NVMe Queue与Hardware Queue绑定),init_request是在分配Request时调用,timeout是发生timeout时的调用。这些函数都是供blk-mq使用的。 blk-m...
rq->timeout = 0; @@ -386,14 +386,13 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, WRITE_ONCE(rq->deadline, 0); req_ref_set(rq, 1); if (rq->rq_flags & RQF_ELV) { if (rq->rq_flags & RQF_USE_SCHED) { struct elevator_queue *e = dat...
第一步blk_mq_flush_busy_ctxs会先把ctx里面的rq全部摘下来放到临时变量rq_list, 核心函数: static bool flush_busy_ctx(struct sbitmap *sb, unsigned int bitnr, void *data) { ... spin_lock(&ctx->lock); list_splice_tail_init(&ctx->rq_lists[type], flush_data->list); sbitmap_clear_bi...
@@ -2220,16 +2221,11 @@ static void blk_mq_init_cpu_queues(struct request_queue *q, INIT_LIST_HEAD(&__ctx->rq_list); __ctx->queue = q;/* If the cpu isn't present, the cpu is mapped to first hctx */ if (!cpu_present(i)) ...
BUG: unable to handle kernel NULL pointer dereference at 00000000000000d0 IP: [<ffffffff86d5f628>] blk_mq_rq_timed_out+0x18/0xa0 PGD 8000000035eae067 PUD 0 Oops: 0000 [#1] SMP CPU: 2 PID: 1041 Comm: kworker/2:1H Kdump: loaded Tainted: P OE --- 3.10.0-1127.19.1.el7.x86_64 #...
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...
1、函数是一个可以多次使用的功能代码块,一个封闭的(空间),它可以在代码里随意调用。利用函数的封装...
blk_mq_freeze_queue_wait_timeout blk_mq_init_queue blk_mq_init_sq_queue blk_mq_map_queues blk_mq_pci_map_queues blk_mq_quiesce_queue blk_mq_request_completed blk_mq_requeue_request blk_mq_rq_cpu blk_mq_run_hw_queues blk_mq_start_request blk_mq_start_stopped_hw_que...