From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> Looks like the sleeping loop in __i915_wait_request can be simplified by using io_schedule_timeout instead of setting up and destroying a timer. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 33adc8f8ab20..efb3eb8b4a5e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1135,11 +1135,6 @@ i915_gem_check_wedge(struct i915_gpu_error *error, return 0; } -static void fake_irq(unsigned long data) -{ - wake_up_process((struct task_struct *)data); -} - static bool missed_irq(struct drm_i915_private *dev_priv, struct intel_engine_cs *ring) { @@ -1231,7 +1226,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, } for (;;) { - struct timer_list timer; + long sched_timeout; prepare_to_wait(&ring->irq_queue, &wait, interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE); @@ -1262,21 +1257,14 @@ int __i915_wait_request(struct drm_i915_gem_request *req, break; } - timer.function = NULL; - if (timeout || missed_irq(dev_priv, ring)) { - unsigned long expire; - - setup_timer_on_stack(&timer, fake_irq, (unsigned long)current); - expire = missed_irq(dev_priv, ring) ? jiffies + 1 : timeout_expire; - mod_timer(&timer, expire); - } - - io_schedule(); + if (timeout) + sched_timeout = timeout_expire - jiffies; + else if (missed_irq(dev_priv, ring)) + sched_timeout = 1; + else + sched_timeout = MAX_SCHEDULE_TIMEOUT; - if (timer.function) { - del_singleshot_timer_sync(&timer); - destroy_timer_on_stack(&timer); - } + io_schedule_timeout(sched_timeout); } if (!irq_test_in_progress) ring->irq_put(ring); -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx