Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > Currently execlists is exempt from emitting a request to switch each > ring away from the current context over to the dev_priv->kernel_context > (for whatever reason, just under execlists the GGTT is unlikely to be as > fragmented, however the switch may help in some extreme cases). Extract > the switcher and enable it for execlsts as well, as we need to do so in > a later patch to force the context switch before suspend. (And since for > that switch we explicitly require the disposable kernel context, rename > the extracted function.) > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/i915_gem_context.c | 29 +++++++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_gem_evict.c | 35 ++------------------------------- > 3 files changed, 32 insertions(+), 33 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 1ec523d29789..cd1ccc47ee8b 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -3525,6 +3525,7 @@ void i915_gem_context_reset(struct drm_device *dev); > int i915_gem_context_open(struct drm_device *dev, struct drm_file *file); > void i915_gem_context_close(struct drm_device *dev, struct drm_file *file); > int i915_switch_context(struct drm_i915_gem_request *req); > +int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv); > void i915_gem_context_free(struct kref *ctx_ref); > struct drm_i915_gem_object * > i915_gem_alloc_context_obj(struct drm_device *dev, size_t size); > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c > index 3c97f0e7a003..3b636161256c 100644 > --- a/drivers/gpu/drm/i915/i915_gem_context.c > +++ b/drivers/gpu/drm/i915/i915_gem_context.c > @@ -926,6 +926,35 @@ int i915_switch_context(struct drm_i915_gem_request *req) > return do_rcs_switch(req); > } > > +int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv) > +{ > + struct intel_engine_cs *engine; > + > + for_each_engine(engine, dev_priv) { > + struct drm_i915_gem_request *req; > + int ret; > + > + if (engine->last_context == NULL) > + continue; > + > + if (engine->last_context == dev_priv->kernel_context) > + continue; > + > + req = i915_gem_request_alloc(engine, dev_priv->kernel_context); > + if (IS_ERR(req)) > + return PTR_ERR(req); > + > + ret = 0; > + if (!i915.enable_execlists) > + ret = i915_switch_context(req); > + i915_add_request_no_flush(req); > + if (ret) > + return ret; > + } > + > + return 0; > +} > + > static bool contexts_enabled(struct drm_device *dev) > { > return i915.enable_execlists || to_i915(dev)->hw_context_size; > diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c > index 3c1280ec7ff6..b1194c7c0a48 100644 > --- a/drivers/gpu/drm/i915/i915_gem_evict.c > +++ b/drivers/gpu/drm/i915/i915_gem_evict.c > @@ -33,37 +33,6 @@ > #include "intel_drv.h" > #include "i915_trace.h" > > -static int switch_to_pinned_context(struct drm_i915_private *dev_priv) > -{ > - struct intel_engine_cs *engine; > - > - if (i915.enable_execlists) > - return 0; > - > - for_each_engine(engine, dev_priv) { > - struct drm_i915_gem_request *req; > - int ret; > - > - if (engine->last_context == NULL) > - continue; > - > - if (engine->last_context == dev_priv->kernel_context) > - continue; > - > - req = i915_gem_request_alloc(engine, dev_priv->kernel_context); > - if (IS_ERR(req)) > - return PTR_ERR(req); > - > - ret = i915_switch_context(req); > - i915_add_request_no_flush(req); > - if (ret) > - return ret; > - } > - > - return 0; > -} > - > - > static bool > mark_free(struct i915_vma *vma, struct list_head *unwind) > { > @@ -184,7 +153,7 @@ none: > struct drm_i915_private *dev_priv = to_i915(dev); > > if (i915_is_ggtt(vm)) { > - ret = switch_to_pinned_context(dev_priv); > + ret = i915_gem_switch_to_kernel_context(dev_priv); > if (ret) > return ret; > } > @@ -303,7 +272,7 @@ int i915_gem_evict_vm(struct i915_address_space *vm, bool do_idle) > struct drm_i915_private *dev_priv = to_i915(vm->dev); > > if (i915_is_ggtt(vm)) { > - ret = switch_to_pinned_context(dev_priv); > + ret = i915_gem_switch_to_kernel_context(dev_priv); > if (ret) > return ret; > } > -- > 2.8.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx