| From 52ce134310edec31deee95091661e17e7e56e932 Mon Sep 17 00:00:00 2001 |
| From: Mika Kuoppala <mika.kuoppala@linux.intel.com> |
| Date: Thu, 2 May 2013 16:48:08 +0300 |
| Subject: drm/i915: add context into request struct |
| |
| Storing context reference into request struct |
| allows us to inspect context and its associated |
| objects when requests are retired. |
| |
| Both ppgtt and arb robustness work will need |
| this. |
| |
| Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> |
| Reviewed-by: Ben Widawsky <ben@bwidawsk.net> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 0e50e96bf2d89c3415cb68aead301f485938f1ca) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_drv.h | 3 +++ |
| drivers/gpu/drm/i915/i915_gem.c | 24 ++++++++++++++++++------ |
| 2 files changed, 21 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
| index aac5740f1ee9..b5cdc737232f 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1271,6 +1271,9 @@ struct drm_i915_gem_request { |
| /** Postion in the ringbuffer of the end of the request */ |
| u32 tail; |
| |
| + /** Context related to this request */ |
| + struct i915_hw_context *ctx; |
| + |
| /** Time at which this request was emitted, in jiffies. */ |
| unsigned long emitted_jiffies; |
| |
| diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
| index 0a30088178b0..34a1d71655a3 100644 |
| --- a/drivers/gpu/drm/i915/i915_gem.c |
| +++ b/drivers/gpu/drm/i915/i915_gem.c |
| @@ -2053,6 +2053,11 @@ i915_add_request(struct intel_ring_buffer *ring, |
| request->seqno = intel_ring_get_seqno(ring); |
| request->ring = ring; |
| request->tail = request_ring_position; |
| + request->ctx = ring->last_context; |
| + |
| + if (request->ctx) |
| + i915_gem_context_reference(request->ctx); |
| + |
| request->emitted_jiffies = jiffies; |
| was_empty = list_empty(&ring->request_list); |
| list_add_tail(&request->list, &ring->request_list); |
| @@ -2105,6 +2110,17 @@ i915_gem_request_remove_from_client(struct drm_i915_gem_request *request) |
| spin_unlock(&file_priv->mm.lock); |
| } |
| |
| +static void i915_gem_free_request(struct drm_i915_gem_request *request) |
| +{ |
| + list_del(&request->list); |
| + i915_gem_request_remove_from_client(request); |
| + |
| + if (request->ctx) |
| + i915_gem_context_unreference(request->ctx); |
| + |
| + kfree(request); |
| +} |
| + |
| static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, |
| struct intel_ring_buffer *ring) |
| { |
| @@ -2115,9 +2131,7 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, |
| struct drm_i915_gem_request, |
| list); |
| |
| - list_del(&request->list); |
| - i915_gem_request_remove_from_client(request); |
| - kfree(request); |
| + i915_gem_free_request(request); |
| } |
| |
| while (!list_empty(&ring->active_list)) { |
| @@ -2208,9 +2222,7 @@ i915_gem_retire_requests_ring(struct intel_ring_buffer *ring) |
| */ |
| ring->last_retired_head = request->tail; |
| |
| - list_del(&request->list); |
| - i915_gem_request_remove_from_client(request); |
| - kfree(request); |
| + i915_gem_free_request(request); |
| } |
| |
| /* Move any buffers on the active list that are no longer referenced |
| -- |
| 1.8.5.rc3 |
| |