1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- From 4b137e2962b14c62089f4368391fa1ed03cac391 Mon Sep 17 00:00:00 2001
- From: Eric Anholt <eric@anholt.net>
- Date: Mon, 19 Oct 2015 08:44:35 -0700
- Subject: [PATCH 096/381] drm/vc4: Drop struct_mutex around CL validation.
- We were using it so that we could make sure that shader validation
- state didn't change while we were validating, but now shader
- validation state is immutable. The bcl/rcl generation doesn't do any
- other BO dereferencing, and seems to have no other global state
- dependency not covered by job_lock / bo_lock. We only need to hold
- struct_mutex for object unreferencing.
- Fixes a lock order reversal between mmap_sem and struct_mutex.
- Signed-off-by: Eric Anholt <eric@anholt.net>
- ---
- drivers/gpu/drm/vc4/vc4_gem.c | 13 ++++++-------
- 1 file changed, 6 insertions(+), 7 deletions(-)
- --- a/drivers/gpu/drm/vc4/vc4_gem.c
- +++ b/drivers/gpu/drm/vc4/vc4_gem.c
- @@ -439,10 +439,12 @@ fail:
- }
-
- static void
- -vc4_complete_exec(struct vc4_exec_info *exec)
- +vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
- {
- unsigned i;
-
- + /* Need the struct lock for drm_gem_object_unreference(). */
- + mutex_lock(&dev->struct_mutex);
- if (exec->bo) {
- for (i = 0; i < exec->bo_count; i++)
- drm_gem_object_unreference(&exec->bo[i].bo->base);
- @@ -455,6 +457,7 @@ vc4_complete_exec(struct vc4_exec_info *
- list_del(&bo->unref_head);
- drm_gem_object_unreference(&bo->base.base);
- }
- + mutex_unlock(&dev->struct_mutex);
-
- kfree(exec);
- }
- @@ -473,7 +476,7 @@ vc4_job_handle_completed(struct vc4_dev
- list_del(&exec->head);
-
- spin_unlock_irqrestore(&vc4->job_lock, irqflags);
- - vc4_complete_exec(exec);
- + vc4_complete_exec(vc4->dev, exec);
- spin_lock_irqsave(&vc4->job_lock, irqflags);
- }
-
- @@ -525,12 +528,8 @@ vc4_job_done_work(struct work_struct *wo
- {
- struct vc4_dev *vc4 =
- container_of(work, struct vc4_dev, job_done_work);
- - struct drm_device *dev = vc4->dev;
-
- - /* Need the struct lock for drm_gem_object_unreference(). */
- - mutex_lock(&dev->struct_mutex);
- vc4_job_handle_completed(vc4);
- - mutex_unlock(&dev->struct_mutex);
- }
-
- static int
- @@ -639,7 +638,7 @@ vc4_submit_cl_ioctl(struct drm_device *d
- return 0;
-
- fail:
- - vc4_complete_exec(exec);
- + vc4_complete_exec(vc4->dev, exec);
-
- return ret;
- }
|