[Intel-gfx] [PATCH v2] drm/i915: Keep contexts pinned until after the next kernel context switch

Chris Wilson chris at chris-wilson.co.uk
Fri Jun 14 09:34:46 UTC 2019


Quoting Mika Kuoppala (2019-06-14 10:22:16)
> Chris Wilson <chris at chris-wilson.co.uk> writes:
> > diff --git a/drivers/gpu/drm/i915/gt/intel_context.c b/drivers/gpu/drm/i915/gt/intel_context.c
> > index c78ec0b58e77..8e299c631575 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_context.c
> > +++ b/drivers/gpu/drm/i915/gt/intel_context.c
> > @@ -61,7 +61,6 @@ int __intel_context_do_pin(struct intel_context *ce)
> >  
> >               i915_gem_context_get(ce->gem_context); /* for ctx->ppgtt */
> >  
> > -             intel_context_get(ce);
> >               smp_mb__before_atomic(); /* flush pin before it is visible */
> >       }
> >  
> > @@ -89,20 +88,45 @@ void intel_context_unpin(struct intel_context *ce)
> >               ce->ops->unpin(ce);
> >  
> >               i915_gem_context_put(ce->gem_context);
> > -             intel_context_put(ce);
> > +             intel_context_active_release(ce);
> 
> Not going to insist any change in naming but I was thinking
> here that we arm the barriers.

Not keen, not for changing just _release as we end up with _acquire/_arm
and that does not seem symmetrical.

_release_deferred() _release_barrier() perhaps, but no need to
differentiate yet. _release_barrier() winning so far.

> >       mutex_unlock(&ce->pin_mutex);
> >       intel_context_put(ce);
> >  }
> >  
> > -static void intel_context_retire(struct i915_active_request *active,
> > -                              struct i915_request *rq)
> > +static int __context_pin_state(struct i915_vma *vma, unsigned long flags)
> >  {
> > -     struct intel_context *ce =
> > -             container_of(active, typeof(*ce), active_tracker);
> > +     int err;
> 
> Why not ret? I have started to removing errs. Am I swimming in upstream? :P

We've been replacing ret with err (where it makes more sense to ask "if
(error) do error_path;) for a few years. :-p

> > -     intel_context_unpin(ce);
> > +     err = i915_vma_pin(vma, 0, 0, flags | PIN_GLOBAL);
> > +     if (err)
> > +             return err;
> > +
> > +     /*
> > +      * And mark it as a globally pinned object to let the shrinker know
> > +      * it cannot reclaim the object until we release it.
> > +      */
> > +     vma->obj->pin_global++;
> > +     vma->obj->mm.dirty = true;
> > +
> > +     return 0;
> > +}

> > +int intel_context_active_acquire(struct intel_context *ce, unsigned long flags)
> > +{
> > +     int err;
> > +
> > +     if (!i915_active_acquire(&ce->active))
> > +             return 0;
> > +
> > +     intel_context_get(ce);
> > +
> > +     if (!ce->state)
> > +             return 0;
> > +
> > +     err = __context_pin_state(ce->state, flags);
> > +     if (err) {
> > +             i915_active_cancel(&ce->active);
> > +             intel_context_put(ce);
> > +             return err;
> > +     }
> > +
> > +     /* Preallocate tracking nodes */
> > +     if (!i915_gem_context_is_kernel(ce->gem_context)) {
> > +             err = i915_active_acquire_preallocate_barrier(&ce->active,
> > +                                                           ce->engine);
> > +             if (err) {
> > +                     i915_active_release(&ce->active);
> 
> For me it looks like we are missing context put in here.

Crazy huh :) We are at the point where it is safer to release than
unwind; i915_active_cancel is quite ugly.

It does get a bit simpler later on when we rewrite i915_active and
drive this as an acquire callback.

> > diff --git a/drivers/gpu/drm/i915/i915_active_types.h b/drivers/gpu/drm/i915/i915_active_types.h
> > index b679253b53a5..c025991b9233 100644
> > --- a/drivers/gpu/drm/i915/i915_active_types.h
> > +++ b/drivers/gpu/drm/i915/i915_active_types.h
> > @@ -7,6 +7,7 @@
> >  #ifndef _I915_ACTIVE_TYPES_H_
> >  #define _I915_ACTIVE_TYPES_H_
> >  
> > +#include <linux/llist.h>
> >  #include <linux/rbtree.h>
> >  #include <linux/rcupdate.h>
> >  
> > @@ -31,6 +32,8 @@ struct i915_active {
> >       unsigned int count;
> >  
> >       void (*retire)(struct i915_active *ref);
> > +
> > +     struct llist_head barriers;
> 
> This looks like it is generic. Are you planning to extend?

Only user so far far. But i915_active is our answer to
reservation_object on steroids, so itself should be quite generic.
-Chris


More information about the Intel-gfx mailing list