qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Cornelia Huck <cohuck@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: [PULL 07/13] virtio-pci: add virtio_pci_optimal_num_queues() helper
Date: Thu, 27 Aug 2020 09:40:37 -0400	[thread overview]
Message-ID: <20200827133954.2118749-8-mst@redhat.com> (raw)
In-Reply-To: <20200827133954.2118749-1-mst@redhat.com>

From: Stefan Hajnoczi <stefanha@redhat.com>

Multi-queue devices achieve the best performance when each vCPU has a
dedicated queue. This ensures that virtqueue used notifications are
handled on the same vCPU that submitted virtqueue buffers.  When another
vCPU handles the the notification an IPI will be necessary to wake the
submission vCPU and this incurs a performance overhead.

Provide a helper function that virtio-pci devices will use in later
patches to automatically select the optimal number of queues.

The function handles guests with large numbers of CPUs by limiting the
number of queues to fit within the following constraints:
1. The maximum number of MSI-X vectors.
2. The maximum number of virtqueues.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20200818143348.310613-4-stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/virtio/virtio-pci.h |  9 +++++++++
 hw/virtio/virtio-pci.c | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
index e2eaaa9182..91096f0291 100644
--- a/hw/virtio/virtio-pci.h
+++ b/hw/virtio/virtio-pci.h
@@ -243,4 +243,13 @@ typedef struct VirtioPCIDeviceTypeInfo {
 /* Register virtio-pci type(s).  @t must be static. */
 void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t);
 
+/**
+ * virtio_pci_optimal_num_queues:
+ * @fixed_queues: number of queues that are always present
+ *
+ * Returns: The optimal number of queues for a multi-queue device, excluding
+ * @fixed_queues.
+ */
+unsigned virtio_pci_optimal_num_queues(unsigned fixed_queues);
+
 #endif
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index ccdf54e81c..fc69570dcc 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -19,6 +19,7 @@
 
 #include "exec/memop.h"
 #include "standard-headers/linux/virtio_pci.h"
+#include "hw/boards.h"
 #include "hw/virtio/virtio.h"
 #include "migration/qemu-file-types.h"
 #include "hw/pci/pci.h"
@@ -2058,6 +2059,37 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t)
     g_free(base_name);
 }
 
+unsigned virtio_pci_optimal_num_queues(unsigned fixed_queues)
+{
+    /*
+     * 1:1 vq to vCPU mapping is ideal because the same vCPU that submitted
+     * virtqueue buffers can handle their completion. When a different vCPU
+     * handles completion it may need to IPI the vCPU that submitted the
+     * request and this adds overhead.
+     *
+     * Virtqueues consume guest RAM and MSI-X vectors. This is wasteful in
+     * guests with very many vCPUs and a device that is only used by a few
+     * vCPUs. Unfortunately optimizing that case requires manual pinning inside
+     * the guest, so those users might as well manually set the number of
+     * queues. There is no upper limit that can be applied automatically and
+     * doing so arbitrarily would result in a sudden performance drop once the
+     * threshold number of vCPUs is exceeded.
+     */
+    unsigned num_queues = current_machine->smp.cpus;
+
+    /*
+     * The maximum number of MSI-X vectors is PCI_MSIX_FLAGS_QSIZE + 1, but the
+     * config change interrupt and the fixed virtqueues must be taken into
+     * account too.
+     */
+    num_queues = MIN(num_queues, PCI_MSIX_FLAGS_QSIZE - fixed_queues);
+
+    /*
+     * There is a limit to how many virtqueues a device can have.
+     */
+    return MIN(num_queues, VIRTIO_QUEUE_MAX - fixed_queues);
+}
+
 /* virtio-pci-bus */
 
 static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size,
-- 
MST



  parent reply	other threads:[~2020-08-27 13:42 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-27 13:40 [PULL 00/13] virtio,pc,acpi: features, fixes Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 01/13] acpi: allow DSDT changes Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 02/13] i386/acpi: fix inconsistent QEMU/OVMF device paths Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 03/13] arm/acpi: fix an out of spec _UID for PCI root Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 04/13] disassemble-aml: -o actually works Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 05/13] acpi: update expected DSDT files with _UID changes Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 06/13] Introduce a new flag for i440fx to disable PCI hotplug on the root bus Michael S. Tsirkin
2020-08-27 17:41   ` Igor Mammedov
2020-08-27 17:59     ` Ani Sinha
2020-08-28  9:49       ` Igor Mammedov
2020-08-28  9:51         ` Ani Sinha
2020-08-28 13:10           ` Julia Suvorova
2020-08-28 13:15             ` Ani Sinha
2020-08-28 15:45               ` Julia Suvorova
2020-09-01  6:27             ` Ani Sinha
2020-09-01 12:04               ` Ani Sinha
2020-08-30 10:02         ` Ani Sinha
2020-08-30 20:57       ` Michael S. Tsirkin
2020-08-31 12:15         ` Ani Sinha
2020-08-30  9:56     ` Michael S. Tsirkin
2020-08-27 13:40 ` Michael S. Tsirkin [this message]
2020-08-27 13:40 ` [PULL 08/13] virtio-scsi: introduce a constant for fixed virtqueues Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 09/13] virtio-scsi-pci: default num_queues to -smp N Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 10/13] virtio-blk-pci: " Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 11/13] vhost-user-blk-pci: " Michael S. Tsirkin
2020-08-27 13:40 ` [PULL 12/13] hw/smbios: add options for type 4 max-speed and current-speed Michael S. Tsirkin
2020-08-27 13:41 ` [PULL 13/13] tests/bios-tables-test: add smbios cpu speed test Michael S. Tsirkin
2020-08-27 22:09 ` [PULL 00/13] virtio,pc,acpi: features, fixes Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200827133954.2118749-8-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=cohuck@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).