[Intel-gfx] [PATCH 13/19] drm/i915: Refactor execlists default context pinning

2016-04-21 Thread Chris Wilson
Refactor pinning and unpinning of contexts, such that the default
context for an engine is pinned during initialisation and unpinned
during teardown (pinning of the context handles the reference counting).
Thus we can eliminate the special case handling of the default context
that was required to mask that it was not being pinned normally.

v2: Rebalance context_queue after rebasing.
v3: Rebase to -nightly (not 40 patches in)

Signed-off-by: Chris Wilson 
Cc: Tvrtko Ursulin 
Reviewed-by: Tvrtko Ursulin 
Reviewed-by: Mika Kuoppala 
---
 drivers/gpu/drm/i915/i915_debugfs.c |   5 +-
 drivers/gpu/drm/i915/i915_gem.c |   2 +-
 drivers/gpu/drm/i915/intel_lrc.c| 107 ++--
 3 files changed, 43 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index f775451bd0b6..e81a7504656e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2095,9 +2095,8 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
return ret;
 
list_for_each_entry(ctx, _priv->context_list, link)
-   if (ctx != dev_priv->kernel_context)
-   for_each_engine(engine, dev_priv)
-   i915_dump_lrc_obj(m, ctx, engine);
+   for_each_engine(engine, dev_priv)
+   i915_dump_lrc_obj(m, ctx, engine);
 
mutex_unlock(>struct_mutex);
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3b294dcf0add..40e9a0e0f298 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2711,7 +2711,7 @@ void i915_gem_request_free(struct kref *req_ref)
i915_gem_request_remove_from_client(req);
 
if (ctx) {
-   if (i915.enable_execlists && ctx != req->i915->kernel_context)
+   if (i915.enable_execlists)
intel_lr_context_unpin(ctx, req->engine);
 
i915_gem_context_unreference(ctx);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 2ed7363f76ea..838abd4b42a3 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -588,9 +588,7 @@ static void execlists_context_queue(struct 
drm_i915_gem_request *request)
struct drm_i915_gem_request *cursor;
int num_elements = 0;
 
-   if (request->ctx != request->i915->kernel_context)
-   intel_lr_context_pin(request->ctx, engine);
-
+   intel_lr_context_pin(request->ctx, request->engine);
i915_gem_request_reference(request);
 
spin_lock_bh(>execlist_lock);
@@ -691,10 +689,7 @@ int intel_logical_ring_alloc_request_extras(struct 
drm_i915_gem_request *request
return ret;
}
 
-   if (request->ctx != request->i915->kernel_context)
-   ret = intel_lr_context_pin(request->ctx, request->engine);
-
-   return ret;
+   return intel_lr_context_pin(request->ctx, request->engine);
 }
 
 static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
@@ -774,12 +769,8 @@ intel_logical_ring_advance_and_submit(struct 
drm_i915_gem_request *request)
if (engine->last_context != request->ctx) {
if (engine->last_context)
intel_lr_context_unpin(engine->last_context, engine);
-   if (request->ctx != request->i915->kernel_context) {
-   intel_lr_context_pin(request->ctx, engine);
-   engine->last_context = request->ctx;
-   } else {
-   engine->last_context = NULL;
-   }
+   intel_lr_context_pin(request->ctx, engine);
+   engine->last_context = request->ctx;
}
 
if (dev_priv->guc.execbuf_client)
@@ -1000,12 +991,7 @@ void intel_execlists_retire_requests(struct 
intel_engine_cs *engine)
spin_unlock_bh(>execlist_lock);
 
list_for_each_entry_safe(req, tmp, _list, execlist_link) {
-   struct intel_context *ctx = req->ctx;
-   struct drm_i915_gem_object *ctx_obj =
-   ctx->engine[engine->id].state;
-
-   if (ctx_obj && (ctx != req->i915->kernel_context))
-   intel_lr_context_unpin(ctx, engine);
+   intel_lr_context_unpin(req->ctx, engine);
 
list_del(>execlist_link);
i915_gem_request_unreference(req);
@@ -1050,23 +1036,26 @@ int logical_ring_flush_all_caches(struct 
drm_i915_gem_request *req)
return 0;
 }
 
