Commit 4680816b authored by Chris Wilson's avatar Chris Wilson

drm/i915: Wait first for submission, before waiting for request completion

In future patches, we will no longer be able to wait on a static global
seqno and instead have to break our wait up into phases. First we wait
for the global seqno assignment (upon submission to hardware), and once
submitted we wait for the hardware to complete.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161028125858.23563-25-chris@chris-wilson.co.uk
parent 3033acab
...@@ -789,6 +789,49 @@ bool __i915_spin_request(const struct drm_i915_gem_request *req, ...@@ -789,6 +789,49 @@ bool __i915_spin_request(const struct drm_i915_gem_request *req,
return false; return false;
} }
static long
__i915_request_wait_for_submit(struct drm_i915_gem_request *request,
unsigned int flags,
long timeout)
{
const int state = flags & I915_WAIT_INTERRUPTIBLE ?
TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
wait_queue_head_t *q = &request->i915->gpu_error.wait_queue;
DEFINE_WAIT(reset);
DEFINE_WAIT(wait);
if (flags & I915_WAIT_LOCKED)
add_wait_queue(q, &reset);
do {
prepare_to_wait(&request->submit.wait, &wait, state);
if (i915_sw_fence_done(&request->submit))
break;
if (flags & I915_WAIT_LOCKED &&
i915_reset_in_progress(&request->i915->gpu_error)) {
__set_current_state(TASK_RUNNING);
i915_reset(request->i915);
reset_wait_queue(q, &reset);
continue;
}
if (signal_pending_state(state, current)) {
timeout = -ERESTARTSYS;
break;
}
timeout = io_schedule_timeout(timeout);
} while (timeout);
finish_wait(&request->submit.wait, &wait);
if (flags & I915_WAIT_LOCKED)
remove_wait_queue(q, &reset);
return timeout;
}
/** /**
* i915_wait_request - wait until execution of request has finished * i915_wait_request - wait until execution of request has finished
* @req: the request to wait upon * @req: the request to wait upon
...@@ -833,6 +876,14 @@ long i915_wait_request(struct drm_i915_gem_request *req, ...@@ -833,6 +876,14 @@ long i915_wait_request(struct drm_i915_gem_request *req,
trace_i915_gem_request_wait_begin(req); trace_i915_gem_request_wait_begin(req);
if (!i915_sw_fence_done(&req->submit)) {
timeout = __i915_request_wait_for_submit(req, flags, timeout);
if (timeout < 0)
goto complete;
GEM_BUG_ON(!i915_sw_fence_done(&req->submit));
}
/* Optimistic short spin before touching IRQs */ /* Optimistic short spin before touching IRQs */
if (i915_spin_request(req, state, 5)) if (i915_spin_request(req, state, 5))
goto complete; goto complete;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment