Skip to content

Commit e524436

Browse files
kwachowsjlawryno
authored andcommitted
accel/ivpu: Fix locking order in ivpu_cmdq_destroy_ioctl
Fix deadlock caused by inversed locking order in ivpu_job_submit() and ivpu_cmdq_destroy_ioctl(). Both functions operate locking file_priv->lock and submitted_jobs_lock. Unlock file_priv->lock in ivpu_cmdq_destroy_ioctl() before calling ivpu_cmdq_abort_all_jobs() function which locks submitted_jobs_lock. That way locking order is maintained: 1) global submitted_jobs_lock first 2) per context file_priv->lock second Signed-off-by: Karol Wachowski <[email protected]> Signed-off-by: Maciej Falkowski <[email protected]> Reviewed-by: Jacek Lawrynowicz <[email protected]> Signed-off-by: Jacek Lawrynowicz <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent ae06e0b commit e524436

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

drivers/accel/ivpu/ivpu_job.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@ int ivpu_cmdq_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file
883883
struct drm_ivpu_cmdq_destroy *args = data;
884884
struct ivpu_cmdq *cmdq;
885885
u32 cmdq_id;
886-
int ret = 0;
886+
int ret;
887887

888888
if (!ivpu_is_capable(vdev, DRM_IVPU_CAP_MANAGE_CMDQ))
889889
return -ENODEV;
@@ -893,13 +893,16 @@ int ivpu_cmdq_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file
893893
cmdq = xa_load(&file_priv->cmdq_xa, args->cmdq_id);
894894
if (!cmdq || cmdq->is_legacy) {
895895
ret = -ENOENT;
896-
goto unlock;
896+
goto err_unlock;
897897
}
898898

899899
cmdq_id = cmdq->id;
900900
ivpu_cmdq_destroy(file_priv, cmdq);
901+
mutex_unlock(&file_priv->lock);
901902
ivpu_cmdq_abort_all_jobs(vdev, file_priv->ctx.id, cmdq_id);
902-
unlock:
903+
return 0;
904+
905+
err_unlock:
903906
mutex_unlock(&file_priv->lock);
904907
return ret;
905908
}

0 commit comments

Comments
 (0)