mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-25 21:15:18 -04:00
drm/msm: Use idr_preload()
Avoid allocation under idr_lock, to prevent deadlock against the job_free() path (which runs on same thread as job_run(), which makes it also part of the fence-signaling path. Signed-off-by: Rob Clark <robdclark@chromium.org> Patchwork: https://patchwork.freedesktop.org/patch/527847/ Link: https://lore.kernel.org/r/20230320144356.803762-12-robdclark@gmail.com
This commit is contained in:
@@ -882,6 +882,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
|
||||
submit->nr_cmds = i;
|
||||
|
||||
idr_preload(GFP_KERNEL);
|
||||
|
||||
spin_lock(&queue->idr_lock);
|
||||
|
||||
/*
|
||||
@@ -893,6 +895,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
if ((args->flags & MSM_SUBMIT_FENCE_SN_IN) &&
|
||||
idr_find(&queue->fence_idr, args->fence)) {
|
||||
spin_unlock(&queue->idr_lock);
|
||||
idr_preload_end();
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -910,7 +913,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
submit->fence_id = args->fence;
|
||||
ret = idr_alloc_u32(&queue->fence_idr, submit->user_fence,
|
||||
&submit->fence_id, submit->fence_id,
|
||||
GFP_KERNEL);
|
||||
GFP_NOWAIT);
|
||||
/*
|
||||
* We've already validated that the fence_id slot is valid,
|
||||
* so if idr_alloc_u32 failed, it is a kernel bug
|
||||
@@ -923,10 +926,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
||||
*/
|
||||
submit->fence_id = idr_alloc_cyclic(&queue->fence_idr,
|
||||
submit->user_fence, 1,
|
||||
INT_MAX, GFP_KERNEL);
|
||||
INT_MAX, GFP_NOWAIT);
|
||||
}
|
||||
|
||||
spin_unlock(&queue->idr_lock);
|
||||
idr_preload_end();
|
||||
|
||||
if (submit->fence_id < 0) {
|
||||
ret = submit->fence_id;
|
||||
|
||||
Reference in New Issue
Block a user