From 3a15b49b05b36aba825545d95391d3019186615f Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Wed, 27 Jun 2018 12:33:19 +0200 Subject: [PATCH] virtio: move queue allocation to backend code Right now both virtio-pci and virtio-user allocate the queue via spdk_dma_malloc, but that's about to change soon. Change-Id: I3acdad45cd9a0639f9070bc448fdf8f9d2c706c0 Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/417000 Tested-by: SPDK Automated Test System Reviewed-by: Pawel Wodkowski Reviewed-by: Jim Harris Reviewed-by: Daniel Verkamp --- lib/virtio/virtio.c | 30 ++++++------------------------ lib/virtio/virtio_pci.c | 12 ++++++++++++ lib/virtio/virtio_user.c | 12 ++++++++++++ 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/lib/virtio/virtio.c b/lib/virtio/virtio.c index 2f5abb1a5..1a9709a90 100644 --- a/lib/virtio/virtio.c +++ b/lib/virtio/virtio.c @@ -116,11 +116,8 @@ virtio_init_vring(struct virtqueue *vq) static int virtio_init_queue(struct virtio_dev *dev, uint16_t vtpci_queue_idx) { - void *queue_mem; unsigned int vq_size, size; - uint64_t queue_mem_phys_addr; struct virtqueue *vq; - int ret; SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "setting up queue: %"PRIu16"\n", vtpci_queue_idx); @@ -164,21 +161,6 @@ virtio_init_queue(struct virtio_dev *dev, uint16_t vtpci_queue_idx) SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "vring_size: %u, rounded_vring_size: %u\n", size, vq->vq_ring_size); - queue_mem = spdk_dma_zmalloc(vq->vq_ring_size, VIRTIO_PCI_VRING_ALIGN, &queue_mem_phys_addr); - if (queue_mem == NULL) { - ret = -ENOMEM; - goto fail_q_alloc; - } - - vq->vq_ring_mem = queue_mem_phys_addr; - vq->vq_ring_virt_mem = queue_mem; - SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "vq->vq_ring_mem: 0x%" PRIx64 "\n", - vq->vq_ring_mem); - SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "vq->vq_ring_virt_mem: 0x%" PRIx64 "\n", - (uint64_t)(uintptr_t)vq->vq_ring_virt_mem); - - virtio_init_vring(vq); - vq->owner_thread = NULL; if (virtio_dev_backend_ops(dev)->setup_queue(dev, vq) < 0) { @@ -186,12 +168,13 @@ virtio_init_queue(struct virtio_dev *dev, uint16_t vtpci_queue_idx) return -EINVAL; } + SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "vq->vq_ring_mem: 0x%" PRIx64 "\n", + vq->vq_ring_mem); + SPDK_DEBUGLOG(SPDK_LOG_VIRTIO_DEV, "vq->vq_ring_virt_mem: 0x%" PRIx64 "\n", + (uint64_t)(uintptr_t)vq->vq_ring_virt_mem); + + virtio_init_vring(vq); return 0; - -fail_q_alloc: - rte_free(vq); - - return ret; } static void @@ -212,7 +195,6 @@ virtio_free_queues(struct virtio_dev *dev) } virtio_dev_backend_ops(dev)->del_queue(dev, vq); - spdk_dma_free(vq->vq_ring_virt_mem); rte_free(vq); dev->vqs[i] = NULL; diff --git a/lib/virtio/virtio_pci.c b/lib/virtio/virtio_pci.c index 090a7b2ee..f73dd2225 100644 --- a/lib/virtio/virtio_pci.c +++ b/lib/virtio/virtio_pci.c @@ -261,6 +261,16 @@ modern_setup_queue(struct virtio_dev *dev, struct virtqueue *vq) struct virtio_hw *hw = dev->ctx; uint64_t desc_addr, avail_addr, used_addr; uint16_t notify_off; + void *queue_mem; + uint64_t queue_mem_phys_addr; + + queue_mem = spdk_dma_zmalloc(vq->vq_ring_size, VIRTIO_PCI_VRING_ALIGN, &queue_mem_phys_addr); + if (queue_mem == NULL) { + return -ENOMEM; + } + + vq->vq_ring_mem = queue_mem_phys_addr; + vq->vq_ring_virt_mem = queue_mem; if (!check_vq_phys_addr_ok(vq)) { return -1; @@ -311,6 +321,8 @@ modern_del_queue(struct virtio_dev *dev, struct virtqueue *vq) &hw->common_cfg->queue_used_hi); spdk_mmio_write_2(&hw->common_cfg->queue_enable, 0); + + spdk_dma_free(vq->vq_ring_virt_mem); } static void diff --git a/lib/virtio/virtio_user.c b/lib/virtio/virtio_user.c index cc1b3a18d..80c6f0c13 100644 --- a/lib/virtio/virtio_user.c +++ b/lib/virtio/virtio_user.c @@ -356,6 +356,8 @@ virtio_user_setup_queue(struct virtio_dev *vdev, struct virtqueue *vq) struct virtio_user_dev *dev = vdev->ctx; struct vhost_vring_state state; uint16_t queue_idx = vq->vq_queue_index; + void *queue_mem; + uint64_t queue_mem_phys_addr; uint64_t desc_addr, avail_addr, used_addr; int callfd; int kickfd; @@ -365,6 +367,14 @@ virtio_user_setup_queue(struct virtio_dev *vdev, struct virtqueue *vq) return -1; } + queue_mem = spdk_dma_zmalloc(vq->vq_ring_size, VIRTIO_PCI_VRING_ALIGN, &queue_mem_phys_addr); + if (queue_mem == NULL) { + return -ENOMEM; + } + + vq->vq_ring_mem = queue_mem_phys_addr; + vq->vq_ring_virt_mem = queue_mem; + /* May use invalid flag, but some backend uses kickfd and * callfd as criteria to judge if dev is alive. so finally we * use real event_fd. @@ -427,6 +437,8 @@ virtio_user_del_queue(struct virtio_dev *vdev, struct virtqueue *vq) close(dev->kickfds[vq->vq_queue_index]); dev->callfds[vq->vq_queue_index] = -1; dev->kickfds[vq->vq_queue_index] = -1; + + spdk_dma_free(vq->vq_ring_virt_mem); } static void