From 377939b713ca89de92573e3f3662b805fecc95d5 Mon Sep 17 00:00:00 2001 From: Pengpeng Hou Date: Thu, 25 Jun 2026 11:02:02 +0800 Subject: [PATCH] drm/virtio: fail init on display-info timeout virtio_gpu_init() sends GET_DISPLAY_INFO when scanouts are present and waits for display_info_pending to clear. If the response never arrives, the wait result is ignored and probe still succeeds. Return -ETIMEDOUT on display-info timeout. Because this happens after virtio_device_ready(), reset the device and tear down modesetting before using the existing vbuf and virtqueue cleanup path. Signed-off-by: Pengpeng Hou Signed-off-by: Dmitry Osipenko Link: https://patchwork.freedesktop.org/patch/735301/ [dmitry.osipenko@collabora.com: rebase on misc-next] --- drivers/gpu/drm/virtio/virtgpu_kms.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/virtgpu_kms.c index 922782bdc9cd..223d5d513b5a 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -301,18 +301,24 @@ int virtio_gpu_init(struct virtio_device *vdev, struct drm_device *dev) virtio_gpu_cmd_get_edids(vgdev); virtio_gpu_cmd_get_display_info(vgdev); virtio_gpu_notify(vgdev); - wait_event_timeout(vgdev->resp_wq, !vgdev->display_info_pending, - 5 * HZ); + if (!wait_event_timeout(vgdev->resp_wq, + !vgdev->display_info_pending, + 5 * HZ)) { + DRM_ERROR("timed out waiting for display info\n"); + ret = -ETIMEDOUT; + goto err_reset_device; + } } vgdev->pm_nb.notifier_call = virtio_gpu_pm_notifier; ret = register_pm_notifier(&vgdev->pm_nb); if (ret) - goto err_modeset_fini; + goto err_reset_device; return 0; -err_modeset_fini: +err_reset_device: + virtio_reset_device(vgdev->vdev); virtio_gpu_modeset_fini(vgdev); err_scanouts: virtio_gpu_free_vbufs(vgdev);