@@ -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);
@@ -150,6 +153,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;
@@ -184,5 +200,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
@@ -2689,6 +2689,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 void i915_cgroup_init(struct drm_i915_private *dev_priv) {}
static inline void i915_cgroup_shutdown(struct drm_i915_private *dev_priv) {}
@@ -2702,6 +2703,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 */
@@ -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,
@@ -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);
@@ -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;
};
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@chris-wilson.co.uk> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> --- 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(-)