Skip to content

Commit

Permalink
virtio: prepare for creation of split or packed ring
Browse files Browse the repository at this point in the history
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
  • Loading branch information
ybendito authored and YanVugenfirer committed Dec 31, 2019
1 parent 9c0e01d commit 2d23ce4
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion VirtIO/VirtIOPCILegacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ static NTSTATUS vio_legacy_setup_vq(struct virtqueue **queue,
vdev->addr + VIRTIO_PCI_QUEUE_PFN);

/* create the vring */
vq = vring_new_virtqueue(index, info->num,
vq = vring_new_virtqueue_split(index, info->num,
VIRTIO_PCI_VRING_ALIGN, vdev,
info->queue, vp_notify,
(u8 *)info->queue + ROUND_TO_PAGES(vring_size(info->num, VIRTIO_PCI_VRING_ALIGN, false)));
Expand Down
23 changes: 15 additions & 8 deletions VirtIO/VirtIOPCIModern.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,10 @@ static u16 vio_modern_set_queue_vector(struct virtqueue *vq, u16 vector)
return ioread16(vdev, &cfg->queue_msix_vector);
}

static size_t vring_pci_size(u16 num)
static size_t vring_pci_size(u16 num, bool packed)
{
/* We only need a cacheline separation. */
return (size_t)ROUND_TO_PAGES(vring_size(num, SMP_CACHE_BYTES, false));
return (size_t)ROUND_TO_PAGES(vring_size(num, SMP_CACHE_BYTES, packed));
}

static NTSTATUS vio_modern_query_vq_alloc(VirtIODevice *vdev,
Expand Down Expand Up @@ -274,8 +274,8 @@ static NTSTATUS vio_modern_query_vq_alloc(VirtIODevice *vdev,
}

*pNumEntries = num;
*pRingSize = (unsigned long)vring_pci_size(num);
*pHeapSize = vring_control_block_size(num, false);
*pRingSize = (unsigned long)vring_pci_size(num, vdev->packed_ring);
*pHeapSize = vring_control_block_size(num, vdev->packed_ring);

return STATUS_SUCCESS;
}
Expand Down Expand Up @@ -303,7 +303,7 @@ static NTSTATUS vio_modern_setup_vq(struct virtqueue **queue,
off = ioread16(vdev, &cfg->queue_notify_off);

/* try to allocate contiguous pages, scale down on failure */
while (!(info->queue = mem_alloc_contiguous_pages(vdev, vring_pci_size(info->num)))) {
while (!(info->queue = mem_alloc_contiguous_pages(vdev, vring_pci_size(info->num, vdev->packed_ring)))) {
if (info->num > 0) {
info->num /= 2;
} else {
Expand All @@ -317,9 +317,16 @@ static NTSTATUS vio_modern_setup_vq(struct virtqueue **queue,
}

/* create the vring */
vq = vring_new_virtqueue(index, info->num,
SMP_CACHE_BYTES, vdev,
info->queue, vp_notify, vq_addr);
if (vdev->packed_ring) {
vq = vring_new_virtqueue_packed(index, info->num,
SMP_CACHE_BYTES, vdev,
info->queue, vp_notify, vq_addr);
} else {
vq = vring_new_virtqueue_split(index, info->num,
SMP_CACHE_BYTES, vdev,
info->queue, vp_notify, vq_addr);
}

if (!vq) {
status = STATUS_INSUFFICIENT_RESOURCES;
goto err_new_queue;
Expand Down
4 changes: 2 additions & 2 deletions VirtIO/VirtIORing.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ static void virtqueue_shutdown_split(struct virtqueue *_vq)
unsigned int vring_align = _vq->vdev->addr ? PAGE_SIZE : SMP_CACHE_BYTES;

RtlZeroMemory(pages, vring_size_split(num, vring_align));
(void)vring_new_virtqueue(
(void)vring_new_virtqueue_split(
_vq->index,
vq->vring.num,
vring_align,
Expand Down Expand Up @@ -483,7 +483,7 @@ unsigned int vring_control_block_size(u16 qsize, bool packed)
}

/* Initializes a new virtqueue using already allocated memory */
struct virtqueue *vring_new_virtqueue(
struct virtqueue *vring_new_virtqueue_split(
unsigned int index, /* virtqueue index */
unsigned int num, /* virtqueue size (always a power of 2) */
unsigned int vring_align, /* vring alignment requirement */
Expand Down
10 changes: 9 additions & 1 deletion VirtIO/windows/virtio_ring_allocation.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
#ifndef _VIRTIO_RING_ALLOCATION_H
#define _VIRTIO_RING_ALLOCATION_H

struct virtqueue *vring_new_virtqueue(unsigned int index,
struct virtqueue *vring_new_virtqueue_split(unsigned int index,
unsigned int num,
unsigned int vring_align,
VirtIODevice *vdev,
void *pages,
void (*notify)(struct virtqueue *),
void *control);

struct virtqueue *vring_new_virtqueue_packed(unsigned int index,
unsigned int num,
unsigned int vring_align,
VirtIODevice *vdev,
Expand Down

0 comments on commit 2d23ce4

Please sign in to comment.