Commit d822ccae authored by Gerd Hoffmann's avatar Gerd Hoffmann

drm/virtio: fix virtio_gpu_execbuffer_ioctl locking

Lockdep says we can't call vmemdup() while having objects reserved
because it needs the mmap semaphore.  So reorder the calls reserve
the objects later.
Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Reviewed-by: default avatarChia-I Wu <olvaffe@gmail.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20200211135047.22261-2-kraxel@redhat.com
parent 0f065863
...@@ -126,22 +126,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, ...@@ -126,22 +126,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
bo_handles = NULL; bo_handles = NULL;
} }
if (buflist) {
ret = virtio_gpu_array_lock_resv(buflist);
if (ret)
goto out_unused_fd;
}
buf = vmemdup_user(u64_to_user_ptr(exbuf->command), exbuf->size); buf = vmemdup_user(u64_to_user_ptr(exbuf->command), exbuf->size);
if (IS_ERR(buf)) { if (IS_ERR(buf)) {
ret = PTR_ERR(buf); ret = PTR_ERR(buf);
goto out_unresv; goto out_unused_fd;
}
if (buflist) {
ret = virtio_gpu_array_lock_resv(buflist);
if (ret)
goto out_memdup;
} }
out_fence = virtio_gpu_fence_alloc(vgdev); out_fence = virtio_gpu_fence_alloc(vgdev);
if(!out_fence) { if(!out_fence) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_memdup; goto out_unresv;
} }
if (out_fence_fd >= 0) { if (out_fence_fd >= 0) {
...@@ -160,11 +160,11 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, ...@@ -160,11 +160,11 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
vfpriv->ctx_id, buflist, out_fence); vfpriv->ctx_id, buflist, out_fence);
return 0; return 0;
out_memdup:
kvfree(buf);
out_unresv: out_unresv:
if (buflist) if (buflist)
virtio_gpu_array_unlock_resv(buflist); virtio_gpu_array_unlock_resv(buflist);
out_memdup:
kvfree(buf);
out_unused_fd: out_unused_fd:
kvfree(bo_handles); kvfree(bo_handles);
if (buflist) if (buflist)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment