blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) { struct request_queue *uninit_q, *q; uninit_q = blk_alloc_queue_node(GFP_KERNEL, node_id); if (!uninit_q) return NULL; q = blk_init_allocated_queue(uninit_q, rfn, lock); if (!q) blk_cleanup_queue...
blk_mq_init_queue:初始化IO请求队列--request_queue。函数的主要流程如下: 调用blk_alloc_queue_node分配请求队列的内存,分配的内存节点与设备连接的NUMA节点一致,避免远端内存访问问题。 调用blk_mq_init_allocated_queue初始化分配的请求队列(request_queue),blk-mq的request_queue中包含两层队列,即percpu的软件...
blk_sync_queue(q); blk_mq_cancel_work_sync(q); blk_mq_exit_queue(q);/* @q is and will stay empty, shutdown and put */ blk_put_queue(q); } EXPORT_SYMBOL(blk_mq_destroy_queue);@@ -4029,6 +4026,7 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, vo...
struct device_node *root; for (offset = 0;offset >= 0 && depth >= initial_depth;offset = fdt_next_node(blob, offset, &depth)) populate_node(blob, offset, &mem, nps[depth],&nps[depth+1], dryrun)) pathp = fdt_get_name(blob, offset, &l); np = unflatten_dt_alloc(mem, size...
vblk->disk = alloc_disk(1 << PART_BITS); memset(&vblk->tag_set, 0, sizeof(vblk->tag_set)); vblk->tag_set.ops = &virtio_mq_ops; vblk->tag_set.queue_depth = virtblk_queue_depth; vblk->tag_set.numa_node = NUMA_NO_NODE; ...
if(blk_queue_enter(q,flags)<0) enter_succeeded=false; } Expand Down 3 changes: 1 addition & 2 deletions3block/blk-mq.c Original file line numberDiff line numberDiff line change Expand Up@@ -405,8 +405,7 @@ struct request *blk_mq_alloc_request(struct request_queue *q, unsi...
struct blk_mq_tag_set *set, struct request_queue *q, int hctx_idx, int node) { - struct blk_mq_hw_ctx *hctx; + struct blk_mq_hw_ctx *hctx = NULL, *tmp; - hctx = blk_mq_alloc_hctx(q, set, hctx_idx, node);
$ qemu-storage-daemon--blockdev file,filename=test.qcow2,node-name=file \--blockdev qcow2,file=file,node-name=qcow2 \--exportvduse-blk,id=vduse0,name=vduse0,num-queues=1,node-name=qcow2,writable=on instantiate the`vduse0`device(same name usedinQSD)$ vdpa dev add name vduse0 mg...
static inline void __blk_get_queue(struct request_queue *q) { kobject_get(&q->kobj); } bool is_flush_rq(struct request *req); struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size, gfp_t flags); void blk_free_flush_queue(struct blk_flush_queue *q); ...
(reschedule) vdpasim_schedule_work simdev = vdpasim_create(&dev_attr, config) ops = &vdpasim_batch_config_ops or ops = &vdpasim_config_ops vdpa = __vdpa_alloc_device(NULL, ops, dev_attr->ngroups, dev_attr->nas, dev_attr->alloc_size, dev_attr->name, use_va) -> allocate and...