Skip to content

Commit

Permalink
virtio: move queue allocation to backend code
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-on: https://review.gerrithub.io/417000
Tested-by: SPDK Automated Test System <[email protected]>
Reviewed-by: Pawel Wodkowski <[email protected]>
Reviewed-by: Jim Harris <[email protected]>
Reviewed-by: Daniel Verkamp <[email protected]>
  • Loading branch information
darsto authored and jimharris committed Jul 6, 2018
1 parent e724452 commit 3a15b49
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 23 deletions.
28 changes: 5 additions & 23 deletions lib/virtio/virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down
12 changes: 12 additions & 0 deletions lib/virtio/virtio_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions lib/virtio/virtio_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3a15b49

Please sign in to comment.