[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