Skip to content

Commit

Permalink
drm/i915: Grab execlist spinlock to avoid post-reset concurrency issues.
Browse files Browse the repository at this point in the history
Grab execlist lock when cleaning up execlist queues after GPU reset to avoid
concurrency problems between the context event interrupt handler and the reset
path immediately following a GPU reset.

* v2 (Chris Wilson):
Do execlist check and use simpler form of spinlock functions.

Signed-off-by: Tomas Elf <tomas.elf@intel.com>
Reviewed-by: Dave Gordon <david.s.gordon@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Tomas Elf authored and Daniel Vetter committed Oct 22, 2015
1 parent 5105672 commit 7de1691
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2753,18 +2753,23 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
* are the ones that keep the context and ringbuffer backing objects
* pinned in place.
*/
while (!list_empty(&ring->execlist_queue)) {
struct drm_i915_gem_request *submit_req;

submit_req = list_first_entry(&ring->execlist_queue,
struct drm_i915_gem_request,
execlist_link);
list_del(&submit_req->execlist_link);
if (i915.enable_execlists) {
spin_lock_irq(&ring->execlist_lock);
while (!list_empty(&ring->execlist_queue)) {
struct drm_i915_gem_request *submit_req;

if (submit_req->ctx != ring->default_context)
intel_lr_context_unpin(submit_req);
submit_req = list_first_entry(&ring->execlist_queue,
struct drm_i915_gem_request,
execlist_link);
list_del(&submit_req->execlist_link);

i915_gem_request_unreference(submit_req);
if (submit_req->ctx != ring->default_context)
intel_lr_context_unpin(submit_req);

i915_gem_request_unreference(submit_req);
}
spin_unlock_irq(&ring->execlist_lock);
}

/*
Expand Down

0 comments on commit 7de1691

Please sign in to comment.