Usually display-boosted contexts get treated as I915_CONTEXT_MAX_USER_PRIORITY+1, which prioritizes them above regular GPU contexts. Now that we allow a much larger range of effective priority values via per-cgroup priority offsets, a system administrator may want more detailed control over how much a process should be boosted by display operations (i.e., can a context from a cgroup with a low priority offset still be display boosted above contexts from a cgroup with a much higher priority offset? or are come cgroups more important than maintaining display rate?). Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Signed-off-by: Matt Roper <matthew.d.roper@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_cgroup.c | 17 +++++++++++++++++ drivers/gpu/drm/i915/i915_drv.h | 6 ++++++ drivers/gpu/drm/i915/i915_request.h | 1 + drivers/gpu/drm/i915/intel_display.c | 5 +++-- include/uapi/drm/i915_drm.h | 1 + 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_cgroup.c b/drivers/gpu/drm/i915/i915_cgroup.c index 0921d624f840..2bef8a5cac93 100644 --- a/drivers/gpu/drm/i915/i915_cgroup.c +++ b/drivers/gpu/drm/i915/i915_cgroup.c @@ -11,6 +11,7 @@ struct i915_cgroup_data { int priority_offset; + int display_boost; struct kref ref; }; @@ -75,6 +76,8 @@ get_or_create_cgroup_data(struct drm_i915_private *dev_priv, goto out; } + priv->display_boost = I915_PRIORITY_DEFAULT_DISPBOOST; + kref_init(&priv->ref); cgroup_priv_install(cgrp, dev_priv->cgroup_priv_key, &priv->ref); @@ -151,6 +154,19 @@ i915_cgroup_setparam_ioctl(struct drm_device *dev, } break; + case I915_CGROUP_PARAM_DISPBOOST_PRIORITY: + if (req->value < I915_PRIORITY_MAX_DISPBOOST && + req->value > I915_PRIORITY_MIN) { + DRM_DEBUG_DRIVER("Setting cgroup display boost priority to %lld\n", + req->value); + cgrpdata->display_boost = req->value; + } else { + DRM_DEBUG_DRIVER("Invalid cgroup display boost priority %lld\n", + req->value); + ret = -EINVAL; + } + break; + default: DRM_DEBUG_DRIVER("Invalid cgroup parameter %lld\n", req->param); ret = -EINVAL; @@ -186,5 +202,6 @@ int i915_cgroup_get_current_##name(struct drm_i915_private *dev_priv) \ } CGROUP_GET(prio_offset, priority_offset, 0) +CGROUP_GET(dispboost, display_boost, I915_PRIORITY_DEFAULT_DISPBOOST); #undef CGROUP_GET diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 72e6cd7bfbae..bde58327b892 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2694,6 +2694,7 @@ int i915_cgroup_setparam_ioctl(struct drm_device *dev, void *data, struct drm_file *file); void i915_cgroup_shutdown(struct drm_i915_private *dev_priv); int i915_cgroup_get_current_prio_offset(struct drm_i915_private *dev_priv); +int i915_cgroup_get_current_dispboost(struct drm_i915_private *dev_priv); #else static inline int i915_cgroup_init(struct drm_i915_private *dev_priv) @@ -2715,6 +2716,11 @@ i915_cgroup_get_current_prio_offset(struct drm_i915_private *dev_priv) { return 0; } +static inline int +i915_cgroup_get_current_dispboost(struct drm_i915_private *dev_priv) +{ + return I915_PRIORITY_DEFAULT_DISPBOOST; +} #endif /* i915_drv.c */ diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h index cf7a7147daf3..db300d93fd08 100644 --- a/drivers/gpu/drm/i915/i915_request.h +++ b/drivers/gpu/drm/i915/i915_request.h @@ -90,6 +90,7 @@ enum { /* Range reachable by combining user priority + cgroup offset */ I915_PRIORITY_MAX = 0x7fffff, I915_PRIORITY_MIN = -I915_PRIORITY_MAX, + I915_PRIORITY_MAX_DISPBOOST = I915_PRIORITY_MAX + 1, /* Special case priority values */ I915_PRIORITY_INVALID = INT_MIN, diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index b053a21f682b..1d0245e2fd75 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -12731,7 +12731,7 @@ intel_prepare_plane_fb(struct drm_plane *plane, struct drm_framebuffer *fb = new_state->fb; struct drm_i915_gem_object *obj = intel_fb_obj(fb); struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->state->fb); - int ret; + int boost, ret; if (old_obj) { struct drm_crtc_state *crtc_state = @@ -12783,7 +12783,8 @@ intel_prepare_plane_fb(struct drm_plane *plane, ret = intel_plane_pin_fb(to_intel_plane_state(new_state)); - i915_gem_object_wait_priority(obj, 0, I915_PRIORITY_DEFAULT_DISPBOOST); + boost = i915_cgroup_get_current_dispboost(dev_priv); + i915_gem_object_wait_priority(obj, 0, boost); mutex_unlock(&dev_priv->drm.struct_mutex); i915_gem_object_unpin_pages(obj); diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h index 6b70f46d224e..ad454f121884 100644 --- a/include/uapi/drm/i915_drm.h +++ b/include/uapi/drm/i915_drm.h @@ -1727,6 +1727,7 @@ struct drm_i915_cgroup_param { __u32 flags; __u64 param; #define I915_CGROUP_PARAM_PRIORITY_OFFSET 0x1 +#define I915_CGROUP_PARAM_DISPBOOST_PRIORITY 0x2 __s64 value; }; -- 2.14.3 -- To unsubscribe from this list: send the line "unsubscribe cgroups" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html