Skip to content

Commit

Permalink
drm/i915: Refine i915_reset.lock_map
Browse files Browse the repository at this point in the history
We already use a mutex to serialise i915_reset() and wedging, so all we
need it to link that into i915_request_wait() and we have our lock cycle
detection.

v2.5: Take error mutex for selftests

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190614071023.17929-3-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Jun 14, 2019
1 parent 6e4e970 commit 84383d2
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 19 deletions.
6 changes: 2 additions & 4 deletions drivers/gpu/drm/i915/gt/intel_reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -978,7 +978,7 @@ void i915_reset(struct drm_i915_private *i915,

might_sleep();
GEM_BUG_ON(!test_bit(I915_RESET_BACKOFF, &error->flags));
lock_map_acquire(&i915->gt.reset_lockmap);
mutex_lock(&error->wedge_mutex);

/* Clear any previous failed attempts at recovery. Time to try again. */
if (!__i915_gem_unset_wedged(i915))
Expand Down Expand Up @@ -1031,7 +1031,7 @@ void i915_reset(struct drm_i915_private *i915,
finish:
reset_finish(i915);
unlock:
lock_map_release(&i915->gt.reset_lockmap);
mutex_unlock(&error->wedge_mutex);
return;

taint:
Expand Down Expand Up @@ -1147,9 +1147,7 @@ static void i915_reset_device(struct drm_i915_private *i915,
/* Flush everyone using a resource about to be clobbered */
synchronize_srcu_expedited(&error->reset_backoff_srcu);

mutex_lock(&error->wedge_mutex);
i915_reset(i915, engine_mask, reason);
mutex_unlock(&error->wedge_mutex);

intel_finish_reset(i915);
}
Expand Down
8 changes: 0 additions & 8 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1901,14 +1901,6 @@ struct drm_i915_private {
ktime_t last_init_time;

struct i915_vma *scratch;

/*
* We must never wait on the GPU while holding a lock as we
* may need to perform a GPU reset. So while we don't need to
* serialise wait/reset with an explicit lock, we do want
* lockdep to detect potential dependency cycles.
*/
struct lockdep_map reset_lockmap;
} gt;

struct {
Expand Down
3 changes: 0 additions & 3 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1746,16 +1746,13 @@ static void i915_gem_init__mm(struct drm_i915_private *i915)

int i915_gem_init_early(struct drm_i915_private *dev_priv)
{
static struct lock_class_key reset_key;
int err;

intel_gt_pm_init(dev_priv);

INIT_LIST_HEAD(&dev_priv->gt.active_rings);
INIT_LIST_HEAD(&dev_priv->gt.closed_vma);
spin_lock_init(&dev_priv->gt.closed_lock);
lockdep_init_map(&dev_priv->gt.reset_lockmap,
"i915.reset", &reset_key, 0);

i915_gem_init__mm(dev_priv);
i915_gem_init__pm(dev_priv);
Expand Down
12 changes: 10 additions & 2 deletions drivers/gpu/drm/i915/i915_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -1444,7 +1444,15 @@ long i915_request_wait(struct i915_request *rq,
return -ETIME;

trace_i915_request_wait_begin(rq, flags);
lock_map_acquire(&rq->i915->gt.reset_lockmap);

/*
* We must never wait on the GPU while holding a lock as we
* may need to perform a GPU reset. So while we don't need to
* serialise wait/reset with an explicit lock, we do want
* lockdep to detect potential dependency cycles.
*/
mutex_acquire(&rq->i915->gpu_error.wedge_mutex.dep_map,
0, 0, _THIS_IP_);

/*
* Optimistic spin before touching IRQs.
Expand Down Expand Up @@ -1520,7 +1528,7 @@ long i915_request_wait(struct i915_request *rq,
dma_fence_remove_callback(&rq->fence, &wait.cb);

out:
lock_map_release(&rq->i915->gt.reset_lockmap);
mutex_release(&rq->i915->gpu_error.wedge_mutex.dep_map, 0, _THIS_IP_);
trace_i915_request_wait_end(rq);
return timeout;
}
Expand Down
2 changes: 0 additions & 2 deletions drivers/gpu/drm/i915/selftests/mock_gem_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ static struct dev_pm_domain pm_domain = {

struct drm_i915_private *mock_gem_device(void)
{
static struct lock_class_key reset_key;
struct drm_i915_private *i915;
struct pci_dev *pdev;
int err;
Expand Down Expand Up @@ -205,7 +204,6 @@ struct drm_i915_private *mock_gem_device(void)
INIT_LIST_HEAD(&i915->gt.active_rings);
INIT_LIST_HEAD(&i915->gt.closed_vma);
spin_lock_init(&i915->gt.closed_lock);
lockdep_init_map(&i915->gt.reset_lockmap, "i915.reset", &reset_key, 0);

mutex_lock(&i915->drm.struct_mutex);

Expand Down

0 comments on commit 84383d2

Please sign in to comment.