On Fri, 24 Jan 2020 10:01:57 +0000 Stefan Hajnoczi <stefa...@redhat.com> wrote:
> Automatically size the number of request virtqueues to match the number "If the pci transport is used, ..." ? > of vCPUs. This ensures that completion interrupts are handled on the > same vCPU that submitted the request. No IPI is necessary to complete > an I/O request and performance is improved. "For other transports, the number of request queues continues to default to 1." ? > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > --- > hw/core/machine.c | 3 +++ > hw/scsi/vhost-scsi.c | 3 ++- > hw/scsi/vhost-user-scsi.c | 3 ++- > hw/scsi/virtio-scsi.c | 6 +++++- > hw/virtio/vhost-scsi-pci.c | 10 ++++++++-- > hw/virtio/vhost-user-scsi-pci.c | 10 ++++++++-- > hw/virtio/virtio-scsi-pci.c | 10 ++++++++-- > include/hw/virtio/virtio-scsi.h | 2 ++ > 8 files changed, 38 insertions(+), 9 deletions(-) > (...) > diff --git a/hw/virtio/vhost-scsi-pci.c b/hw/virtio/vhost-scsi-pci.c > index e8dfbfc60f..38a8f0c3ef 100644 > --- a/hw/virtio/vhost-scsi-pci.c > +++ b/hw/virtio/vhost-scsi-pci.c > @@ -17,6 +17,7 @@ > #include "qemu/osdep.h" > > #include "standard-headers/linux/virtio_pci.h" > +#include "hw/boards.h" > #include "hw/qdev-properties.h" > #include "hw/virtio/vhost-scsi.h" > #include "qapi/error.h" > @@ -47,10 +48,15 @@ static void vhost_scsi_pci_realize(VirtIOPCIProxy > *vpci_dev, Error **errp) > { > VHostSCSIPCI *dev = VHOST_SCSI_PCI(vpci_dev); > DeviceState *vdev = DEVICE(&dev->vdev); > - VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev); > + VirtIOSCSIConf *conf = &dev->vdev.parent_obj.parent_obj.conf; > + > + /* 1:1 vq to vcpu mapping is ideal because it avoids IPIs */ > + if (conf->num_queues == VIRTIO_SCSI_AUTO_NUM_QUEUES) { > + conf->num_queues = current_machine->smp.cpus; This now maps the request vqs 1:1 to the vcpus. What about the fixed vqs? If they don't really matter, amend the comment to explain that? > + } > > if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { > - vpci_dev->nvectors = vs->conf.num_queues + 3; > + vpci_dev->nvectors = conf->num_queues + VIRTIO_SCSI_VQ_NUM_FIXED + 1; > } > > qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus));