nvme_setup_host_mem(dev); } result = nvme_setup_io_queues(dev); if (result) goto out; /* * Keep the controller around but remove all namespaces if we don't have * any working I/O queue. */ if (dev->online_queues
dma_addr_t dbbuf_eis_dma_addr; /* host memory buffer support: */ u64 host_mem_size; u32 nr_host_mem_descs; dma_addr_t host_mem_descs_dma; structnvme_host_mem_buf_desc *host_mem_descs; void**host_mem_desc_bufs; }; 每个设备至少两个队列,一个是admin管理命令,一个是给I/O命令...
/* host memory buffer support: */ u64 host_mem_size; u32 nr_host_mem_descs; dma_addr_t host_mem_descs_dma; structnvme_host_mem_buf_desc *host_mem_descs; void**host_mem_desc_bufs; }; 每个设备至少两个队列,一个是admin管理命令,一个是给I/O命令,这个队列概念和之前介绍块驱动中的磁...
data ib_dma_mapping_error ib_dma_sync_single_for_cpu nvme_setup_cmd nvme_start_request(rq) nvme_rdma_map_data ib_dma_sync_single_for_device nvme_rdma_post_send <- drivers/nvme/host/rdma.c ib_post_send nvmf_rdma_request_process ... do -> loop switch (rdma_req->state) case RDMA_...
Following condition which will cause NULL pointer dereference will occur in nvme_free_host_mem() when it tries to remove pci device via nvme_remove() especially after a failure of host memory allocation for HMB. "(host_mem_descs == NULL) && (nr_host_mem_descs != 0)" It's because ...
nvme_rdma_setup_ctrl ... INIT_WORK(&ctrl->ctrl.reset_work, nvme_rdma_reset_ctrl_work) nvme_init_ctrl -> 初始化nvme控制器, 初始化 NVMe 控制器结构。 这需要在最早的初始化期间调用,以便我们在探测期间拥有初始化的结构, nvme:将 chardev 和 sysfs 接口移至通用代码为此,我们需要添加适当的控制器初...
data ib_dma_mapping_error ib_dma_sync_single_for_cpu nvme_setup_cmd nvme_start_request(rq) nvme_rdma_map_data ib_dma_sync_single_for_device nvme_rdma_post_send <- drivers/nvme/host/rdma.c wr.opcode = IB_WR_SEND -> 发送端产生发送完成事件: IBV_WC_SEND, 接收端产生接收完成事件: IBV...
8、使用nvme_setup_host_mem在主机端分配DMA内存,用于设备的DMA操作,并通过nvme_admin_set_features 0x09这个命令设置给nvme设备。 9、nvme_setup_io_queues设置io queue: 1、首先会获取系统cpu个数,然后通过set feature命令去设置queue个数为cpu个数,然后根据命令的返回值去决定最终的queue个数; ...
Nvme_setup_prp_pools用来创建dma时所用的内存池,prp_page_pool是虚拟内核地址, static int nvme_setup_prp_pools(structnvme_dev *dev) { structdevice*dmadev = &dev->pci_dev->dev; dev->prp_page_pool =dma_pool_create("prp listpage", dmadev, ...
}/*初始化nvme的io queue,此为nvme_queue,一个nvme设备至少一个admin queue,一个io queue*/result=nvme_setup_io_queues(dev);if(result && result != -EBUSY)gotodisable;returnresult; disable: nvme_disable_queue(dev,0); nvme_dev_list_remove(dev); ...