]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[virtio] Cap queue size to MAX_QUEUE_NUM
authorLadi Prosek <lprosek@redhat.com>
Fri, 16 Dec 2016 09:54:32 +0000 (10:54 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sun, 22 Jan 2017 13:18:28 +0000 (13:18 +0000)
vpm_find_vqs incorrectly accepted the host provided queue size with no
regard to iPXE's internal limitations. Virtio 1.0 makes it possible for
the driver to override the queue size to reduce memory requirements and
iPXE is a great use case for this feature.

Also removing the extra vq->vring.num assignment which is already
handled in vring_init.

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/bus/virtio-pci.c
src/include/ipxe/virtio-ring.h

index 3311595fb2ad20b374698dbac69648d48d581539..1fcf9bae0ec5fa9dc0e8b078d83e0cf94382ee19 100644 (file)
@@ -358,12 +358,18 @@ int vpm_find_vqs(struct virtio_pci_modern_device *vdev,
             return -EINVAL;
         }
 
+        if (size > MAX_QUEUE_NUM) {
+            /* iPXE networking tends to be not perf critical so there's no
+             * need to accept large queue sizes.
+             */
+            size = MAX_QUEUE_NUM;
+        }
+
         vq = &vqs[i];
         vq->queue_index = i;
 
         /* get offset of notification word for this vq */
         off = vpm_ioread16(vdev, &vdev->common, COMMON_OFFSET(queue_notify_off));
-        vq->vring.num = size;
 
         vring_init(&vq->vring, size, (unsigned char *)vq->queue);
 
index 6ba550b5a262b5ce6960464d092f4c7edd8f9bbb..d2ded3007e3f351ca453f3dce85098a5c1c5a7ff 100644 (file)
@@ -95,7 +95,7 @@ static inline void vring_init(struct vring *vr,
    unsigned int i;
    unsigned long pa;
 
-        vr->num = num;
+   vr->num = num;
 
    /* physical address of desc must be page aligned */
 
@@ -103,13 +103,13 @@ static inline void vring_init(struct vring *vr,
    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
    vr->desc = phys_to_virt(pa);
 
-        vr->avail = (struct vring_avail *)&vr->desc[num];
+   vr->avail = (struct vring_avail *)&vr->desc[num];
 
    /* physical address of used must be page aligned */
 
    pa = virt_to_phys(&vr->avail->ring[num]);
    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
-        vr->used = phys_to_virt(pa);
+   vr->used = phys_to_virt(pa);
 
    for (i = 0; i < num - 1; i++)
            vr->desc[i].next = i + 1;