drm/i915: Only defer freeing of fence callback when also using the timer
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 15 Jan 2018 09:06:42 +0000 (09:06 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 15 Jan 2018 10:29:17 +0000 (10:29 +0000)
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@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180115090643.26696-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_sw_fence.c

index 3669f5eeb91efa709ea2d6f9f83525f98230f7c5..13021326d7775971ca89156fd0e4e9a15d5cdd2b 100644 (file)
@@ -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));
        }