From fba3b39900af52e695d59bc34f28bb8d22526ddb Mon Sep 17 00:00:00 2001 From: Ladi Prosek Date: Fri, 16 Dec 2016 14:07:08 +0100 Subject: [virtio] Remove queue size limit in legacy virtio Virtio 0.9 implementation was limited to the maximum virtqueue size of MAX_QUEUE_NUM and the virtio-net driver would fail to initialize on hosts exceeding this limit. This commit lifts the restriction by allocating the queue memory based on the actual queue size instead of using a fixed maximum. Note that virtio 1.0 still uses the MAX_QUEUE_NUM constant to cap the size (unfortunately this functionality is not available in virtio 0.9). Signed-off-by: Ladi Prosek Acked-by: Michael S. Tsirkin Reviewed-by: Stefan Hajnoczi Signed-off-by: Michael Brown --- src/include/ipxe/virtio-pci.h | 2 ++ src/include/ipxe/virtio-ring.h | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/include') diff --git a/src/include/ipxe/virtio-pci.h b/src/include/ipxe/virtio-pci.h index f3c9b17ca..f3074f14d 100644 --- a/src/include/ipxe/virtio-pci.h +++ b/src/include/ipxe/virtio-pci.h @@ -196,9 +196,11 @@ static inline void vp_del_vq(unsigned int ioaddr, int queue_index) struct vring_virtqueue; +void vp_free_vq(struct vring_virtqueue *vq); int vp_find_vq(unsigned int ioaddr, int queue_index, struct vring_virtqueue *vq); + /* Virtio 1.0 I/O routines abstract away the three possible HW access * mechanisms - memory, port I/O, and PCI cfg space access. Also built-in * are endianness conversions - to LE on write and from LE on read. */ diff --git a/src/include/ipxe/virtio-ring.h b/src/include/ipxe/virtio-ring.h index d2ded3007..e608e624f 100644 --- a/src/include/ipxe/virtio-ring.h +++ b/src/include/ipxe/virtio-ring.h @@ -71,14 +71,12 @@ struct vring { + PAGE_MASK) & ~PAGE_MASK) + \ (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num)) -typedef unsigned char virtio_queue_t[PAGE_MASK + vring_size(MAX_QUEUE_NUM)]; - struct vring_virtqueue { - virtio_queue_t queue; + unsigned char *queue; struct vring vring; u16 free_head; u16 last_used_idx; - void *vdata[MAX_QUEUE_NUM]; + void **vdata; /* PCI */ int queue_index; struct virtio_pci_region notification; -- cgit v1.2.3-55-g7522