drm/virtio: add worker for object release
Move object release into a separate worker. Releasing objects requires sending commands to the host. Doing that in the dequeue worker will cause deadlocks in case the command queue gets filled up, because the dequeue worker is also the one which will free up slots in the command queue. Reported-by: Chia-I Wu <olvaffe@gmail.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Chia-I Wu <olvaffe@gmail.com> Tested-by: Chia-I Wu <olvaffe@gmail.com> Link: http://patchwork.freedesktop.org/patch/msgid/20190830060116.10476-1-kraxel@redhat.com
This commit is contained in:
@@ -147,6 +147,11 @@ int virtio_gpu_init(struct drm_device *dev)
|
||||
INIT_WORK(&vgdev->config_changed_work,
|
||||
virtio_gpu_config_changed_work_func);
|
||||
|
||||
INIT_WORK(&vgdev->obj_free_work,
|
||||
virtio_gpu_array_put_free_work);
|
||||
INIT_LIST_HEAD(&vgdev->obj_free_list);
|
||||
spin_lock_init(&vgdev->obj_free_lock);
|
||||
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_VIRGL))
|
||||
vgdev->has_virgl_3d = true;
|
||||
@@ -226,6 +231,7 @@ void virtio_gpu_deinit(struct drm_device *dev)
|
||||
{
|
||||
struct virtio_gpu_device *vgdev = dev->dev_private;
|
||||
|
||||
flush_work(&vgdev->obj_free_work);
|
||||
vgdev->vqs_ready = false;
|
||||
flush_work(&vgdev->ctrlq.dequeue_work);
|
||||
flush_work(&vgdev->cursorq.dequeue_work);
|
||||
|
Reference in New Issue
Block a user