We want to expose the parameters for controlling how long it takes for
us to notice and park the GPU after a stream of requests in order to try
and tune the optimal power-efficiency vs latency of a mostly idle system.

v2: retire_work has two scheduling points, update them both

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
---
 drivers/gpu/drm/i915/Kconfig.profile | 23 +++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_gem.c      |  8 +++++---
 drivers/gpu/drm/i915/i915_gem.h      | 13 +++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/Kconfig.profile 
b/drivers/gpu/drm/i915/Kconfig.profile
index 8a230eeb98df..63cb744d920d 100644
--- a/drivers/gpu/drm/i915/Kconfig.profile
+++ b/drivers/gpu/drm/i915/Kconfig.profile
@@ -24,3 +24,26 @@ config DRM_I915_SPIN_REQUEST_CS
          spin prior to sleeping again.
 
          May be 0 to disable spinning after being woken.
+
+config DRM_I915_GEM_RETIRE_DELAY
+       int
+       default 1000 # milliseconds
+       help
+         We maintain a background job whose purpose is to keep cleaning up
+         after userspace, and may be the first to spot an idle system. This
+         parameter determines the interval between execution of the worker.
+
+         To reduce the number of timer wakeups, large delays (of greater than
+         a second) are rounded to the next walltime second to allow coalescing
+         of multiple system timers into a single wakeup.
+
+config DRM_I915_GEM_PARK_DELAY
+       int
+       default 100 # milliseconds
+       help
+         Before parking the engines and the GPU after the final request is
+         retired, we may wait for a small delay to reduce the frequecy of
+         having to park/unpark and so the latency in executing a new request.
+
+         May be 0 to immediately start parking the engines after the last
+         request.
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 460f256114f7..5b538a92631d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -192,7 +192,9 @@ void i915_gem_park(struct drm_i915_private *i915)
                return;
 
        /* Defer the actual call to __i915_gem_park() to prevent ping-pongs */
-       mod_delayed_work(i915->wq, &i915->gt.idle_work, msecs_to_jiffies(100));
+       mod_delayed_work(i915->wq,
+                        &i915->gt.idle_work,
+                        msecs_to_jiffies(CONFIG_DRM_I915_GEM_PARK_DELAY));
 }
 
 void i915_gem_unpark(struct drm_i915_private *i915)
@@ -236,7 +238,7 @@ void i915_gem_unpark(struct drm_i915_private *i915)
 
        queue_delayed_work(i915->wq,
                           &i915->gt.retire_work,
-                          round_jiffies_up_relative(HZ));
+                          i915_gem_retire_delay());
 }
 
 int
@@ -3466,7 +3468,7 @@ i915_gem_retire_work_handler(struct work_struct *work)
        if (READ_ONCE(dev_priv->gt.awake))
                queue_delayed_work(dev_priv->wq,
                                   &dev_priv->gt.retire_work,
-                                  round_jiffies_up_relative(HZ));
+                                  i915_gem_retire_delay());
 }
 
 static void shrink_caches(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
index e46592956872..c6b4971435dc 100644
--- a/drivers/gpu/drm/i915/i915_gem.h
+++ b/drivers/gpu/drm/i915/i915_gem.h
@@ -27,6 +27,8 @@
 
 #include <linux/bug.h>
 #include <linux/interrupt.h>
+#include <linux/jiffies.h>
+#include <linux/timer.h>
 
 struct drm_i915_private;
 
@@ -76,6 +78,17 @@ struct drm_i915_private;
 void i915_gem_park(struct drm_i915_private *i915);
 void i915_gem_unpark(struct drm_i915_private *i915);
 
+static inline unsigned long i915_gem_retire_delay(void)
+{
+       const unsigned long delay =
+               msecs_to_jiffies(CONFIG_DRM_I915_GEM_RETIRE_DELAY);
+
+       if (CONFIG_DRM_I915_GEM_RETIRE_DELAY >= 1000)
+               return round_jiffies_up_relative(delay);
+       else
+               return delay;
+}
+
 static inline void __tasklet_disable_sync_once(struct tasklet_struct *t)
 {
        if (atomic_inc_return(&t->count) == 1)
-- 
2.18.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to