Re: [PATCH v2 06/11] drm/i915: Introduce a preempt context

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Joonas Lahtinen (2017-09-28 13:32:09)
> On Wed, 2017-09-27 at 17:44 +0100, Chris Wilson wrote:
> > Add another perma-pinned context for using for preemption at any time.
> > We cannot just reuse the existing kernel context, as first and foremost
> > we need to ensure that we can preempt the kernel context itself, so
> > require a distinct context id. Similar to the kernel context, we may
> > want to interrupt execution and switch to the preempt context at any
> > time, and so it needs to be permanently pinned and available.
> > 
> > To compensate for yet another permanent allocation, we shrink the
> > existing context and the new context by reducing their ringbuffer to the
> > minimum.
> > 
> > v2: Assert that we never allocate a request from the preemption context.
> > v3: Limit perma-pin to engines that may preempt.
> > 
> > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> > Reviewed-by: Michał Winiarski <michal.winiarski@xxxxxxxxx>
> 
> <SNIP>
> 
> > @@ -2250,8 +2251,9 @@ struct drm_i915_private {
> >       wait_queue_head_t gmbus_wait_queue;
> >  
> >       struct pci_dev *bridge_dev;
> > -     struct i915_gem_context *kernel_context;
> >       struct intel_engine_cs *engine[I915_NUM_ENGINES];
> 
> First to touch old code gets to add kerneldoc, just formulate what's in
> the commit message into here.

/* Nothing to see here, please move along. */
 
> > +     struct i915_gem_context *kernel_context;
> > +     struct i915_gem_context *preempt_context;
> >       struct i915_vma *semaphore;
> >  
> >       struct drm_dma_handle *status_page_dmah;
> > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> > index 921ee369c74d..1518e110fd04 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > @@ -416,14 +416,29 @@ i915_gem_context_create_gvt(struct drm_device *dev)
> >       return ctx;
> >  }
> >  
> > +static struct i915_gem_context *
> > +create_kernel_context(struct drm_i915_private *i915, int prio)
> 
> I may vote for 'create_internal_context' because 'kernel context' is
> quite an established term. But I've got no hard option, just gotta keep
> the terminology coherent (eg. in the above requested kerneldoc).

The contexts return by this function pass i915_gem_context_is_kernel().
Atm, I think kernel_context is still the consistent terminology.
 
> > +{
> > +     struct i915_gem_context *ctx;
> > +
> > +     ctx = i915_gem_create_context(i915, NULL);
> > +     if (IS_ERR(ctx))
> > +             return ctx;
> > +
> > +     i915_gem_context_clear_bannable(ctx);
> > +     ctx->priority = prio;
> > +     ctx->ring_size = PAGE_SIZE;
> > +
> > +     return ctx;
> > +}
> > +
> >  int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
> >  {
> >       struct i915_gem_context *ctx;
> >  
> >       /* Init should only be called once per module load. Eventually the
> >        * restriction on the context_disabled check can be loosened. */
> 
> Commit seems to be out of date now?

Got to keep some humour around.

> > +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> > @@ -587,6 +587,13 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
> >  
> >       lockdep_assert_held(&dev_priv->drm.struct_mutex);
> >  
> > +     /*
> > +      * Preempt contexts are reserved for exclusive use to inject a
> > +      * preemption context switch. They are never to be used for any trivial
> > +      * request!
> > +      */
> > +     GEM_BUG_ON(ctx == dev_priv->preempt_context);
> 
> Maybe check the prio here too.

More a task for ->schedule().

> 
> > +
> >       /* ABI: Before userspace accesses the GPU (e.g. execbuffer), report
> >        * EIO if the GPU is already wedged.
> >        */
> > diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> > index 21e037fc21b7..02eb25ed1064 100644
> > --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> > +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> > @@ -613,9 +613,22 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
> >       if (IS_ERR(ring))
> >               return PTR_ERR(ring);
> >  
> > +     /*
> > +      * Similarly the preempt context must always be available so that
> > +      * we can interrupt the engine at any time.
> > +      */
> > +     if (INTEL_INFO(engine->i915)->has_logical_ring_preemption) {
> > +             ring = engine->context_pin(engine,
> > +                                        engine->i915->preempt_context);
> > +             if (IS_ERR(ring)) {
> > +                     ret = PTR_ERR(ring);
> > +                     goto err_unpin_kernel;
> > +             }
> > +     }
> 
> Maybe add helper for the internal/kernel_context_pin and _free too,
> it's unnecessary code duplication.

What's the duplication? I'm not clear on what may be saved.

engine->context_pin()
engine->context_unpin()
??

The cleanup path I have more sympathy for, I considered doing it. But I
keep getting side tracked by the desire to eliminate the context_close()
for the kernel contexts and creating them in a closed state.
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux