[PATCH v6 RFC] nvme: improve performance for virtual NVMe devices
Keith Busch
keith.busch at intel.com
Thu Mar 30 10:33:24 PDT 2017
On Mon, Mar 27, 2017 at 01:50:08PM -0300, Helen Koike wrote:
> changes since v5:
> - remove anonymous dbbuf struct in struct nvme_dev and struct nvme_queue
> - use inline functions for sq_idx and cq_idx instead of macros
> - add a warning when nvme_dbbuf_set fails
> - remove comment "Borrowed from vring_need_event"
> - change formatting of the parameters in nvme_write_doorbell
> - don't fail nvme_reset_work if nvme_dbbuf_dma_alloc fails
> - remove nvme_write_doorbell_{sq,cq} wrappers
> - in nvme_write_doorbell(), call writel last
I'm pretty much okay with this. The only thing I'd change is to call
nvme_dbbuf_dma_free only when we're unbinding so that we don't have to
reallocate it on a every controller reset:
> +static int nvme_dbbuf_dma_alloc(struct nvme_dev *dev)
> +{
> + unsigned int mem_size = nvme_dbbuf_size(dev->db_stride);
if (dev->dbbuf_dbs)
return 0;
> +
> + dev->dbbuf_dbs = dma_alloc_coherent(dev->dev, mem_size,
> + &dev->dbbuf_dbs_dma_addr,
> + GFP_KERNEL);
> + if (!dev->dbbuf_dbs)
> + return -ENOMEM;
> + dev->dbbuf_eis = dma_alloc_coherent(dev->dev, mem_size,
> + &dev->dbbuf_eis_dma_addr,
> + GFP_KERNEL);
> + if (!dev->dbbuf_eis) {
> + dma_free_coherent(dev->dev, mem_size,
> + dev->dbbuf_dbs, dev->dbbuf_dbs_dma_addr);
> + dev->dbbuf_dbs = NULL;
> + return -ENOMEM;
> + }
> +
> + return 0;
> +}
> @@ -1066,6 +1187,7 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
> nvmeq->q_depth = depth;
> nvmeq->qid = qid;
> nvmeq->cq_vector = -1;
> + nvme_dbbuf_init(dev, nvmeq, qid);
> dev->queues[qid] = nvmeq;
> dev->queue_count++;
Remove the above since it's duplicated in nvme_init_queue.
> @@ -1700,6 +1825,7 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
> nvme_disable_admin_queue(dev, shutdown);
> }
> nvme_pci_disable(dev);
> + nvme_dbbuf_dma_free(dev);
And move this to nvme_pci_free_ctrl().
More information about the Linux-nvme
mailing list