Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/virtgpu api: define a dummy fence signaled event

The current virtgpu implementation of poll(..) drops events
when VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK is enabled (otherwise
it's like a normal DRM driver).

This is because paravirtualized userspaces receives responses in a
buffer of type BLOB_MEM_GUEST, not by read(..).

To be in line with other DRM drivers and avoid specialized behavior,
it is possible to define a dummy event for virtgpu. Paravirtualized
userspace will now have to call read(..) on the DRM fd to receive the
dummy event.

Fixes: b10790434cf2 ("drm/virtgpu api: create context init feature")
Reported-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20211122232210.602-2-gurchetansingh@google.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

authored by

Gurchetan Singh and committed by
Gerd Hoffmann
7e78781d e048834c

+8 -2
-1
drivers/gpu/drm/virtio/virtgpu_drv.h
··· 138 138 spinlock_t lock; 139 139 }; 140 140 141 - #define VIRTGPU_EVENT_FENCE_SIGNALED_INTERNAL 0x10000000 142 141 struct virtio_gpu_fence_event { 143 142 struct drm_pending_event base; 144 143 struct drm_event event;
+1 -1
drivers/gpu/drm/virtio/virtgpu_ioctl.c
··· 54 54 if (!e) 55 55 return -ENOMEM; 56 56 57 - e->event.type = VIRTGPU_EVENT_FENCE_SIGNALED_INTERNAL; 57 + e->event.type = VIRTGPU_EVENT_FENCE_SIGNALED; 58 58 e->event.length = sizeof(e->event); 59 59 60 60 ret = drm_event_reserve_init(dev, file, &e->base, &e->event);
+7
include/uapi/drm/virtgpu_drm.h
··· 196 196 __u64 ctx_set_params; 197 197 }; 198 198 199 + /* 200 + * Event code that's given when VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK is in 201 + * effect. The event size is sizeof(drm_event), since there is no additional 202 + * payload. 203 + */ 204 + #define VIRTGPU_EVENT_FENCE_SIGNALED 0x90000000 205 + 199 206 #define DRM_IOCTL_VIRTGPU_MAP \ 200 207 DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map) 201 208