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