Skip to content

Commit

Permalink
drm/i915: Nonblocking request submission
Browse files Browse the repository at this point in the history
Now that we have fences in place to drive request submission, we can
employ those to queue requests after their dependencies as opposed to
stalling in the middle of an execbuf ioctl. (However, we still choose to
spin before enabling the IRQ as that is faster - though contentious.)

v2: Do the fence ordering first, where we can still fail.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160909131201.16673-20-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Sep 9, 2016
1 parent 32c2b4b commit 0a046a0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
21 changes: 15 additions & 6 deletions drivers/gpu/drm/i915/i915_gem_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -477,12 +477,13 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,

trace_i915_gem_ring_sync_to(to, from);
if (!i915.semaphores) {
ret = i915_wait_request(from,
I915_WAIT_INTERRUPTIBLE |
I915_WAIT_LOCKED,
NULL, NO_WAITBOOST);
if (ret)
return ret;
if (!i915_spin_request(from, TASK_INTERRUPTIBLE, 2)) {
ret = i915_sw_fence_await_dma_fence(&to->submit,
&from->fence, 0,
GFP_KERNEL);
if (ret < 0)
return ret;
}
} else {
ret = to->engine->semaphore.sync_to(to, from);
if (ret)
Expand Down Expand Up @@ -577,6 +578,7 @@ void __i915_add_request(struct drm_i915_gem_request *request, bool flush_caches)
{
struct intel_engine_cs *engine = request->engine;
struct intel_ring *ring = request->ring;
struct drm_i915_gem_request *prev;
u32 request_start;
u32 reserved_tail;
int ret;
Expand Down Expand Up @@ -631,6 +633,13 @@ void __i915_add_request(struct drm_i915_gem_request *request, bool flush_caches)
* hangcheck. Hence we apply the barrier to ensure that we do not
* see a more recent value in the hws than we are tracking.
*/

prev = i915_gem_active_raw(&engine->last_request,
&request->i915->drm.struct_mutex);
if (prev)
i915_sw_fence_await_sw_fence(&request->submit, &prev->submit,
&request->submitq);

request->emitted_jiffies = jiffies;
request->previous_seqno = engine->last_submitted_seqno;
engine->last_submitted_seqno = request->fence.seqno;
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_gem_request.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ struct drm_i915_gem_request {
struct intel_signal_node signaling;

struct i915_sw_fence submit;
wait_queue_t submitq;

/** GEM sequence number associated with the previous request,
* when the HWS breadcrumb is equal to this the GPU is processing
Expand Down

0 comments on commit 0a046a0

Please sign in to comment.