• David Hildenbrand's avatar
    virtio-mem: support suspend+resume · e4544c55
    David Hildenbrand authored
    With virtio-mem, primarily hibernation is problematic: as the machine shuts
    down, the virtio-mem device loses its state. Powering the machine back up
    is like losing a bunch of DIMMs. While there would be ways to add limited
    support, suspend+resume is more commonly used for VMs and "easier" to
    support cleanly.
    
    s2idle can be supported without any device dependencies. Similarly, one
    would expect suspend-to-ram (i.e., S3) to work out of the box. However,
    QEMU currently unplugs all device memory when resuming the VM, using a
    cold reset on the "wakeup" path. In order to support S3, we need a feature
    flag for the device to tell us if memory remains plugged when waking up. In
    the future, QEMU will implement this feature.
    
    So let's always support s2idle and support S3 with plugged memory only if
    the device indicates support. Block hibernation early using the PM
    notifier.
    
    Trying to hibernate now fails early:
    	# echo disk > /sys/power/state
    	[   26.455369] PM: hibernation: hibernation entry
    	[   26.458271] virtio_mem virtio0: hibernation is not supported.
    	[   26.462498] PM: hibernation: hibernation exit
    	-bash: echo: write error: Operation not permitted
    
    s2idle works even without the new feature bit:
    	# echo s2idle > /sys/power/mem_sleep
    	# echo mem > /sys/power/state
    	[   52.083725] PM: suspend entry (s2idle)
    	[   52.095950] Filesystems sync: 0.010 seconds
    	[   52.101493] Freezing user space processes
    	[   52.104213] Freezing user space processes completed (elapsed 0.001 seconds)
    	[   52.106520] OOM killer disabled.
    	[   52.107655] Freezing remaining freezable tasks
    	[   52.110880] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
    	[   52.113296] printk: Suspending console(s) (use no_console_suspend to debug)
    
    S3 does not work without the feature bit when memory is plugged:
    	# echo deep > /sys/power/mem_sleep
    	# echo mem > /sys/power/state
    	[   32.788281] PM: suspend entry (deep)
    	[   32.816630] Filesystems sync: 0.027 seconds
    	[   32.820029] Freezing user space processes
    	[   32.823870] Freezing user space processes completed (elapsed 0.001 seconds)
    	[   32.827756] OOM killer disabled.
    	[   32.829608] Freezing remaining freezable tasks
    	[   32.833842] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
    	[   32.837953] printk: Suspending console(s) (use no_console_suspend to debug)
    	[   32.916172] virtio_mem virtio0: suspend+resume with plugged memory is not supported
    	[   32.916181] virtio-pci 0000:00:02.0: PM: pci_pm_suspend(): virtio_pci_freeze+0x0/0x50 returns -1
    	[   32.916197] virtio-pci 0000:00:02.0: PM: dpm_run_callback(): pci_pm_suspend+0x0/0x170 returns -1
    	[   32.916210] virtio-pci 0000:00:02.0: PM: failed to suspend async: error -1
    
    But S3 works with the new feature bit when memory is plugged (patched
    QEMU):
    	# echo deep > /sys/power/mem_sleep
    	# echo mem > /sys/power/state
    	[   33.983694] PM: suspend entry (deep)
    	[   34.009828] Filesystems sync: 0.024 seconds
    	[   34.013589] Freezing user space processes
    	[   34.016722] Freezing user space processes completed (elapsed 0.001 seconds)
    	[   34.019092] OOM killer disabled.
    	[   34.020291] Freezing remaining freezable tasks
    	[   34.023549] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
    	[   34.026090] printk: Suspending console(s) (use no_console_suspend to debug)
    
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Signed-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Message-Id: <20240318120645.105664-1-david@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    e4544c55
virtio_mem.c 82.5 KB