All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Mike Cui" <cui@nutanix.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Peter Turschmid" <peter.turschm@nutanix.com>,
	"Raphael Norwitz" <raphael.norwitz@nutanix.com>
Subject: [PULL 40/56] Lift max memory slots limit imposed by vhost-user
Date: Wed, 10 Jun 2020 00:28:01 -0400	[thread overview]
Message-ID: <20200610042613.1459309-41-mst@redhat.com> (raw)
In-Reply-To: <20200610042613.1459309-1-mst@redhat.com>

From: Raphael Norwitz <raphael.norwitz@nutanix.com>

Historically, sending all memory regions to vhost-user backends in a
single message imposed a limitation on the number of times memory
could be hot-added to a VM with a vhost-user device. Now that backends
which support the VHOST_USER_PROTOCOL_F_CONFIGURE_SLOTS send memory
regions individually, we no longer need to impose this limitation on
devices which support this feature.

With this change, VMs with a vhost-user device which supports the
VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS can support a configurable
number of memory slots, up to the maximum allowed by the target
platform.

Existing backends which do not support
VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS are unaffected.

Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
Signed-off-by: Peter Turschmid <peter.turschm@nutanix.com>
Suggested-by: Mike Cui <cui@nutanix.com>
Message-Id: <1588533678-23450-6-git-send-email-raphael.norwitz@nutanix.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/virtio/vhost-user.c      | 56 ++++++++++++++++++++++++-------------
 docs/interop/vhost-user.rst |  7 ++---
 2 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 93584069cd..48b80818fd 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -35,10 +35,28 @@
 #include <linux/userfaultfd.h>
 #endif
 
-#define VHOST_MEMORY_MAX_NREGIONS    8
+#define VHOST_MEMORY_BASELINE_NREGIONS    8
 #define VHOST_USER_F_PROTOCOL_FEATURES 30
 #define VHOST_USER_SLAVE_MAX_FDS     8
 
+/*
+ * Set maximum number of RAM slots supported to
+ * the maximum number supported by the target
+ * hardware plaform.
+ */
+#if defined(TARGET_X86) || defined(TARGET_X86_64) || \
+    defined(TARGET_ARM) || defined(TARGET_ARM_64)
+#include "hw/acpi/acpi.h"
+#define VHOST_USER_MAX_RAM_SLOTS ACPI_MAX_RAM_SLOTS
+
+#elif defined(TARGET_PPC) || defined(TARGET_PPC_64)
+#include "hw/ppc/spapr.h"
+#define VHOST_USER_MAX_RAM_SLOTS SPAPR_MAX_RAM_SLOTS
+
+#else
+#define VHOST_USER_MAX_RAM_SLOTS 512
+#endif
+
 /*
  * Maximum size of virtio device config space
  */
