On 5/26/26 22:28, [email protected] wrote: > From: Dongwon Kim <[email protected]> > > This patch series implements the .freeze and .restore hooks for the virtio-gpu > driver, alongside a PM notifier to properly handle object tracking and > restoration for S4 (hibernation) scenarios. > > The first patch adds the `virtgpu_freeze` and `virtgpu_restore` functions. > These functions orchestrate flushing pending work, safely deleting virtio > queues before suspension once they are empty, and recreating them during > the restoration process. > > The second patch implements a tracking and recreation mechanism for active > `virtio_gpu_object` instances. This is necessary because the host hypervisor > (e.g., QEMU) terminates or resets the backend during a full hibernation > cycle, > wiping out all previously established graphics resources and causing > post-resume > errors in the guest. > > The third patch integrates a PM notifier block into the driver. It captures > the PM_HIBERNATION_PREPARE phase to check compatibility (blocking S4 if Virgl > 3D is active) and sets a state flag. This flag instructs `virtgpu_restore` to > fully re-submit and restore active GPU objects immediately after the fresh > virtqueues are reconfigured. > > These changes ensure that the virtio-gpu driver can cleanly survive guest > hibernation without experiencing host-side resource loss. > > v2: 10ms sleep is added in virtgpu_freeze to avoid the situation > the driver is locked up during resumption. > > v3: Plain 10ms delay (v2) is replaced with wait calls which wait until > the virtio queue is empty. > (Dmitry Osipenko) > > v4: New version of patchset only covers S4 case because loss of resources in > S3 > case can be avoided by skipping virtio-gpu-reset in QEMU > (hw/display/virtio-gpu.c). > To skip virtio-gpu-reset (soft-reset), virtio-gpu-pci device should be > attached to > PCIE bus AND a PCIE option, 'x-pcie-pm-no-soft-reset' should added and > set to 'true'. > (e.g. -device virtio-gpu-pci,bus=port,x-pcie-pm-no-soft-reset=true) > > v5: Remove virtio_gpu_object from the restore list before freeing the object > to prevent an use-after-free situation. > (Nirmoy Das) > > Protect restore list operations with a spinlock > (Nirmoy Das) > > Move restore list node into virtio_gpu_bo struct to reduce memory usage > (Dmitry Osipenko) > > Remove unused header - drm_atomic_helper.h > (Dmitry Osipenko) > > v6: Include object backed by imported dmabuf > (Dmitry Osipenko) > > Not storing virgl objects in the restore_list as virgl 3D objects are not > recoverable. > (Dmitry Osipenko) > > Change the name 'list',a node in restore_list to 'restore_node' > (Nirmoy Das) > > Use mutex instead of spinlock when updating restore_list > (Nirmoy Das) > > Initialize restore_node when virtio_gpu_object is created - this is to > check if the node is in the list with 'list_empty' before removing it. > > Restoring objects in the PM notifier is too late, as virtio-gpu > message communication begins in virtgpu_restore once virtqueues > are re-established. To address this, a 'hibernation' flag is set > during the PM_HIBERNATION_PREPARE phase in the notifier. This flag > is then used in virtgpu_restore to detect if the system is resuming > from S4, allowing objects to be recovered immediately after virtqueues > are reconfigured. > > v7: Add a helper, virtio_gpu_add_object_to_restore_list > (Dmitry Osipenko) > > Unreference all objects before hibernation so they can be removed > on the host side, since they will be fully restored anyway. This > prevents the situation where host-side hibernation fails (leaving > all associated resources still alive) while the virtio-gpu driver > still attempts to restore those objects. > (Dmitry Osipenko) > > v8: Add drm_print.h to virtgpu_prime.c > > v9: Move duplicate wait_event_timeout blocks into a single > virtio_gpu_wait_queue helper function. > (Dmitry Osipenko) > > Handle timeouts gracefully by returning -ETIMEDOUT to abort > the freeze operation if the host hangs. > (Dmitry Osipenko) > > Dongwon Kim (3): > drm/virtio: Freeze and restore hooks to support suspend and resume > drm/virtio: Add support for saving and restoring virtio_gpu_objects > drm/virtio: Add PM notifier to restore objects after hibernation > > drivers/gpu/drm/virtio/virtgpu_drv.c | 80 ++++++++++++++++++++++- > drivers/gpu/drm/virtio/virtgpu_drv.h | 25 ++++++- > drivers/gpu/drm/virtio/virtgpu_kms.c | 54 +++++++++++++-- > drivers/gpu/drm/virtio/virtgpu_object.c | 87 ++++++++++++++++++++++++- > drivers/gpu/drm/virtio/virtgpu_prime.c | 45 ++++++++++++- > drivers/gpu/drm/virtio/virtgpu_vq.c | 30 ++++++++- > drivers/gpu/drm/virtio/virtgpu_vram.c | 5 +- > 7 files changed, 312 insertions(+), 14 deletions(-) >
Applied to misc next, thanks! Addressed and inlined fixes for issues reported on [1], plus made misc minor improvements and fixes: - added missing drm_mode_config_helper_resume() - use proper types for vars - remove extra blank line - rename hibernation -> hibernated - improved error messages, telling more what failed - removed inclusion of pm_runtime.h - properly handle register_pm_notifier failure [1] https://lore.gitlab.freedesktop.org/drm-ai-reviews/[email protected]/T/#u -- Best regards, Dmitry
