본문 바로가기

리눅스 커널/블록 멀티 큐

(16)
nvme command 관련 추가 내용 struct nvme_dev { u32 __iomem *dbs; struct dma_pool *prp_page_pool; struct dma_pool *prp_small_pool; u32 db_stride; void __iomem *bar; void __iomem *cmb; pci_bus_addr_t cmb_bus_addr; /* shadow doorbell buffer support: */ u32 *dbbuf_dbs; dma_addr_t dbbuf_dbs_dma_addr; u32 *dbbuf_eis; dma_addr_t dbbuf_eis_dma_addr; /* host memory buffer support: */ u64 host_mem_size; u32 nr_host_mem_descs; dma_add..
nvme command i/o completion queue 만들기 Queue size : CQ내에 entry 개수. 2Bytes Queue Identifier : CQ의 id. 2Bytes Interrupt Vector : MSI-X 또는 MSI vector 번호. 2Bytes IEN : Interrupt Enable, 1 == enable. 1bit PC : Physically Contiguous, 1 == SQ는 물리적으로 호스트 메모리에서 연속적이다. 1bit PRP Entry 1 : 물리적으로 연속적이지 않을 때, 호스트 페이지를 포함하는 PRP list에 포인터이다. 8Bytes enum nvme_admin_opcode { nvme_admin_delete_sq= 0x00, nvme_admin_create_sq= 0x..
nvme_setup_io_queues 흐름 nvme_setup_io_queues(struct nvme_dev * dev) from nvme_reset_work ->struct nvme_queue * adminq = dev->queues[0]; ->struct pci_dev * pdev = to_pci_dev(dev->dev); ->nr_io_queues = num_present_cpus(); ->result = nvme_set_queue_count(&dev->ctrl, &nr_io_queues) ->pci_free_irq(pdev, 0, adminq); ->pci_free_irq_vectors(pdev); ->pci_disable_msix(dev); ->pci_disable_msi(dev); ->dev->max_qid = nr_io_queues;..
nvme_reset_work 흐름 nvme_reset_work(struct work_struct * work) from nvme_probe ->struct nvme_dev * dev = container_of(work, struct nvme_dev, ctrl.reset_work); ->nvme_pci_configure_admin_queues(dev); ->nvmeq = dev->queues[0]; ->nvmeq = nvme_alloc_queue(...); ->nvmeq = kzalloc_node(sizeof(*nvmeq), GFP_KERNEL, node); ->nvmeq->cqes = dma_zalloc_coherent(...); ->dev->queues[qid] = nvmeq; ->dev->ctrl.queue_count++; ->nvm..
nvme 자료구조 관계 struct nvme_dev queus -> struct nvme_queue * -> [nvme_queue][nvme_queue]...[nvme_queue] tagset - struct blk_mq_tag_set : io를 위한 tag를 관리 admin_tagset - struct blk_mq_tag_set : admin을 위한 tag를 관리 online_queues : 활성화된 큐 개수 max_qid : queues 배열의 마지막 인덱스 q_depth : nvme_queue 하나가 처리할 수 있는 최대 io request 개수 ctrl - struct nvme_ctrl : nvme controller struct nvme_queue dev -> struct nvme_dev q_lock : spinloc..
NVMe 디바이스 드라이버 초기화 흐름 NVMe Device Driver init flow, kernel version 4.13.10 from drivers/nvme/host/pci.c static struct pci_driver nvme_driver = { .name= "nvme", .id_table= nvme_id_table, .probe= nvme_probe, .remove= nvme_remove, .shutdown= nvme_shutdown, .driver= { .pm= &nvme_dev_pm_ops, }, .sriov_configure = nvme_pci_sriov_configure, .err_handler= &nvme_err_handler, }; static int __init nvme_init(void) { return pci_r..