virtio: don't waste irqfds on control vqs
PATCH 1/1 virtio: don't waste irqfds on control vqs
Pass nvqs to set_guest_notifiers. This makes it possible to save on irqfds by not allocating one for the control vq for virtio-net.
Signed-off-by Michael S. Tsirkin <[email protected]>
--- hw/vhost.c | 10 +++++++--- hw/virtio-pci.c | 6 +++--- hw/virtio.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-)
hw/vhost.c +7 -3
@@ -879,7 +879,9 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev) goto fail; } - r = vdev->binding->set_guest_notifiers (vdev->binding_opaque, true); + r = vdev->binding->set_guest_notifiers (vdev->binding_opaque, + hdev->nvqs, + true);if (r <0 ) {fprintf (stderr,"Error binding guest notifier: %d\n" , -r); goto fail_notifiers;
@@ -929,7 +931,7 @@ fail_vq: } fail_mem: fail_features: - vdev->binding->set_guest_notifiers (vdev->binding_opaque, false); + vdev->binding->set_guest_notifiers (vdev->binding_opaque, hdev->nvqs, false); fail_notifiers: fail:return r;
@@ -950,7 +952,9 @@ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev)vhost_sync_dirty_bitmap (hdev, &hdev->mem_sections[i],0 , (hwaddr )~0x0ull ); } - r = vdev->binding->set_guest_notifiers (vdev->binding_opaque, false); + r = vdev->binding->set_guest_notifiers (vdev->binding_opaque, + hdev->nvqs, + false);if (r <0 ) {fprintf (stderr,"vhost guest notifier cleanup failed: %d\n" , r);fflush (stderr);
hw/virtio-pci.c +3 -3
@@ -631,7 +631,7 @@ static bool virtio_pci_query_guest_notifiers(DeviceState *d)return msix_enabled (&proxy->pci_dev); } -static int virtio_pci_set_guest_notifiers (DeviceState *d,bool assign) +static int virtio_pci_set_guest_notifiers (DeviceState *d,int nvqs,bool assign) {VirtIOPCIProxy *proxy =to_virtio_pci_proxy (d);VirtIODevice *vdev = proxy->vdev;
@@ -646,9 +646,9 @@ static int virtio_pci_set_guest_notifiers(DeviceState *d, bool assign) proxy->vector_irqfd =NULL ; } -for (n =0 ; n <VIRTIO_PCI_QUEUE_MAX ; n++) { +for (n =0 ; n <VIRTIO_PCI_QUEUE_MAX && n < nvqs; n++) {if (!virtio_queue_get_num (vdev, n)) { -break ; +continue ; } r = virtio_pci_set_guest_notifier(d, n, assign,
hw/virtio.h +1 -1
@@ -99,7 +99,7 @@ typedef struct {int (*load_done)(DeviceState *d,QEMUFile *f);unsigned (*get_features)(DeviceState *d);bool (*query_guest_notifiers)(DeviceState *d); -int (*set_guest_notifiers)(DeviceState *d,bool assigned); +int (*set_guest_notifiers)(DeviceState *d,int nvqs,bool assigned);int (*set_host_notifier)(DeviceState *d,int n,bool assigned);void (*vmstate_change)(DeviceState *d,bool running); } VirtIOBindings;
Signature · 1 line
MST