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

Reply via email to