[Intel-gfx] [RFC 3/5] drm/i915: Simplify runtime_pm reference for execlists
Nick Hoath
nicholas.hoath at intel.com
Thu Jul 9 03:57:42 PDT 2015
No longer take a runtime_pm reference for each execlist request. Only
take a single reference when the execlist queue becomes nonempty and
release it when it becomes empty.
Signed-off-by: Thomas Daniel <thomas.daniel at intel.com>
Signed-off-by: Nick Hoath <nicholas.hoath at intel.com>
---
drivers/gpu/drm/i915/i915_gem.c | 10 +++++++---
drivers/gpu/drm/i915/intel_lrc.c | 15 +++++++++++++--
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3681a33..d9f5e4d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2758,6 +2758,13 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
}
/*
+ * If we come in here, and the list wasn't empty, then there was
+ * a pm taken, so free it up now
+ */
+ if (!list_empty(&ring->execlist_queue))
+ intel_runtime_pm_put(dev_priv);
+
+ /*
* Clear the execlists queue up before freeing the requests, as those
* are the ones that keep the context and ringbuffer backing objects
* pinned in place.
@@ -2866,8 +2873,6 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
if (i915.enable_execlists) {
struct intel_context *ctx = request->ctx;
- struct drm_i915_private *dev_priv =
- ring->dev->dev_private;
unsigned long flags;
struct drm_i915_gem_object *ctx_obj =
ctx->engine[ring->id].state;
@@ -2877,7 +2882,6 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
if (ctx_obj && (ctx != ring->default_context))
intel_lr_context_unpin(ring, ctx);
- intel_runtime_pm_put(dev_priv);
spin_unlock_irqrestore(&ring->execlist_lock, flags);
}
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 8373900..adc4942 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -399,8 +399,16 @@ static void execlists_context_unqueue(struct intel_engine_cs *ring)
*/
WARN_ON(!intel_irqs_enabled(ring->dev->dev_private));
- if (list_empty(&ring->execlist_queue))
+ if (list_empty(&ring->execlist_queue)) {
+ /*
+ * We can only come in to this function if at some
+ * point there was a request queued. So if there
+ * are no longer any requests queued, it's time to
+ * put the pm
+ */
+ intel_runtime_pm_put(ring->dev->dev_private);
return;
+ }
/* Try to read in pairs */
list_for_each_entry_safe(cursor, tmp, &ring->execlist_queue,
@@ -546,6 +554,7 @@ bool intel_lrc_irq_handler(struct intel_engine_cs *ring)
static int execlists_context_queue(struct drm_i915_gem_request *request)
{
struct intel_engine_cs *ring = request->ring;
+ struct drm_i915_private *dev_priv = ring->dev->dev_private;
struct drm_i915_gem_request *cursor;
int num_elements = 0;
@@ -577,8 +586,10 @@ static int execlists_context_queue(struct drm_i915_gem_request *request)
}
list_add_tail(&request->execlist_link, &ring->execlist_queue);
- if (num_elements == 0)
+ if (num_elements == 0) {
+ intel_runtime_pm_get(dev_priv);
execlists_context_unqueue(ring);
+ }
spin_unlock_irq(&ring->execlist_lock);
--
2.1.1
More information about the Intel-gfx
mailing list