diff options
author | Juraj Marcin <jmarcin@redhat.com> | 2024-09-04 12:37:15 +0200 |
---|---|---|
committer | David Hildenbrand <david@redhat.com> | 2024-09-24 11:33:35 +0200 |
commit | 1f5f49056d0f140568805d66f33396ed5cd90369 (patch) | |
tree | aac0aa83cbe297e381c8e96ac4d3c46b14f73011 | |
parent | c009a311e93963860cfba917605a4bf903a06bce (diff) | |
download | qemu-1f5f49056d0f140568805d66f33396ed5cd90369.zip qemu-1f5f49056d0f140568805d66f33396ed5cd90369.tar.gz qemu-1f5f49056d0f140568805d66f33396ed5cd90369.tar.bz2 |
virtio-mem: Add support for suspend+wake-up with plugged memory
Before, the virtio-mem device would unplug all the memory with any reset
of the device, including during the wake-up of the guest from a
suspended state. Due to this, the virtio-mem driver in the Linux kernel
disallowed suspend-to-ram requests in the guest when the
VIRTIO_MEM_F_PERSISTENT_SUSPEND feature is not exposed by QEMU.
This patch adds the code to skip the reset on wake-up and exposes
theVIRTIO_MEM_F_PERSISTENT_SUSPEND feature to the guest kernel driver
when suspending is possible in QEMU (currently only x86).
Message-ID: <20240904103722.946194-5-jmarcin@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Juraj Marcin <jmarcin@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
-rw-r--r-- | hw/virtio/virtio-mem.c | 10 | ||||
-rw-r--r-- | hw/virtio/virtio-qmp.c | 3 |
2 files changed, 13 insertions, 0 deletions
diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c index 484d3a5..ae1e81d 100644 --- a/hw/virtio/virtio-mem.c +++ b/hw/virtio/virtio-mem.c @@ -890,6 +890,9 @@ static uint64_t virtio_mem_get_features(VirtIODevice *vdev, uint64_t features, if (vmem->unplugged_inaccessible == ON_OFF_AUTO_ON) { virtio_add_feature(&features, VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE); } + if (qemu_wakeup_suspend_enabled()) { + virtio_add_feature(&features, VIRTIO_MEM_F_PERSISTENT_SUSPEND); + } return features; } @@ -1849,6 +1852,13 @@ static void virtio_mem_system_reset_hold(Object *obj, ResetType type) VirtIOMEM *vmem = VIRTIO_MEM(obj); /* + * When waking up from standby/suspend-to-ram, do not unplug any memory. + */ + if (type == RESET_TYPE_WAKEUP) { + return; + } + + /* * During usual resets, we will unplug all memory and shrink the usable * region size. This is, however, not possible in all scenarios. Then, * the guest has to deal with this manually (VIRTIO_MEM_REQ_UNPLUG_ALL). diff --git a/hw/virtio/virtio-qmp.c b/hw/virtio/virtio-qmp.c index 1dd96ed..cccc6fe 100644 --- a/hw/virtio/virtio-qmp.c +++ b/hw/virtio/virtio-qmp.c @@ -450,6 +450,9 @@ static const qmp_virtio_feature_map_t virtio_mem_feature_map[] = { FEATURE_ENTRY(VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE, \ "VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE: Unplugged memory cannot be " "accessed"), + FEATURE_ENTRY(VIRTIO_MEM_F_PERSISTENT_SUSPEND, \ + "VIRTIO_MEM_F_PERSISTENT_SUSPND: Plugged memory will remain " + "plugged when suspending+resuming"), { -1, "" } }; #endif |