drm/i915: Avoid early GPU idling due to already pending idle work
authorImre Deak <imre.deak@intel.com>
Mon, 7 Nov 2016 09:20:02 +0000 (11:20 +0200)
committerImre Deak <imre.deak@intel.com>
Mon, 7 Nov 2016 12:48:04 +0000 (14:48 +0200)
Atm, in case an idle work handler is already pending but haven't yet
started to run, retiring a new request will not extend the active period
as required, rather simply leaves the pending idle work to be scheduled
at the original expiration time. This may lead to idling the GPU too
early. Fix this by using the delayed-work scheduler alternative which
makes sure the handler's expiration time is extended in this case.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Requested-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1478510405-11799-1-git-send-email-imre.deak@intel.com
drivers/gpu/drm/i915/i915_gem_request.c

index 79b0046d9a577364dfc58a650323369073ebfb0c..0b3b051a5683397489ca5cc1241f301cc5963383 100644 (file)
@@ -1019,7 +1019,7 @@ void i915_gem_retire_requests(struct drm_i915_private *dev_priv)
                engine_retire_requests(engine);
 
        if (!dev_priv->gt.active_requests)
-               queue_delayed_work(dev_priv->wq,
-                                  &dev_priv->gt.idle_work,
-                                  msecs_to_jiffies(100));
+               mod_delayed_work(dev_priv->wq,
+                                &dev_priv->gt.idle_work,
+                                msecs_to_jiffies(100));
 }