Add a reference and pointer from the execlist queue item to the associated
gem request. For execlist requests that don't have a request, create one
as a placeholder.

This patchset requires John Harrison's "Replace seqno values with request 
structures"
patchset.

Issue: VIZ-4274
Signed-off-by: Nick Hoath <nicholas.ho...@intel.com>
---
 drivers/gpu/drm/i915/intel_lrc.c | 31 +++++++++++++++++++++++++------
 drivers/gpu/drm/i915/intel_lrc.h |  5 ++++-
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index c8b3827..593471f 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -521,6 +521,7 @@ static void execlists_free_request_task(struct work_struct 
*work)
 
        mutex_lock(&dev->struct_mutex);
        i915_gem_context_unreference(req->ctx);
+       i915_gem_request_unreference(req->request);
        mutex_unlock(&dev->struct_mutex);
 
        kfree(req);
@@ -528,7 +529,8 @@ static void execlists_free_request_task(struct work_struct 
*work)
 
 static int execlists_context_queue(struct intel_engine_cs *ring,
                                   struct intel_context *to,
-                                  u32 tail)
+                                  u32 tail,
+                                  struct drm_i915_gem_request *request)
 {
        struct intel_ctx_submit_request *req = NULL, *cursor;
        struct drm_i915_private *dev_priv = ring->dev->dev_private;
@@ -544,6 +546,22 @@ static int execlists_context_queue(struct intel_engine_cs 
*ring,
        req->tail = tail;
        INIT_WORK(&req->work, execlists_free_request_task);
 
+       if(!request)
+       {
+               /*
+                * If there isn't a request associated with this submission,
+                * create one as a temporary holder.
+                */
+               WARN(1, "execlist context submission without request");
+               request = kzalloc(sizeof(*request), GFP_KERNEL);
+               if (request == NULL)
+                       return -ENOMEM;
+               request->ctx = to;
+               request->ring = ring;
+       }
+       req->request = request;
+       i915_gem_request_reference(request);
+
        intel_runtime_pm_get(dev_priv);
 
        spin_lock_irqsave(&ring->execlist_lock, flags);
@@ -778,7 +796,8 @@ int logical_ring_flush_all_caches(struct intel_ringbuffer 
*ringbuf)
  * on a queue waiting for the ELSP to be ready to accept a new context 
submission. At that
  * point, the tail *inside* the context is updated and the ELSP written to.
  */
-void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf)
+void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf,
+                                          struct drm_i915_gem_request *request)
 {
        struct intel_engine_cs *ring = ringbuf->ring;
        struct intel_context *ctx = ringbuf->FIXME_lrc_ctx;
@@ -788,7 +807,7 @@ void intel_logical_ring_advance_and_submit(struct 
intel_ringbuffer *ringbuf)
        if (intel_ring_stopped(ring))
                return;
 
-       execlists_context_queue(ring, ctx, ringbuf->tail);
+       execlists_context_queue(ring, ctx, ringbuf->tail, request);
 }
 
 static int logical_ring_alloc_request(struct intel_engine_cs *ring,
@@ -876,7 +895,7 @@ static int logical_ring_wait_for_space(struct 
intel_ringbuffer *ringbuf,
                return ret;
 
        /* Force the context submission in case we have been skipping it */
-       intel_logical_ring_advance_and_submit(ringbuf);
+       intel_logical_ring_advance_and_submit(ringbuf, NULL);
 
        /* With GEM the hangcheck timer should kick us out of the loop,
         * leaving it early runs the risk of corrupting GEM state (due
@@ -1221,7 +1240,7 @@ static void gen8_set_seqno(struct intel_engine_cs *ring, 
u32 seqno)
        intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno);
 }
 
-static int gen8_emit_request(struct intel_ringbuffer *ringbuf)
+static int gen8_emit_request(struct intel_ringbuffer *ringbuf, struct 
drm_i915_gem_request *request)
 {
        struct intel_engine_cs *ring = ringbuf->ring;
        u32 cmd;
@@ -1243,7 +1262,7 @@ static int gen8_emit_request(struct intel_ringbuffer 
*ringbuf)
                i915_gem_request_get_seqno(ring->outstanding_lazy_request));
        intel_logical_ring_emit(ringbuf, MI_USER_INTERRUPT);
        intel_logical_ring_emit(ringbuf, MI_NOOP);
-       intel_logical_ring_advance_and_submit(ringbuf);
+       intel_logical_ring_advance_and_submit(ringbuf, request);
 
        return 0;
 }
diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h
index 33c3b4b..6f81669 100644
--- a/drivers/gpu/drm/i915/intel_lrc.h
+++ b/drivers/gpu/drm/i915/intel_lrc.h
@@ -37,7 +37,8 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring);
 int intel_logical_rings_init(struct drm_device *dev);
 
 int logical_ring_flush_all_caches(struct intel_ringbuffer *ringbuf);
-void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf);
+void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf,
+                                          struct drm_i915_gem_request 
*request);
 /**
  * intel_logical_ring_advance() - advance the ringbuffer tail
  * @ringbuf: Ringbuffer to advance.
@@ -107,6 +108,8 @@ struct intel_ctx_submit_request {
        struct work_struct work;
 
        int elsp_submitted;
+
+       struct drm_i915_gem_request *request;
 };
 
 void intel_execlists_handle_ctx_events(struct intel_engine_cs *ring);
-- 
2.1.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to