This is the fourth iteration of the work previously posted here: (v1) https://lists.freedesktop.org/archives/intel-gfx/2018-January/153156.html (v2) https://www.mail-archive.com/dri-devel@xxxxxxxxxxxxxxxxxxxxx/msg208170.html (v3) https://lists.freedesktop.org/archives/intel-gfx/2018-March/157928.html The high level goal of this work is to allow non-cgroup-controller parts of the kernel (e.g., device drivers) to register their own private policy data for specific cgroups. That mechanism is then made use of in the i915 graphics driver to allow GPU priority to be assigned according to the cgroup membership of the owning process. Please see the v1 cover letter linked above for a more in-depth explanation and justification. v4 of this series brings large changes to the cgroup core half of the series and moderate changes to the i915 side. cgroup core changes: * The cgroup private data interface and implementation has changed again. The internal implementation is ida+radixtree based to allow much faster lookups than the previous hashtable approach. Private data is now registered and looked up via kref, which should allow the same private data to be set on multiple cgroups at the same time. The interface now looks like: - cgroup_priv_getkey() Obtain an integer key that will be used to store/lookup cgroup private data. This only needs to be called once at startup, driver init, etc.; after that the same key is used to store private data against any cgroup - cgroup_priv_destroykey(key) Release a private data key and drop references to any private data associated with the key on all cgroups. This function is very heavy, but will generally only be called by module-based users of the interface when the module is unloaded. - cgroup_priv_install(cgrp, key, ref) Store private data for a cgroup under the given key and increment the reference count. - cgroup_priv_get(cgrp, key) Take and return a reference to a cgroup's private data associated with the given key. - cgroup_priv_get_current(key) Same as cgroup_priv_get, but operates on the current task's cgroup. - cgroup_priv_release(cgrp, key) Remove private data from a cgroup and decrement its reference count. * Dropped the cgroup_permission() function. My i915 usage of this functionality will take a different approach for determining access control. i915 cgroup-based priority changes: * cgroup priority offset is now bounded such that (context+cgroup) adjustments fall within the range [-0x7fffff,0x7fffff]. This only takes 24 bits, leaving several effective priority bits for future flags or bookkeeping. * Display boost is added as a second cgroup parameter; each cgroup's processes can get differing boosts if a display operation is waiting on their completion. If we have non-overlapping cgroup priority ranges, this allows a system administrator to decide whether workloads from the lower priority cgroup(s) should still jump past the workloads in some/all of the higher priority cgroups. * Access control for cgroup settings has been changed. Instead of following cgroup filesystem permissions, we now restrict the access to either the DRM master or capable(CAP_SYS_RESOURCE). Cc: Tejun Heo <tj@xxxxxxxxxx> Cc: Alexei Starovoitov <ast@xxxxxx> Cc: Roman Gushchin <guro@xxxxxx> Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Matt Roper (8): cgroup: Allow registration and lookup of cgroup private data (v2) cgroup: Introduce task_get_dfl_cgroup() (v2) cgroup: Introduce cgroup_priv_get_current drm/i915: Adjust internal priority definitions drm/i915: cgroup integration (v3) drm/i915: Introduce 'priority offset' for GPU contexts (v3) drm/i915: Introduce per-cgroup display boost setting drm/i915: Add context priority & priority offset to debugfs (v2) drivers/gpu/drm/i915/Makefile | 1 + drivers/gpu/drm/i915/i915_cgroup.c | 205 +++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_debugfs.c | 3 + drivers/gpu/drm/i915/i915_drv.c | 7 ++ drivers/gpu/drm/i915/i915_drv.h | 33 ++++- drivers/gpu/drm/i915/i915_gem_context.c | 11 +- drivers/gpu/drm/i915/i915_gem_context.h | 9 ++ drivers/gpu/drm/i915/i915_request.h | 18 ++- drivers/gpu/drm/i915/intel_display.c | 5 +- include/linux/cgroup-defs.h | 8 ++ include/linux/cgroup.h | 37 ++++++ include/uapi/drm/i915_drm.h | 14 +++ kernel/cgroup/cgroup.c | 208 +++++++++++++++++++++++++++++++- 13 files changed, 545 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/drm/i915/i915_cgroup.c -- 2.14.3 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel