[PATCH 47/87] drm/i915: Priority boost for new clients

Chris Wilson chris at chris-wilson.co.uk
Sat Mar 24 11:41:23 UTC 2018


See FQ_CODEL

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  2 +-
 drivers/gpu/drm/i915/i915_gem_context.c |  6 +++---
 drivers/gpu/drm/i915/i915_request.c     | 16 ++++++++++++++--
 drivers/gpu/drm/i915/i915_request.h     |  5 +++++
 4 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a9dde6306bd3..460f34a34a6b 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3147,7 +3147,7 @@ int i915_gem_object_wait(struct drm_i915_gem_object *obj,
 int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj,
 				  unsigned int flags,
 				  int priority);
-#define I915_PRIORITY_DISPLAY I915_PRIORITY_MAX
+#define I915_PRIORITY_DISPLAY (I915_PRIORITY_MAX << I915_PRIORITY_SHIFT)
 
 int __must_check
 i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write);
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 51c301ddac7c..b77bbbe115c1 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -427,7 +427,7 @@ i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio)
 	}
 
 	i915_gem_context_clear_bannable(ctx);
-	ctx->priority = prio;
+	ctx->priority = prio << I915_PRIORITY_SHIFT;
 	ctx->ring_size = PAGE_SIZE;
 
 	GEM_BUG_ON(!i915_gem_context_is_kernel(ctx));
@@ -740,7 +740,7 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
 		args->value = i915_gem_context_is_bannable(ctx);
 		break;
 	case I915_CONTEXT_PARAM_PRIORITY:
-		args->value = ctx->priority;
+		args->value = ctx->priority >> I915_PRIORITY_SHIFT;
 		break;
 	case I915_CONTEXT_PARAM_FREQUENCY:
 		if (!HAS_RPS(i915) || !HAS_EXECLISTS(i915)) {
@@ -827,7 +827,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
 				 !capable(CAP_SYS_NICE))
 				ret = -EPERM;
 			else
-				ctx->priority = priority;
+				ctx->priority = priority << I915_PRIORITY_SHIFT;
 		}
 		break;
 	case I915_CONTEXT_PARAM_FREQUENCY:
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 7e145c71d5c4..b3232b8e987c 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -1100,8 +1100,20 @@ void __i915_request_add(struct i915_request *request, bool flush_caches)
 	 * run at the earliest possible convenience.
 	 */
 	rcu_read_lock();
-	if (engine->schedule)
-		engine->schedule(request, request->ctx->priority);
+	if (engine->schedule) {
+		int priority = request->ctx->priority;
+
+		/*
+		 * Boost priorities to new clients (new request flows).
+		 *
+		 * Allow interactive/synchronous clients to jump ahead of
+		 * the bulk clients. (FQ_CODEL)
+		 */
+		if (!prev || i915_request_completed(prev))
+			priority |= I915_PRIORITY_NEWCLIENT;
+
+		engine->schedule(request, priority);
+	}
 	rcu_read_unlock();
 
 	local_bh_disable();
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 07dd1918a59e..1220c110f3b8 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -86,6 +86,11 @@ enum {
 	I915_PRIORITY_INVALID = INT_MIN
 };
 
+#define I915_PRIORITY_SHIFT 1
+#define I915_PRIORITY_MASK (-BIT(I915_PRIORITY_SHIFT))
+
+#define I915_PRIORITY_NEWCLIENT BIT(0)
+
 struct i915_capture_list {
 	struct i915_capture_list *next;
 	struct i915_vma *vma;
-- 
2.16.3



More information about the Intel-gfx-trybot mailing list