forked from Minki/linux
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: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Chia-I Wu <olvaffe@gmail.com> Link: http://patchwork.freedesktop.org/patch/msgid/20200211135047.22261-2-kraxel@redhat.com
This commit is contained in:
parent
0f0658636d
commit
d822ccae8e
@ -126,22 +126,22 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
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);
|
||||
if (IS_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);
|
||||
if(!out_fence) {
|
||||
ret = -ENOMEM;
|
||||
goto out_memdup;
|
||||
goto out_unresv;
|
||||
}
|
||||
|
||||
if (out_fence_fd >= 0) {
|
||||
@ -160,11 +160,11 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
vfpriv->ctx_id, buflist, out_fence);
|
||||
return 0;
|
||||
|
||||
out_memdup:
|
||||
kvfree(buf);
|
||||
out_unresv:
|
||||
if (buflist)
|
||||
virtio_gpu_array_unlock_resv(buflist);
|
||||
out_memdup:
|
||||
kvfree(buf);
|
||||
out_unused_fd:
|
||||
kvfree(bo_handles);
|
||||
if (buflist)
|
||||
|
Loading…
Reference in New Issue
Block a user