From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "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 v2 38/58] Add VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS
Date: Fri, 12 Jun 2020 10:52:26 -0400 [thread overview]
Message-ID: <20200612141917.9446-39-mst@redhat.com> (raw)
In-Reply-To: <20200612141917.9446-1-mst@redhat.com>
From: Raphael Norwitz <raphael.norwitz@nutanix.com>
This change introduces a new feature to the vhost-user protocol allowing
a backend device to specify the maximum number of ram slots it supports.
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, which
is currently set to 8 because of underlying protocol limitations.
The returned value will be stored inside the VhostUserState struct so
that on device reconnect we can verify that the ram slot limitation
has not decreased since the last time the device connected.
Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com>
Signed-off-by: Peter Turschmid <peter.turschm@nutanix.com>
Message-Id: <1588533678-23450-4-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>
---
include/hw/virtio/vhost-user.h | 1 +
hw/virtio/vhost-user.c | 49 ++++++++++++++++++++++++++++++++--
docs/interop/vhost-user.rst | 16 +++++++++++
3 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/include/hw/virtio/vhost-user.h b/include/hw/virtio/vhost-user.h
index 811e325f42..a9abca3288 100644
--- a/include/hw/virtio/vhost-user.h
+++ b/include/hw/virtio/vhost-user.h
@@ -20,6 +20,7 @@ typedef struct VhostUserHostNotifier {
typedef struct VhostUserState {
CharBackend *chr;
VhostUserHostNotifier notifier[VIRTIO_QUEUE_MAX];
+ int memory_slots;
} VhostUserState;
bool vhost_user_init(VhostUserState *user, CharBackend *chr, Error **errp);
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 442b0d650a..754ad885cf 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -59,6 +59,8 @@ enum VhostUserProtocolFeature {
VHOST_USER_PROTOCOL_F_HOST_NOTIFIER = 11,
VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD = 12,
VHOST_USER_PROTOCOL_F_RESET_DEVICE = 13,
+ /* Feature 14 reserved for VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS. */
+ VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS = 15,
VHOST_USER_PROTOCOL_F_MAX
};
@@ -100,6 +102,8 @@ typedef enum VhostUserRequest {
VHOST_USER_SET_INFLIGHT_FD = 32,
VHOST_USER_GPU_SET_SOCKET = 33,
VHOST_USER_RESET_DEVICE = 34,
+ /* Message number 35 reserved for VHOST_USER_VRING_KICK. */
+ VHOST_USER_GET_MAX_MEM_SLOTS = 36,
VHOST_USER_MAX
} VhostUserRequest;
@@ -895,6 +899,23 @@ static int vhost_user_set_owner(struct vhost_dev *dev)
return 0;
}
+static int vhost_user_get_max_memslots(struct vhost_dev *dev,
+ uint64_t *max_memslots)
+{
+ uint64_t backend_max_memslots;
+ int err;
+
+ err = vhost_user_get_u64(dev, VHOST_USER_GET_MAX_MEM_SLOTS,
+ &backend_max_memslots);
+ if (err < 0) {
+ return err;
+ }
+
+ *max_memslots = backend_max_memslots;
+
+ return 0;
+}
+
static int vhost_user_reset_device(struct vhost_dev *dev)
{
VhostUserMsg msg = {
@@ -1392,7 +1413,7 @@ static int vhost_user_postcopy_notifier(NotifierWithReturn *notifier,
static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque)
{
- uint64_t features, protocol_features;
+ uint64_t features, protocol_features, ram_slots;
struct vhost_user *u;
int err;
@@ -1454,6 +1475,27 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque)
"slave-req protocol features.");
return -1;
}
+
+ /* 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;
+ } else {
+ err = vhost_user_get_max_memslots(dev, &ram_slots);
+ if (err < 0) {
+ return err;
+ }
+
+ if (ram_slots < u->user->memory_slots) {
+ error_report("The backend specified a max ram slots limit "
+ "of %" PRIu64", when the prior validated limit was %d. "
+ "This limit should never decrease.", ram_slots,
+ u->user->memory_slots);
+ return -1;
+ }
+
+ u->user->memory_slots = MIN(ram_slots, VHOST_MEMORY_MAX_NREGIONS);
+ }
}
if (dev->migration_blocker == NULL &&
@@ -1519,7 +1561,9 @@ static int vhost_user_get_vq_index(struct vhost_dev *dev, int idx)
static int vhost_user_memslots_limit(struct vhost_dev *dev)
{
- return VHOST_MEMORY_MAX_NREGIONS;
+ struct vhost_user *u = dev->opaque;
+
+ return u->user->memory_slots;
}
static bool vhost_user_requires_shm_log(struct vhost_dev *dev)
@@ -1904,6 +1948,7 @@ bool vhost_user_init(VhostUserState *user, CharBackend *chr, Error **errp)
return false;
}
user->chr = chr;
+ user->memory_slots = 0;
return true;
}
diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst
index 3b1b6602c7..b3cf5c3cb5 100644
--- a/docs/interop/vhost-user.rst
+++ b/docs/interop/vhost-user.rst
@@ -815,6 +815,7 @@ Protocol features
#define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12
#define VHOST_USER_PROTOCOL_F_RESET_DEVICE 13
#define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14
+ #define VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS 15
Master message types
--------------------
@@ -1263,6 +1264,21 @@ Master message types
The state.num field is currently reserved and must be set to 0.
+``VHOST_USER_GET_MAX_MEM_SLOTS``
+ :id: 36
+ :equivalent ioctl: N/A
+ :slave payload: u64
+
+ When the ``VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS`` protocol
+ 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 because of underlying protocol
+ limitations.
+
Slave message types
-------------------
--
MST
next prev parent reply other threads:[~2020-06-12 15:08 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-12 14:51 [PULL v2 00/58] virtio,acpi,pci: features, fixes, cleanups, tests Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 01/58] msix: allow qword MSI-X table accesses Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 02/58] diffs-allowed: add the SRAT AML to diffs-allowed Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 03/58] hw/acpi/nvdimm: add a helper to augment SRAT generation Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 04/58] tests/acpi: update expected SRAT files Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 05/58] qtest: allow DSDT acpi table changes Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 06/58] acpi: move aml builder code for rtc device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 07/58] acpi: rtc: use a single crs range Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 08/58] acpi: serial: don't use _STA method Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 09/58] acpi: move aml builder code for serial device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 10/58] acpi: parallel: don't use _STA method Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 11/58] acpi: move aml builder code for parallel device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 12/58] tests/acpi: update DSDT expected files Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 13/58] acpi: tpm: Do not build TCPA table for TPM 2 Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 14/58] acpi: Convert build_tpm2() to build_append* API Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 15/58] acpi: Move build_tpm2() in the generic part Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 16/58] arm/acpi: TPM2 ACPI table support Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 17/58] test/tpm-emu: include sockets and channel headers in tpm-emu header Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 18/58] tests/acpi: Add void tables for Q35/TPM-TIS bios-tables-test Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 19/58] tests: tpm-emu: Remove assert on TPM2_ST_NO_SESSIONS Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 20/58] bios-tables-test: Add Q35/TPM-TIS test Michael S. Tsirkin
2020-06-15 10:02 ` Philippe Mathieu-Daudé
2020-06-15 10:22 ` Thomas Huth
2020-06-15 12:35 ` Auger Eric
2020-06-15 12:58 ` Thomas Huth
2020-06-12 14:51 ` [PULL v2 21/58] bios-tables-test: Generate reference tables for Q35/TPM-TIS Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 22/58] virtio-balloon: fix free page hinting without an iothread Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 23/58] virtio-balloon: fix free page hinting check on unrealize Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 24/58] virtio-balloon: unref the iothread when unrealizing Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 25/58] virtio-balloon: Implement support for page poison reporting feature Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 26/58] virtio-balloon: Provide an interface for free page reporting Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 27/58] MAINTAINERS: Fix the classification of bios-tables-test-allowed-diff.h Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 28/58] hw/pci/pcie: Move hot plug capability check to pre_plug callback Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 29/58] pci: assert configuration access is within bounds Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 30/58] hw/pci-host/prep: Correct RAVEN bus bridge memory region size Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 31/58] hw/pci/pci_bridge: Correct pci_bridge_io " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 32/58] hw/pci/pci_bridge: Use the IEC binary prefix definitions Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 33/58] hw/pci-host: " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 34/58] char-socket: return -1 in case of disconnect during tcp_chr_write Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 35/58] vhost-user-blk: delay vhost_user_blk_disconnect Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 36/58] Add helper to populate vhost-user message regions Michael S. Tsirkin
2020-06-19 12:59 ` Peter Maydell
2020-06-12 14:52 ` [PULL v2 37/58] Add vhost-user helper to get MemoryRegion data Michael S. Tsirkin
2020-06-12 14:52 ` Michael S. Tsirkin [this message]
2020-06-12 14:52 ` [PULL v2 39/58] Transmit vhost-user memory regions individually Michael S. Tsirkin
2020-06-19 13:02 ` Peter Maydell
2020-06-22 18:51 ` Raphael Norwitz
2020-06-12 14:52 ` [PULL v2 40/58] Lift max memory slots limit imposed by vhost-user Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 41/58] Refactor out libvhost-user fault generation logic Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 42/58] Support ram slot configuration in libvhost-user Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 43/58] Support adding individual regions " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 44/58] Support individual region unmap " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 45/58] Lift max ram slots limit " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 46/58] libvhost-user: advertise vring features Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 47/58] hw/pci: Fix crash when running QEMU with "-nic model=rocker" Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 48/58] vhost-vsock: add vhost-vsock-common abstraction Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 49/58] virtio: add vhost-user-vsock base device Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 50/58] virtio: add vhost-user-vsock-pci device Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 51/58] acpi: make build_madt() more generic Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 52/58] acpi: create acpi-common.c and move madt code Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 53/58] acpi: madt: skip pci override on pci-less systems Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 54/58] acpi: fadt: add hw-reduced sleep register support Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 55/58] acpi: ged: rename event memory region Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 56/58] Fix parameter type in vhost migration log path Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 57/58] pci: Display PCI IRQ pin in "info pci" Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 58/58] virtio-pci: fix queue_enable write Michael S. Tsirkin
2020-06-12 15:51 ` [PULL v2 00/58] virtio, acpi, pci: features, fixes, cleanups, tests no-reply
2020-06-12 16:11 ` Michael S. Tsirkin
2020-06-12 22:01 ` Peter Maydell
2020-06-16 7:26 ` Auger Eric
2020-06-16 7:43 ` Auger Eric
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=20200612141917.9446-39-mst@redhat.com \
--to=mst@redhat.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 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).