summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_guc_submission.c
diff options
context:
space:
mode:
authorChris Wilson2017-02-28 12:28:03 +0100
committerChris Wilson2017-02-28 15:56:45 +0100
commit0c33518db7d394d4eef1ce13f9dce32713f14beb (patch)
tree60324b8bfd05ff41e03f54a28c431532eae22233 /drivers/gpu/drm/i915/i915_guc_submission.c
parentdrm/i915/guc: Make wq_lock irq-safe (diff)
downloadkernel-qcow2-linux-0c33518db7d394d4eef1ce13f9dce32713f14beb.tar.gz
kernel-qcow2-linux-0c33518db7d394d4eef1ce13f9dce32713f14beb.tar.xz
kernel-qcow2-linux-0c33518db7d394d4eef1ce13f9dce32713f14beb.zip
drm/i915/guc: Reorder __i915_guc_submit to reduce spinlock holdtime
A couple of operations, the flushes and the tracepoint, do not require serialisation by client->wq_lock, so move them before we take it. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170228112803.11646-3-chris@chris-wilson.co.uk Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_guc_submission.c')
-rw-r--r--drivers/gpu/drm/i915/i915_guc_submission.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index d6a6cf2540a1..7b535a32fc27 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -517,18 +517,18 @@ static void __i915_guc_submit(struct drm_i915_gem_request *rq)
struct i915_guc_client *client = guc->execbuf_client;
int b_ret;
- /* We are always called with irqs disabled */
- GEM_BUG_ON(!irqs_disabled());
-
- spin_lock(&client->wq_lock);
- guc_wq_item_append(client, rq);
-
/* WA to flush out the pending GMADR writes to ring buffer. */
if (i915_vma_is_map_and_fenceable(rq->ring->vma))
POSTING_READ_FW(GUC_STATUS);
trace_i915_gem_request_in(rq, 0);
+ /* We are always called with irqs disabled */
+ GEM_BUG_ON(!irqs_disabled());
+
+ spin_lock(&client->wq_lock);
+
+ guc_wq_item_append(client, rq);
b_ret = guc_ring_doorbell(client);
client->submissions[engine_id] += 1;
@@ -538,6 +538,7 @@ static void __i915_guc_submit(struct drm_i915_gem_request *rq)
guc->submissions[engine_id] += 1;
guc->last_seqno[engine_id] = rq->global_seqno;
+
spin_unlock(&client->wq_lock);
}