Currently, the virtio-mem device would unplug all the memory with any
reset request, including when the machine wakes up from a suspended
state (deep sleep). This would lead to a loss of the contents of the
guest memory and therefore is disabled by the virtio-mem Linux Kernel
driver unless the VIRTIO_MEM_F_PERSISTENT_SUSPEND virtio feature is
exposed. [1]
To make deep sleep with virtio-mem possible, we need to differentiate
cold start reset from wake-up reset. The first patch updates
qemu_system_reset() and MachineClass children to accept ResetType
instead of ShutdownCause, which then could be passed down the device
tree. The second patch then introduces the new reset type for the
wake-up event and updates the i386 wake-up method (only architecture
using the explicit wake-up method).
The third patch replaces LegacyReset with the Resettable interface in
virtio-mem, so the memory device can access the reset type in the hold
phase. The last patch of the series implements the final support in the
hold phase of the virtio-mem reset callback and exposes
VIRTIO_MEM_F_PERSISTENT_SUSPEND to the kernel.
[1]: https://lore.kernel.org/all/20240318120645.105664-1-david@redhat.com/
Juraj Marcin (4):
reset: Use ResetType for qemu_devices_reset() and
MachineClass->reset()
reset: Add RESET_TYPE_WAKEUP
virtio-mem: Implement Resettable interface instead of using
LegacyReset
virtio-mem: Add support for suspend+wake-up with plugged memory
docs/devel/reset.rst | 7 +++++
hw/arm/aspeed.c | 4 +--
hw/arm/mps2-tz.c | 4 +--
hw/core/reset.c | 7 ++---
hw/hppa/machine.c | 4 +--
hw/i386/microvm.c | 4 +--
hw/i386/pc.c | 6 ++---
hw/ppc/pegasos2.c | 4 +--
hw/ppc/pnv.c | 4 +--
hw/ppc/spapr.c | 6 ++---
hw/s390x/s390-virtio-ccw.c | 4 +--
hw/virtio/virtio-mem.c | 49 ++++++++++++++++++++++++----------
hw/virtio/virtio-qmp.c | 3 +++
include/hw/boards.h | 3 ++-
include/hw/resettable.h | 2 ++
include/hw/virtio/virtio-mem.h | 4 +++
include/sysemu/reset.h | 5 ++--
system/runstate.c | 13 +++++++--
18 files changed, 89 insertions(+), 44 deletions(-)
--
2.45.2