[Intel-gfx] [PATCH 1/2] drm/i915: Only defer freeing of fence callback when also using the timer

Chris Wilson chris at chris-wilson.co.uk
Mon Jan 15 10:04:37 UTC 2018


Quoting Tvrtko Ursulin (2018-01-15 10:00:48)
> 
> On 15/01/2018 09:06, Chris Wilson wrote:
> > Without an accompanying timer (for internal fences), we can free the
> > fence callback immediately as we do not need to employ the RCU barrier
> > to serialise with the timer. By avoiding the RCU delay, we can avoid the
> > extra mempressure under heavy inter-engine request utilisation.
> > 
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> > ---
> >   drivers/gpu/drm/i915/i915_sw_fence.c | 13 ++++++++++---
> >   1 file changed, 10 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_sw_fence.c b/drivers/gpu/drm/i915/i915_sw_fence.c
> > index 3669f5eeb91e..13021326d777 100644
> > --- a/drivers/gpu/drm/i915/i915_sw_fence.c
> > +++ b/drivers/gpu/drm/i915/i915_sw_fence.c
> > @@ -398,7 +398,12 @@ static void dma_i915_sw_fence_wake(struct dma_fence *dma,
> >       if (fence)
> >               i915_sw_fence_complete(fence);
> >   
> > -     irq_work_queue(&cb->work);
> > +     if (cb->dma) {
> > +             irq_work_queue(&cb->work);
> > +             return;
> > +     }
> > +
> > +     kfree(cb);
> >   }
> >   
> >   static void irq_i915_sw_fence_work(struct irq_work *wrk)
> > @@ -437,10 +442,12 @@ int i915_sw_fence_await_dma_fence(struct i915_sw_fence *fence,
> >       i915_sw_fence_await(fence);
> >   
> >       cb->dma = NULL;
> > -     timer_setup(&cb->timer, timer_i915_sw_fence_wake, TIMER_IRQSAFE);
> > -     init_irq_work(&cb->work, irq_i915_sw_fence_work);
> >       if (timeout) {
> >               cb->dma = dma_fence_get(dma);
> > +             init_irq_work(&cb->work, irq_i915_sw_fence_work);
> > +
> > +             timer_setup(&cb->timer,
> > +                         timer_i915_sw_fence_wake, TIMER_IRQSAFE);
> >               mod_timer(&cb->timer, round_jiffies_up(jiffies + timeout));
> >       }
> >   
> > 
> 
> Looks straightforward enough and I can't spot any problems with it. It 
> would be good to have mentioned in the commit under which 
> tests/benchmarks can the improvement be observed and how.

gem_exec_nop/sequential !ivb

(I honestly thought that "inter-engine request utilisation" was
descriptive enough to work out what scenarios were affected.)
-Chris


More information about the Intel-gfx mailing list