[PATCH v2 1/6] drm/i915: move the pre_pin earlier

Thomas Hellström thomas.hellstrom at linux.intel.com
Thu Nov 18 06:57:10 UTC 2021


On Wed, 2021-11-17 at 19:49 +0100, Thomas Hellström wrote:
> 
> On 11/17/21 15:20, Matthew Auld wrote:
> > In intel_context_do_pin_ww, when calling into the pre_pin
> > hook(which is
> > passed the ww context) it could in theory return -EDEADLK(which is
> > very
> > likely with debug kernels), once we start adding more ww locking in
> > there,
> > like in the next patch. If so then we need to be mindful of having
> > to
> > restart the do_pin at this point.
> > 
> > If this is the kernel_context, or some other early in-kernel
> > context
> > where we have yet to setup the default_state, then we always
> > inhibit the
> > context restore, and instead rely on the delayed active_release to
> > set
> > the CONTEXT_VALID_BIT for us(if we even care), which should
> > indicate
> > that we have context switched away, and that our newly saved
> > context
> > state should now be valid. However, since we currently grab the
> > active
> > reference before the potential ww dance, we can end up setting the
> > CONTEXT_VALID_BIT much too early, if we need to backoff, and then
> > upon
> > re-trying the do_pin, we could potentially cause the hardware to
> > incorrectly load some garbage context state when later context
> > switching
> > to that context, but at the very least this will trigger the
> > GEM_BUG_ON() in __engine_unpark. For now let's just move any ww
> > dance
> > stuff prior to arming the active reference.
> > 
> > For normal user contexts this shouldn't be a concern, since we
> > should
> > already have the default_state ready when initialising the lrc
> > state,
> > and so there should be no concern with active_release somehow
> > prematurely setting the CONTEXT_VALID_BIT.
> > 
> > v2(Thomas):
> >    - Also re-order the union unwind

Oh should this be 

s/union/onion/ ?


> > 
> > Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> > Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> > Cc: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> 
> Reviewed-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> 
> 
> > ---
> >   drivers/gpu/drm/i915/gt/intel_context.c | 12 ++++++------
> >   1 file changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/gt/intel_context.c
> > b/drivers/gpu/drm/i915/gt/intel_context.c
> > index 5634d14052bc..4c296de1d67d 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_context.c
> > +++ b/drivers/gpu/drm/i915/gt/intel_context.c
> > @@ -228,17 +228,17 @@ int __intel_context_do_pin_ww(struct
> > intel_context *ce,
> >         if (err)
> >                 return err;
> >   
> > -       err = i915_active_acquire(&ce->active);
> > +       err = ce->ops->pre_pin(ce, ww, &vaddr);
> >         if (err)
> >                 goto err_ctx_unpin;
> >   
> > -       err = ce->ops->pre_pin(ce, ww, &vaddr);
> > +       err = i915_active_acquire(&ce->active);
> >         if (err)
> > -               goto err_release;
> > +               goto err_post_unpin;
> >   
> >         err = mutex_lock_interruptible(&ce->pin_mutex);
> >         if (err)
> > -               goto err_post_unpin;
> > +               goto err_release;
> >   
> >         intel_engine_pm_might_get(ce->engine);
> >   
> > @@ -273,11 +273,11 @@ int __intel_context_do_pin_ww(struct
> > intel_context *ce,
> >   
> >   err_unlock:
> >         mutex_unlock(&ce->pin_mutex);
> > +err_release:
> > +       i915_active_release(&ce->active);
> >   err_post_unpin:
> >         if (!handoff)
> >                 ce->ops->post_unpin(ce);
> > -err_release:
> > -       i915_active_release(&ce->active);
> >   err_ctx_unpin:
> >         intel_context_post_unpin(ce);
> >   




More information about the dri-devel mailing list