From: Daniel Vetter <daniel@ffwll.ch>
To: Chris Wilson <chris@chris-wilson.co.uk>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 1/2] drm/i915: Split out !RCS legacy context switching
Date: Wed, 13 Apr 2016 16:56:05 +0200 [thread overview]
Message-ID: <20160413145605.GE2510@phenom.ffwll.local> (raw)
In-Reply-To: <1460556991-8712-1-git-send-email-chris@chris-wilson.co.uk>
On Wed, Apr 13, 2016 at 03:16:30PM +0100, Chris Wilson wrote:
> Having the !RCS legacy context switch threaded through the RCS switching
> code makes it much harder to follow and understand. In the next patch, I
> want to fix a bug handling the incomplete switch, this is made much
> simpler if we segregate the two paths now.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem_context.c | 74 +++++++++++++++++----------------
> 1 file changed, 38 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 453b655e86fc..c027240aacf3 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -609,9 +609,9 @@ mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
> return ret;
> }
>
> -static inline bool should_skip_switch(struct intel_engine_cs *engine,
> - struct intel_context *from,
> - struct intel_context *to)
> +static inline bool skip_rcs_switch(struct intel_engine_cs *engine,
> + struct intel_context *from,
> + struct intel_context *to)
> {
> if (to->remap_slice)
> return false;
> @@ -626,15 +626,17 @@ static inline bool should_skip_switch(struct intel_engine_cs *engine,
> static bool
> needs_pd_load_pre(struct intel_engine_cs *engine, struct intel_context *to)
> {
> - struct drm_i915_private *dev_priv = engine->dev->dev_private;
> -
> if (!to->ppgtt)
> return false;
>
> - if (INTEL_INFO(engine->dev)->gen < 8)
> + if (engine->last_context == to &&
> + !(intel_engine_flag(engine) & to->ppgtt->pd_dirty_rings))
> + return false;
> +
> + if (engine->id != RCS)
> return true;
>
> - if (engine != &dev_priv->engine[RCS])
> + if (INTEL_INFO(engine->dev)->gen < 8)
> return true;
>
> return false;
> @@ -661,32 +663,24 @@ needs_pd_load_post(struct intel_engine_cs *engine, struct intel_context *to,
> return false;
> }
>
> -static int do_switch(struct drm_i915_gem_request *req)
> +static int do_rcs_switch(struct drm_i915_gem_request *req)
> {
> struct intel_context *to = req->ctx;
> struct intel_engine_cs *engine = req->engine;
> - struct drm_i915_private *dev_priv = req->i915;
> struct intel_context *from = engine->last_context;
> u32 hw_flags = 0;
> bool uninitialized = false;
> int ret, i;
>
> - if (from != NULL && engine == &dev_priv->engine[RCS]) {
> - BUG_ON(from->legacy_hw_ctx.rcs_state == NULL);
> - BUG_ON(!i915_gem_obj_is_pinned(from->legacy_hw_ctx.rcs_state));
> - }
> -
> - if (should_skip_switch(engine, from, to))
> + if (skip_rcs_switch(engine, from, to))
> return 0;
>
> /* Trying to pin first makes error handling easier. */
> - if (engine == &dev_priv->engine[RCS]) {
> - ret = i915_gem_obj_ggtt_pin(to->legacy_hw_ctx.rcs_state,
> - get_context_alignment(engine->dev),
> - 0);
> - if (ret)
> - return ret;
> - }
> + ret = i915_gem_obj_ggtt_pin(to->legacy_hw_ctx.rcs_state,
> + get_context_alignment(engine->dev),
> + 0);
> + if (ret)
> + return ret;
>
> /*
> * Pin can switch back to the default context if we end up calling into
> @@ -709,12 +703,6 @@ static int do_switch(struct drm_i915_gem_request *req)
> to->ppgtt->pd_dirty_rings &= ~intel_engine_flag(engine);
> }
>
> - if (engine != &dev_priv->engine[RCS]) {
> - if (from)
> - i915_gem_context_unreference(from);
> - goto done;
> - }
> -
> /*
> * Clear this page out of any CPU caches for coherent swap-in/out. Note
> * that thanks to write = false in this call and us not setting any gpu
> @@ -802,7 +790,6 @@ static int do_switch(struct drm_i915_gem_request *req)
> uninitialized = !to->legacy_hw_ctx.initialized;
> to->legacy_hw_ctx.initialized = true;
>
> -done:
> i915_gem_context_reference(to);
> engine->last_context = to;
>
> @@ -817,8 +804,7 @@ done:
> return 0;
>
> unpin_out:
> - if (engine->id == RCS)
> - i915_gem_object_ggtt_unpin(to->legacy_hw_ctx.rcs_state);
> + i915_gem_object_ggtt_unpin(to->legacy_hw_ctx.rcs_state);
> return ret;
> }
>
> @@ -843,17 +829,33 @@ int i915_switch_context(struct drm_i915_gem_request *req)
> WARN_ON(i915.enable_execlists);
> WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
>
> - if (req->ctx->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */
> - if (req->ctx != engine->last_context) {
> - i915_gem_context_reference(req->ctx);
> + if (engine->id != RCS ||
> + req->ctx->legacy_hw_ctx.rcs_state == NULL) {
> + struct intel_context *to = req->ctx;
> +
> + if (needs_pd_load_pre(engine, to)) {
Hm, I'd inline this condition now since it's a bit confusing if there's no
POST. Assuming I read code correctly it seems to boil down to to->ppgtt
(which reads a lot cleaner) for !RCS.
Either way (since this is just a bikeshed):
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> + int ret;
> +
> + trace_switch_mm(engine, to);
> + ret = to->ppgtt->switch_mm(to->ppgtt, req);
> + if (ret)
> + return ret;
> +
> + /* Doing a PD load always reloads the page dirs */
> + to->ppgtt->pd_dirty_rings &= ~intel_engine_flag(engine);
> + }
> +
> + if (to != engine->last_context) {
> + i915_gem_context_reference(to);
> if (engine->last_context)
> i915_gem_context_unreference(engine->last_context);
> - engine->last_context = req->ctx;
> + engine->last_context = to;
> }
> +
> return 0;
> }
>
> - return do_switch(req);
> + return do_rcs_switch(req);
> }
>
> static bool contexts_enabled(struct drm_device *dev)
> --
> 2.8.0.rc3
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-04-13 14:55 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-12 20:02 [CI-ping 01/15] drm/i915: Force clean compilation with -Werror Chris Wilson
2016-04-12 20:02 ` [CI-ping 02/15] drm/i915: Disentangle i915_drv.h includes Chris Wilson
2016-04-12 20:02 ` [CI-ping 03/15] drm/i915: Add GEM debugging Kconfig option Chris Wilson
2016-04-12 20:02 ` [CI-ping 04/15] drm/i915: Hide the atomic_read(reset_counter) behind a helper Chris Wilson
2016-04-12 20:02 ` [CI-ping 05/15] drm/i915: Simplify checking of GPU reset_counter in display pageflips Chris Wilson
2016-04-12 20:03 ` [CI-ping 06/15] drm/i915: Tighten reset_counter for reset status Chris Wilson
2016-04-12 20:03 ` [CI-ping 07/15] drm/i915: Store the reset counter when constructing a request Chris Wilson
2016-04-12 20:03 ` [CI-ping 08/15] drm/i915: Simplify reset_counter handling during atomic modesetting Chris Wilson
2016-04-12 20:03 ` [CI-ping 09/15] drm/i915: Prevent leaking of -EIO from i915_wait_request() Chris Wilson
2016-04-12 20:03 ` [CI-ping 10/15] drm/i915: Suppress error message when GPU resets are disabled Chris Wilson
2016-04-12 20:03 ` [CI-ping 11/15] drm/i915: Prevent machine death on Ivybridge context switching Chris Wilson
2016-04-13 9:33 ` Daniel Vetter
2016-04-18 9:50 ` Jani Nikula
2016-04-20 13:26 ` [Intel-gfx] " Jani Nikula
2016-04-12 20:03 ` [CI-ping 12/15] drm/i915: Force ringbuffers to not be at offset 0 Chris Wilson
2016-04-13 9:34 ` [Intel-gfx] " Daniel Vetter
2016-04-12 20:03 ` [CI-ping 13/15] drm/i915: Move the mb() following release-mmap into release-mmap Chris Wilson
2016-04-12 20:03 ` [CI-ping 14/15] drm/i915: Reorganise legacy context switch to cope with late failure Chris Wilson
2016-04-13 9:59 ` Daniel Vetter
2016-04-13 10:05 ` Chris Wilson
2016-04-13 14:16 ` [PATCH 1/2] drm/i915: Split out !RCS legacy context switching Chris Wilson
2016-04-13 14:16 ` [PATCH 2/2] drm/i915: Reorganise legacy context switch to cope with late failure Chris Wilson
2016-04-13 15:05 ` Daniel Vetter
2016-04-13 15:18 ` Chris Wilson
2016-04-13 14:56 ` Daniel Vetter [this message]
2016-04-13 15:04 ` [PATCH 1/2] drm/i915: Split out !RCS legacy context switching Chris Wilson
2016-04-12 20:03 ` [CI-ping 15/15] drm/i915: Late request cancellations are harmful Chris Wilson
2016-04-13 9:57 ` Daniel Vetter
2016-04-13 14:21 ` John Harrison
2016-04-19 12:35 ` Dave Gordon
2016-04-21 13:04 ` John Harrison
2016-04-22 22:57 ` John Harrison
2016-04-27 18:52 ` Dave Gordon
2016-04-18 9:46 ` Jani Nikula
2016-04-14 8:45 ` ✗ Fi.CI.BAT: failure for series starting with [CI-ping,01/15] drm/i915: Force clean compilation with -Werror (rev3) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160413145605.GE2510@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=chris@chris-wilson.co.uk \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).