Commit 3a15b49b authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

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: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/417000


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent e724452e
Loading
Loading
Loading
Loading
+5 −23
Original line number Diff line number Diff line
@@ -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,34 +161,20 @@ 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->owner_thread = NULL;

	if (virtio_dev_backend_ops(dev)->setup_queue(dev, vq) < 0) {
		SPDK_ERRLOG("setup_queue failed\n");
		return -EINVAL;
	}

	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) {
		SPDK_ERRLOG("setup_queue failed\n");
		return -EINVAL;
	}

	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;
+12 −0
Original line number Diff line number Diff line
@@ -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
+12 −0
Original line number Diff line number Diff line
@@ -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