-static int intel_lr_context_do_pin(struct intel_context *ctx,
-  struct intel_engine_cs *engine)
+static int intel_lr_context_pin(struct intel_context *ctx,
+   

[Intel-gfx] [PATCH 13/19] drm/i915: Refactor execlists default context pinning

2016-04-21 Thread Chris Wilson
Refactor pinning and unpinning of contexts, such that the default
context for an engine is pinned during initialisation and unpinned
during teardown (pinning of the context handles the reference counting).
Thus we can eliminate the special case handling of the default context
that was required to mask that it was not being pinned normally.

v2: Rebalance context_queue after rebasing.
v3: Rebase to -nightly (not 40 patches in)

Signed-off-by: Chris Wilson 
Cc: Tvrtko Ursulin 
Reviewed-by: Tvrtko Ursulin 
Reviewed-by: Mika Kuoppala 
---
 drivers/gpu/drm/i915/i915_debugfs.c |   5 +-
 drivers/gpu/drm/i915/i915_gem.c |   2 +-
 drivers/gpu/drm/i915/intel_lrc.c| 107 ++--
 3 files changed, 43 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index f775451bd0b6..e81a7504656e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2095,9 +2095,8 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
return ret;
 
list_for_each_entry(ctx, _priv->context_list, link)
-   if (ctx != dev_priv->kernel_context)
-   for_each_engine(engine, dev_priv)
-   i915_dump_lrc_obj(m, ctx, engine);
+   for_each_engine(engine, dev_priv)
+   i915_dump_lrc_obj(m, ctx, engine);
 
mutex_unlock(>struct_mutex);
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 3b294dcf0add..40e9a0e0f298 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2711,7 +2711,7 @@ void i915_gem_request_free(struct kref *req_ref)
i915_gem_request_remove_from_client(req);
 
if (ctx) {
-   if (i915.enable_execlists && ctx != req->i915->kernel_context)
+   if (i915.enable_execlists)
intel_lr_context_unpin(ctx, req->engine);
 
i915_gem_context_unreference(ctx);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 2ed7363f76ea..838abd4b42a3 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -588,9 +588,7 @@ static void execlists_context_queue(struct 
drm_i915_gem_request *request)
struct drm_i915_gem_request *cursor;
int num_elements = 0;
 
-   if (request->ctx != request->i915->kernel_context)
-   intel_lr_context_pin(request->ctx, engine);
-
+   intel_lr_context_pin(request->ctx, request->engine);
i915_gem_request_reference(request);
 
spin_lock_bh(>execlist_lock);
@@ -691,10 +689,7 @@ int intel_logical_ring_alloc_request_extras(struct 
drm_i915_gem_request *request
return ret;
}
 
-   if (request->ctx != request->i915->kernel_context)
-   ret = intel_lr_context_pin(request->ctx, request->engine);
-
-   return ret;
+   return intel_lr_context_pin(request->ctx, request->engine);
 }
 
 static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
@@ -774,12 +769,8 @@ intel_logical_ring_advance_and_submit(struct 
drm_i915_gem_request *request)
if (engine->last_context != request->ctx) {
if (engine->last_context)
intel_lr_context_unpin(engine->last_context, engine);
-   if (request->ctx != request->i915->kernel_context) {
-   intel_lr_context_pin(request->ctx, engine);
-   engine->last_context = request->ctx;
-   } else {
-   engine->last_context = NULL;
-   }
+   intel_lr_context_pin(request->ctx, engine);
+   engine->last_context = request->ctx;
}
 
if (dev_priv->guc.execbuf_client)
@@ -1000,12 +991,7 @@ void intel_execlists_retire_requests(struct 
intel_engine_cs *engine)
spin_unlock_bh(>execlist_lock);
 
list_for_each_entry_safe(req, tmp, _list, execlist_link) {
-   struct intel_context *ctx = req->ctx;
-   struct drm_i915_gem_object *ctx_obj =
-   ctx->engine[engine->id].state;
-
-   if (ctx_obj && (ctx != req->i915->kernel_context))
-   intel_lr_context_unpin(ctx, engine);
+   intel_lr_context_unpin(req->ctx, engine);
 
list_del(>execlist_link);
i915_gem_request_unreference(req);
@@ -1050,23 +1036,26 @@ int logical_ring_flush_all_caches(struct 
drm_i915_gem_request *req)
return 0;
 }
 
-static int intel_lr_context_do_pin(struct intel_context *ctx,
-  struct intel_engine_cs *engine)
+static int intel_lr_context_pin(struct intel_context *ctx,
+   

[Intel-gfx] [PATCH 13/19] drm/i915: Refactor execlists default context pinning

2016-04-20 Thread Chris Wilson
Refactor pinning and unpinning of contexts, such that the default
context for an engine is pinned during initialisation and unpinned
during teardown (pinning of the context handles the reference counting).
Thus we can eliminate the special case handling of the default context
that was required to mask that it was not being pinned normally.

v2: Rebalance context_queue after rebasing.
v3: Rebase to -nightly (not 40 patches in)

Signed-off-by: Chris Wilson 
Cc: Tvrtko Ursulin 
Reviewed-by: Tvrtko Ursulin 
Reviewed-by: Mika Kuoppala 
---
 drivers/gpu/drm/i915/i915_debugfs.c |   5 +-
 drivers/gpu/drm/i915/i915_gem.c |   2 +-
 drivers/gpu/drm/i915/intel_lrc.c| 107 ++--
 3 files changed, 43 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index f775451bd0b6..e81a7504656e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2095,9 +2095,8 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
return ret;
 
list_for_each_entry(ctx, _priv->context_list, link)
-   if (ctx != dev_priv->kernel_context)
-   for_each_engine(engine, dev_priv)
-   i915_dump_lrc_obj(m, ctx, engine);
+   for_each_engine(engine, dev_priv)
+   i915_dump_lrc_obj(m, ctx, engine);
 
mutex_unlock(>struct_mutex);
 
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 14c9b29294c5..8c523166e3e0 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2711,7 +2711,7 @@ void i915_gem_request_free(struct kref *req_ref)
i915_gem_request_remove_from_client(req);
 
if (ctx) {
-   if (i915.enable_execlists && ctx != req->i915->kernel_context)
+   if (i915.enable_execlists)
intel_lr_context_unpin(ctx, req->engine);
 
i915_gem_context_unreference(ctx);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 2ed7363f76ea..838abd4b42a3 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -588,9 +588,7 @@ static void execlists_context_queue(struct 
drm_i915_gem_request *request)
struct drm_i915_gem_request *cursor;
int num_elements = 0;
 
-   if (request->ctx != request->i915->kernel_context)
-   intel_lr_context_pin(request->ctx, engine);
-
+   intel_lr_context_pin(request->ctx, request->engine);
i915_gem_request_reference(request);
 
spin_lock_bh(>execlist_lock);
@@ -691,10 +689,7 @@ int intel_logical_ring_alloc_request_extras(struct 
drm_i915_gem_request *request
return ret;
}
 
-   if (request->ctx != request->i915->kernel_context)
-   ret = intel_lr_context_pin(request->ctx, request->engine);
-
-   return ret;
+   return intel_lr_context_pin(request->ctx, request->engine);
 }
 
 static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
@@ -774,12 +769,8 @@ intel_logical_ring_advance_and_submit(struct 
drm_i915_gem_request *request)
if (engine->last_context != request->ctx) {
if (engine->last_context)
intel_lr_context_unpin(engine->last_context, engine);
-   if (request->ctx != request->i915->kernel_context) {
-   intel_lr_context_pin(request->ctx, engine);
-   engine->last_context = request->ctx;
-   } else {
-   engine->last_context = NULL;
-   }
+   intel_lr_context_pin(request->ctx, engine);
+   engine->last_context = request->ctx;
}
 
if (dev_priv->guc.execbuf_client)
@@ -1000,12 +991,7 @@ void intel_execlists_retire_requests(struct 
intel_engine_cs *engine)
spin_unlock_bh(>execlist_lock);
 
list_for_each_entry_safe(req, tmp, _list, execlist_link) {
-   struct intel_context *ctx = req->ctx;
-   struct drm_i915_gem_object *ctx_obj =
-   ctx->engine[engine->id].state;
-
-   if (ctx_obj && (ctx != req->i915->kernel_context))
-   intel_lr_context_unpin(ctx, engine);
+   intel_lr_context_unpin(req->ctx, engine);
 
list_del(>execlist_link);
i915_gem_request_unreference(req);
@@ -1050,23 +1036,26 @@ int logical_ring_flush_all_caches(struct 
drm_i915_gem_request *req)
return 0;
 }
 
-static int intel_lr_context_do_pin(struct intel_context *ctx,
-  struct intel_engine_cs *engine)
+static int intel_lr_context_pin(struct intel_context *ctx,
+