diff options
author | Dave Gordon <david.s.gordon@intel.com> | 2015-10-13 11:12:00 +0100 |
---|---|---|
committer | John Harrison <John.C.Harrison@Intel.com> | 2016-05-06 14:13:04 +0100 |
commit | 5d10419b6b415cd1b1221bc938536c54f337bb07 (patch) | |
tree | 9c5e760d4d3c4d4e4513f9f5f839dd3f251b3326 | |
parent | 2360f7d8a09490f3c0a679954a5e75072fb23cc5 (diff) |
drm/i915: Add scheduling priority to per-context parameters
Added an interface for user land applications/libraries/services to
set their GPU scheduler priority. This extends the existing context
parameter IOCTL interface to add a scheduler priority parameter. The
range is +/-1023 with +ve numbers meaning higher priority. Only
system processes may set a higher priority than the default (zero),
normal applications may only lower theirs.
v2: New patch in series.
v6: Updated to use 'to_i915()' instead of dev_private.
[review feedback from Joonas Lahtinen]
For: VIZ-1587
Signed-off-by: Dave Gordon <David.S.Gordon@Intel.com>
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 3 | ||||
-rw-r--r-- | include/uapi/drm/i915_drm.h | 1 |
4 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 25b8fd687940..4d5d059bcab9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -815,6 +815,19 @@ struct i915_ctx_hang_stats { bool banned; }; +/* + * User-settable GFX scheduler priorities are on a scale of -1023 (I don't + * care about running) to +1023 (I'm the most important thing in existence) + * with zero being the default. Any process may decrease its scheduling + * priority, but only a sufficiently privileged process may increase it + * beyond zero. + */ + +struct i915_ctx_sched_info { + /* Scheduling priority */ + int32_t priority; +}; + struct i915_fence_timeline { char name[32]; unsigned fence_context; @@ -855,6 +868,7 @@ struct intel_context { int flags; struct drm_i915_file_private *file_priv; struct i915_ctx_hang_stats hang_stats; + struct i915_ctx_sched_info sched_info; struct i915_hw_ppgtt *ppgtt; /* Legacy ring buffer submission */ diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 05d8f43f3533..185722e4c79e 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -961,6 +961,9 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data, else args->value = to_i915(dev)->ggtt.base.total; break; + case I915_CONTEXT_PARAM_PRIORITY: + args->value = (__u64) ctx->sched_info.priority; + break; default: ret = -EINVAL; break; @@ -998,6 +1001,7 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data, else ctx->hang_stats.ban_period_seconds = args->value; break; + case I915_CONTEXT_PARAM_NO_ZEROMAP: if (args->size) { ret = -EINVAL; @@ -1006,6 +1010,26 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data, ctx->flags |= args->value ? CONTEXT_NO_ZEROMAP : 0; } break; + + case I915_CONTEXT_PARAM_PRIORITY: + { + int32_t priority = (int32_t) args->value; + struct drm_i915_private *dev_priv = to_i915(dev); + struct i915_scheduler *scheduler = dev_priv->scheduler; + + if (args->size) + ret = -EINVAL; + else if ((priority > scheduler->priority_level_max) || + (priority < scheduler->priority_level_min)) + ret = -EINVAL; + else if ((priority > 0) && + !capable(CAP_SYS_ADMIN)) + ret = -EPERM; + else + ctx->sched_info.priority = priority; + break; + } + default: ret = -EINVAL; break; diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 89851780cad4..a4d07ab56e48 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -1726,6 +1726,9 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, params->batch_obj = batch_obj; params->request = req; + /* Start with the context's priority level */ + qe.priority = ctx->sched_info.priority; + /* * Save away the list of objects used by this batch buffer for the * purpose of tracking inter-buffer dependencies. diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index a5524cc95ff8..0e87551db1b7 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1167,6 +1167,7 @@ struct drm_i915_gem_context_param { #define I915_CONTEXT_PARAM_BAN_PERIOD 0x1 #define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2 #define I915_CONTEXT_PARAM_GTT_SIZE 0x3 +#define I915_CONTEXT_PARAM_PRIORITY 0x4 __u64 value; }; |