[PATCH 87/87] ctx-preempt-timeout

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


---
 drivers/gpu/drm/i915/i915_gem_context.c | 23 +++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_gem_context.h |  2 ++
 drivers/gpu/drm/i915/i915_request.c     |  3 ++-
 drivers/gpu/drm/i915/intel_lrc.c        |  2 +-
 include/uapi/drm/i915_drm.h             |  2 ++
 5 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index a56430bb3b5d..92cf2612eab4 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -880,6 +880,14 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
 			args->value = I915_CONTEXT_SET_FREQUENCY(min, max);
 		}
 		break;
+	case I915_CONTEXT_PARAM_PREEMPT_TIMEOUT:
+		if (!(to_i915(dev)->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION))
+			ret = -ENODEV;
+		else if (args->size)
+			ret = -EINVAL;
+		else
+			args->value = ctx->preempt_timeout;
+		break;
 
 	default:
 		ret = -EINVAL;
@@ -1077,6 +1085,21 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
 		ret = set_engines(ctx, args);
 		break;
 
+	case I915_CONTEXT_PARAM_PREEMPT_TIMEOUT:
+		{
+			if (args->size)
+				ret = -EINVAL;
+			else if (args->value >= NSEC_PER_SEC)
+				ret = -EINVAL;
+			else if (!(to_i915(dev)->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION))
+				ret = -ENODEV;
+			else if (args->value && !capable(CAP_SYS_ADMIN))
+				ret = -EPERM;
+			else
+				ctx->preempt_timeout = args->value;
+		}
+		break;
+
 	default:
 		ret = -EINVAL;
 		break;
diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index 13b377c3de6c..a3648692a29c 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -159,6 +159,8 @@ struct i915_gem_context {
 	 */
 	int priority;
 
+	u32 preempt_timeout;
+
 	u32 min_freq;
 	u32 max_freq;
 
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 59f1ae48f652..2ac48f78bebb 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -1122,6 +1122,7 @@ void __i915_request_add(struct i915_request *request, bool flush_caches)
 	 */
 	rcu_read_lock();
 	if (engine->schedule) {
+		unsigned int timeout = request->ctx->preempt_timeout;
 		int priority = request->ctx->priority;
 
 		/*
@@ -1133,7 +1134,7 @@ void __i915_request_add(struct i915_request *request, bool flush_caches)
 		if (!prev || i915_request_completed(prev))
 			priority |= I915_PRIORITY_NEWCLIENT;
 
-		engine->schedule(request, priority, 0);
+		engine->schedule(request, priority, timeout);
 	}
 	rcu_read_unlock();
 
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index d1a5bb52ca85..4cf07ec99964 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1134,7 +1134,7 @@ static void execlists_submit_request(struct i915_request *request)
 	spin_lock_irqsave(&engine->timeline.lock, flags);
 
 	queue_request(engine, &request->priotree, rq_prio(request));
-	submit_queue(engine, rq_prio(request), 0);
+	submit_queue(engine, rq_prio(request), request->ctx->preempt_timeout);
 
 	GEM_BUG_ON(RB_EMPTY_ROOT(&engine->execlists.queue.rb_root));
 	GEM_BUG_ON(list_empty(&request->priotree.link));
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index 7a84165c2cf5..ee6101101ed5 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1533,6 +1533,8 @@ struct drm_i915_gem_context_param {
 
 #define I915_CONTEXT_PARAM_ENGINES	0x8
 	__u64 value;
+
+#define I915_CONTEXT_PARAM_PREEMPT_TIMEOUT	0x9
 };
 
 enum drm_i915_oa_format {
-- 
2.16.3



More information about the Intel-gfx-trybot mailing list