drm/i915: Store the reset counter when constructing a request
As the request is only valid during the same global reset epoch, we can record the current reset_counter when constructing the request and reuse it when waiting upon that request in future. This removes a very hairy atomic check serialised by the struct_mutex at the time of waiting and allows us to transfer those waits to a central dispatcher for all waiters and all requests. PS: With per-engine resets, we obviously cannot assume a global reset epoch for the requests - a per-engine epoch makes the most sense. The challenge then is how to handle checking in the waiter for when to break the wait, as the fine-grained reset may also want to requeue the request (i.e. the assumption that just because the epoch changes the request is completed may be broken - or we just avoid breaking that assumption with the fine-grained resets). Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1460565315-7748-7-git-send-email-chris@chris-wilson.co.uk
This commit is contained in:
@@ -2364,7 +2364,6 @@ int intel_engine_idle(struct intel_engine_cs *engine)
|
||||
|
||||
/* Make sure we do not trigger any retires */
|
||||
return __i915_wait_request(req,
|
||||
i915_reset_counter(&req->i915->gpu_error),
|
||||
req->i915->mm.interruptible,
|
||||
NULL, NULL);
|
||||
}
|
||||
@@ -2495,11 +2494,6 @@ int intel_ring_begin(struct drm_i915_gem_request *req,
|
||||
engine = req->engine;
|
||||
dev_priv = req->i915;
|
||||
|
||||
ret = i915_gem_check_wedge(&dev_priv->gpu_error,
|
||||
dev_priv->mm.interruptible);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = __intel_ring_prepare(engine, num_dwords * sizeof(uint32_t));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user