summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_sw_fence.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-01-15 09:06:42 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2018-01-15 10:29:17 +0000
commitc32164b1f6a2eafa0658bbf33d02b2da41c72e5a (patch)
treee9f02f4e64baa9bdde45c982ffdba9308017783d /drivers/gpu/drm/i915/i915_sw_fence.c
parentc9ef291a7e79ebc9fb1723090c12fae626e74c46 (diff)
downloadop-kernel-dev-c32164b1f6a2eafa0658bbf33d02b2da41c72e5a.zip
op-kernel-dev-c32164b1f6a2eafa0658bbf33d02b2da41c72e5a.tar.gz
drm/i915: Only defer freeing of fence callback when also using the timer
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
Diffstat (limited to 'drivers/gpu/drm/i915/i915_sw_fence.c')
-rw-r--r--drivers/gpu/drm/i915/i915_sw_fence.c13
1 files 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 3669f5e..1302132 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));
}
OpenPOWER on IntegriCloud