@@ -127,7 +145,7 @@ typedef struct VhostUserMemoryRegion {
 typedef struct VhostUserMemory {
     uint32_t nregions;
     uint32_t padding;
-    VhostUserMemoryRegion regions[VHOST_MEMORY_MAX_NREGIONS];
+    VhostUserMemoryRegion regions[VHOST_MEMORY_BASELINE_NREGIONS];
 } VhostUserMemory;
 
 typedef struct VhostUserMemRegMsg {
@@ -222,7 +240,7 @@ struct vhost_user {
     int slave_fd;
     NotifierWithReturn postcopy_notifier;
     struct PostCopyFD  postcopy_fd;
-    uint64_t           postcopy_client_bases[VHOST_MEMORY_MAX_NREGIONS];
+    uint64_t           postcopy_client_bases[VHOST_USER_MAX_RAM_SLOTS];
     /* Length of the region_rb and region_rb_offset arrays */
     size_t             region_rb_len;
     /* RAMBlock associated with a given region */
@@ -237,7 +255,7 @@ struct vhost_user {
 
     /* Our current regions */
     int num_shadow_regions;
-    struct vhost_memory_region shadow_regions[VHOST_MEMORY_MAX_NREGIONS];
+    struct vhost_memory_region shadow_regions[VHOST_USER_MAX_RAM_SLOTS];
 };
 
 struct scrub_regions {
@@ -392,7 +410,7 @@ int vhost_user_gpu_set_socket(struct vhost_dev *dev, int fd)
 static int vhost_user_set_log_base(struct vhost_dev *dev, uint64_t base,
                                    struct vhost_log *log)
 {
-    int fds[VHOST_MEMORY_MAX_NREGIONS];
+    int fds[VHOST_USER_MAX_RAM_SLOTS];
     size_t fd_num = 0;
     bool shmfd = virtio_has_feature(dev->protocol_features,
                                     VHOST_USER_PROTOCOL_F_LOG_SHMFD);
@@ -470,7 +488,7 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
         mr = vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd);
         if (fd > 0) {
             if (track_ramblocks) {
-                assert(*fd_num < VHOST_MEMORY_MAX_NREGIONS);
+                assert(*fd_num < VHOST_MEMORY_BASELINE_NREGIONS);
                 trace_vhost_user_set_mem_table_withfd(*fd_num, mr->name,
                                                       reg->memory_size,
                                                       reg->guest_phys_addr,
@@ -478,7 +496,7 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
                                                       offset);
                 u->region_rb_offset[i] = offset;
                 u->region_rb[i] = mr->ram_block;
-            } else if (*fd_num == VHOST_MEMORY_MAX_NREGIONS) {
+            } else if (*fd_num == VHOST_MEMORY_BASELINE_NREGIONS) {
                 error_report("Failed preparing vhost-user memory table msg");
                 return -1;
             }
@@ -523,7 +541,7 @@ static void scrub_shadow_regions(struct vhost_dev *dev,
                                  bool track_ramblocks)
 {
     struct vhost_user *u = dev->opaque;
-    bool found[VHOST_MEMORY_MAX_NREGIONS] = {};
+    bool found[VHOST_USER_MAX_RAM_SLOTS] = {};
     struct vhost_memory_region *reg, *shadow_reg;
     int i, j, fd, add_idx = 0, rm_idx = 0, fd_num = 0;
     ram_addr_t offset;
@@ -777,9 +795,9 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
                                          bool track_ramblocks)
 {
     struct vhost_user *u = dev->opaque;
-    struct scrub_regions add_reg[VHOST_MEMORY_MAX_NREGIONS];
-    struct scrub_regions rem_reg[VHOST_MEMORY_MAX_NREGIONS];
-    uint64_t shadow_pcb[VHOST_MEMORY_MAX_NREGIONS] = {};
+    struct scrub_regions add_reg[VHOST_USER_MAX_RAM_SLOTS];
+    struct scrub_regions rem_reg[VHOST_USER_MAX_RAM_SLOTS];
+    uint64_t shadow_pcb[VHOST_USER_MAX_RAM_SLOTS] = {};
     int nr_add_reg, nr_rem_reg;
 
     msg->hdr.size = sizeof(msg->payload.mem_reg.padding) +
@@ -803,7 +821,7 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
 
     if (track_ramblocks) {
         memcpy(u->postcopy_client_bases, shadow_pcb,
-               sizeof(uint64_t) * VHOST_MEMORY_MAX_NREGIONS);
+               sizeof(uint64_t) * VHOST_USER_MAX_RAM_SLOTS);
         /*
          * Now we've registered this with the postcopy code, we ack to the
          * client, because now we're in the position to be able to deal with
@@ -823,7 +841,7 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
 err:
     if (track_ramblocks) {
         memcpy(u->postcopy_client_bases, shadow_pcb,
-               sizeof(uint64_t) * VHOST_MEMORY_MAX_NREGIONS);
+               sizeof(uint64_t) * VHOST_USER_MAX_RAM_SLOTS);
     }
 
     return -1;
@@ -835,7 +853,7 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
                                              bool config_mem_slots)
 {
     struct vhost_user *u = dev->opaque;
-    int fds[VHOST_MEMORY_MAX_NREGIONS];
+    int fds[VHOST_MEMORY_BASELINE_NREGIONS];
     size_t fd_num = 0;
     VhostUserMsg msg_reply;
     int region_i, msg_i;
@@ -893,7 +911,7 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
         }
 
         memset(u->postcopy_client_bases, 0,
-               sizeof(uint64_t) * VHOST_MEMORY_MAX_NREGIONS);
+               sizeof(uint64_t) * VHOST_USER_MAX_RAM_SLOTS);
 
         /*
          * They're in the same order as the regions that were sent
@@ -942,7 +960,7 @@ static int vhost_user_set_mem_table(struct vhost_dev *dev,
                                     struct vhost_memory *mem)
 {
     struct vhost_user *u = dev->opaque;
-    int fds[VHOST_MEMORY_MAX_NREGIONS];
+    int fds[VHOST_MEMORY_BASELINE_NREGIONS];
     size_t fd_num = 0;
     bool do_postcopy = u->postcopy_listen && u->postcopy_fd.handler;
     bool reply_supported = virtio_has_feature(dev->protocol_features,
@@ -1149,7 +1167,7 @@ static int vhost_set_vring_file(struct vhost_dev *dev,
                                 VhostUserRequest request,
                                 struct vhost_vring_file *file)
 {
-    int fds[VHOST_MEMORY_MAX_NREGIONS];
+    int fds[VHOST_USER_MAX_RAM_SLOTS];
     size_t fd_num = 0;
     VhostUserMsg msg = {
         .hdr.request = request,
@@ -1845,7 +1863,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque)
         /* get max memory regions if backend supports configurable RAM slots */
         if (!virtio_has_feature(dev->protocol_features,
                                 VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS)) {
-            u->user->memory_slots = VHOST_MEMORY_MAX_NREGIONS;
+            u->user->memory_slots = VHOST_MEMORY_BASELINE_NREGIONS;
         } else {
             err = vhost_user_get_max_memslots(dev, &ram_slots);
             if (err < 0) {
@@ -1860,7 +1878,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque)
                 return -1;
             }
 
-            u->user->memory_slots = MIN(ram_slots, VHOST_MEMORY_MAX_NREGIONS);
+            u->user->memory_slots = MIN(ram_slots, VHOST_USER_MAX_RAM_SLOTS);
         }
     }
 
diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst
index 037eefab0e..688b7c6900 100644
--- a/docs/interop/vhost-user.rst
+++ b/docs/interop/vhost-user.rst
@@ -1273,10 +1273,9 @@ Master message types
   feature has been successfully negotiated, this message is submitted
   by master to the slave. The slave should return the message with a
   u64 payload containing the maximum number of memory slots for
-  QEMU to expose to the guest. At this point, the value returned
-  by the backend will be capped at the maximum number of ram slots
-  which can be supported by vhost-user. Currently that limit is set
-  at VHOST_USER_MAX_RAM_SLOTS = 8.
+  QEMU to expose to the guest. The value returned by the backend
+  will be capped at the maximum number of ram slots which can be
+  supported by the target platform.
 
 ``VHOST_USER_ADD_MEM_REG``
   :id: 37
-- 
MST



  parent reply	other threads:[~2020-06-10  4:52 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-10  4:26 [PULL 00/56] virtio,acpi,pci: features, fixes, cleanups, tests Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 01/56] msix: allow qword MSI-X table accesses Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 02/56] diffs-allowed: add the SRAT AML to diffs-allowed Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 03/56] hw/acpi/nvdimm: add a helper to augment SRAT generation Michael S. Tsirkin
2020-06-10  4:26   ` Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 04/56] tests/acpi: update expected SRAT files Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 05/56] qtest: allow DSDT acpi table changes Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 06/56] acpi: move aml builder code for rtc device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 07/56] acpi: rtc: use a single crs range Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 08/56] acpi: serial: don't use _STA method Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 09/56] acpi: move aml builder code for serial device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 10/56] acpi: parallel: don't use _STA method Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 11/56] acpi: move aml builder code for parallel device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 12/56] tests/acpi: update DSDT expected files Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 13/56] acpi: tpm: Do not build TCPA table for TPM 2 Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 14/56] acpi: Convert build_tpm2() to build_append* API Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 15/56] acpi: Move build_tpm2() in the generic part Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 16/56] arm/acpi: TPM2 ACPI table support Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 17/56] test/tpm-emu: include sockets and channel headers in tpm-emu header Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 18/56] tests/acpi: Add void tables for Q35/TPM-TIS bios-tables-test Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 19/56] tests: tpm-emu: Remove assert on TPM2_ST_NO_SESSIONS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 20/56] bios-tables-test: Add Q35/TPM-TIS test Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 21/56] bios-tables-test: Generate reference tables for Q35/TPM-TIS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 22/56] virtio-balloon: fix free page hinting without an iothread Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 23/56] virtio-balloon: fix free page hinting check on unrealize Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 24/56] virtio-balloon: unref the iothread when unrealizing Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 25/56] virtio-balloon: Implement support for page poison reporting feature Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 26/56] virtio-balloon: Provide an interface for free page reporting Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 27/56] MAINTAINERS: Fix the classification of bios-tables-test-allowed-diff.h Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 28/56] hw/pci/pcie: Move hot plug capability check to pre_plug callback Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 29/56] pci: assert configuration access is within bounds Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 30/56] hw/pci-host/prep: Correct RAVEN bus bridge memory region size Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 31/56] hw/pci/pci_bridge: Correct pci_bridge_io " Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 32/56] hw/pci/pci_bridge: Use the IEC binary prefix definitions Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 33/56] hw/pci-host: " Michael S. Tsirkin
2020-06-10  4:27   ` Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 34/56] char-socket: return -1 in case of disconnect during tcp_chr_write Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 35/56] vhost-user-blk: delay vhost_user_blk_disconnect Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 36/56] Add helper to populate vhost-user message regions Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 37/56] Add vhost-user helper to get MemoryRegion data Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 38/56] Add VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 39/56] Transmit vhost-user memory regions individually Michael S. Tsirkin
2020-06-10  4:28 ` Michael S. Tsirkin [this message]
2020-06-10  4:28 ` [PULL 41/56] Refactor out libvhost-user fault generation logic Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 42/56] Support ram slot configuration in libvhost-user Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 43/56] Support adding individual regions " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 44/56] Support individual region unmap " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 45/56] Lift max ram slots limit " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 46/56] libvhost-user: advertise vring features Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 47/56] hw/pci: Fix crash when running QEMU with "-nic model=rocker" Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 48/56] vhost-vsock: add vhost-vsock-common abstraction Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 49/56] virtio: add vhost-user-vsock base device Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 50/56] virtio: add vhost-user-vsock-pci device Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 51/56] acpi: make build_madt() more generic Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 52/56] acpi: create acpi-common.c and move madt code Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 53/56] acpi: madt: skip pci override on pci-less systems Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 54/56] acpi: fadt: add hw-reduced sleep register support Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 55/56] acpi: ged: rename event memory region Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 56/56] Fix parameter type in vhost migration log path Michael S. Tsirkin
2020-06-10  5:30 ` [PULL 00/56] virtio,acpi,pci: features, fixes, cleanups, tests no-reply
2020-06-11 18:13 ` Peter Maydell
2020-06-12 16:12   ` Michael S. Tsirkin

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=20200610042613.1459309-41-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=cui@nutanix.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peter.turschm@nutanix.com \
    --cc=qemu-devel@nongnu.org \
    --cc=raphael.norwitz@nutanix.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.