diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-29 19:14:20 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-29 19:14:20 -0700 | 
| commit | 191a712090bb8a10e6f129360eeed2d68f3d4c9a (patch) | |
| tree | 17e2d6c27fb8a7c3a61828fbcc7c343a4966a0a9 /Documentation/cgroups | |
| parent | 46d9be3e5eb01f71fc02653755d970247174b400 (diff) | |
| parent | 2a0010af17b1739ef8ea8cf02647a127241ee674 (diff) | |
| download | linux-191a712090bb8a10e6f129360eeed2d68f3d4c9a.tar.bz2 | |
Merge branch 'for-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo:
 - Fixes and a lot of cleanups.  Locking cleanup is finally complete.
   cgroup_mutex is no longer exposed to individual controlelrs which
   used to cause nasty deadlock issues.  Li fixed and cleaned up quite a
   bit including long standing ones like racy cgroup_path().
 - device cgroup now supports proper hierarchy thanks to Aristeu.
 - perf_event cgroup now supports proper hierarchy.
 - A new mount option "__DEVEL__sane_behavior" is added.  As indicated
   by the name, this option is to be used for development only at this
   point and generates a warning message when used.  Unfortunately,
   cgroup interface currently has too many brekages and inconsistencies
   to implement a consistent and unified hierarchy on top.  The new flag
   is used to collect the behavior changes which are necessary to
   implement consistent unified hierarchy.  It's likely that this flag
   won't be used verbatim when it becomes ready but will be enabled
   implicitly along with unified hierarchy.
   The option currently disables some of broken behaviors in cgroup core
   and also .use_hierarchy switch in memcg (will be routed through -mm),
   which can be used to make very unusual hierarchy where nesting is
   partially honored.  It will also be used to implement hierarchy
   support for blk-throttle which would be impossible otherwise without
   introducing a full separate set of control knobs.
   This is essentially versioning of interface which isn't very nice but
   at this point I can't see any other options which would allow keeping
   the interface the same while moving towards hierarchy behavior which
   is at least somewhat sane.  The planned unified hierarchy is likely
   to require some level of adaptation from userland anyway, so I think
   it'd be best to take the chance and update the interface such that
   it's supportable in the long term.
   Maintaining the existing interface does complicate cgroup core but
   shouldn't put too much strain on individual controllers and I think
   it'd be manageable for the foreseeable future.  Maybe we'll be able
   to drop it in a decade.
Fix up conflicts (including a semantic one adding a new #include to ppc
that was uncovered by header the file changes) as per Tejun.
* 'for-3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (45 commits)
  cpuset: fix compile warning when CONFIG_SMP=n
  cpuset: fix cpu hotplug vs rebuild_sched_domains() race
  cpuset: use rebuild_sched_domains() in cpuset_hotplug_workfn()
  cgroup: restore the call to eventfd->poll()
  cgroup: fix use-after-free when umounting cgroupfs
  cgroup: fix broken file xattrs
  devcg: remove parent_cgroup.
  memcg: force use_hierarchy if sane_behavior
  cgroup: remove cgrp->top_cgroup
  cgroup: introduce sane_behavior mount option
  move cgroupfs_root to include/linux/cgroup.h
  cgroup: convert cgroupfs_root flag bits to masks and add CGRP_ prefix
  cgroup: make cgroup_path() not print double slashes
  Revert "cgroup: remove bind() method from cgroup_subsys."
  perf: make perf_event cgroup hierarchical
  cgroup: implement cgroup_is_descendant()
  cgroup: make sure parent won't be destroyed before its children
  cgroup: remove bind() method from cgroup_subsys.
  devcg: remove broken_hierarchy tag
  cgroup: remove cgroup_lock_is_held()
  ...
Diffstat (limited to 'Documentation/cgroups')
| -rw-r--r-- | Documentation/cgroups/cgroups.txt | 3 | ||||
| -rw-r--r-- | Documentation/cgroups/devices.txt | 70 | 
2 files changed, 69 insertions, 4 deletions
| diff --git a/Documentation/cgroups/cgroups.txt b/Documentation/cgroups/cgroups.txt index bcf1a00b06a1..638bf17ff869 100644 --- a/Documentation/cgroups/cgroups.txt +++ b/Documentation/cgroups/cgroups.txt @@ -442,7 +442,7 @@ You can attach the current shell task by echoing 0:  You can use the cgroup.procs file instead of the tasks file to move all  threads in a threadgroup at once. Echoing the PID of any task in a  threadgroup to cgroup.procs causes all tasks in that threadgroup to be -be attached to the cgroup. Writing 0 to cgroup.procs moves all tasks +attached to the cgroup. Writing 0 to cgroup.procs moves all tasks  in the writing task's threadgroup.  Note: Since every task is always a member of exactly one cgroup in each @@ -580,6 +580,7 @@ propagation along the hierarchy. See the comment on  cgroup_for_each_descendant_pre() for details.  void css_offline(struct cgroup *cgrp); +(cgroup_mutex held by caller)  This is the counterpart of css_online() and called iff css_online()  has succeeded on @cgrp. This signifies the beginning of the end of diff --git a/Documentation/cgroups/devices.txt b/Documentation/cgroups/devices.txt index 16624a7f8222..3c1095ca02ea 100644 --- a/Documentation/cgroups/devices.txt +++ b/Documentation/cgroups/devices.txt @@ -13,9 +13,7 @@ either an integer or * for all.  Access is a composition of r  The root device cgroup starts with rwm to 'all'.  A child device  cgroup gets a copy of the parent.  Administrators can then remove  devices from the whitelist or add new entries.  A child cgroup can -never receive a device access which is denied by its parent.  However -when a device access is removed from a parent it will not also be -removed from the child(ren). +never receive a device access which is denied by its parent.  2. User Interface @@ -50,3 +48,69 @@ task to a new cgroup.  (Again we'll probably want to change that).  A cgroup may not be granted more permissions than the cgroup's  parent has. + +4. Hierarchy + +device cgroups maintain hierarchy by making sure a cgroup never has more +access permissions than its parent.  Every time an entry is written to +a cgroup's devices.deny file, all its children will have that entry removed +from their whitelist and all the locally set whitelist entries will be +re-evaluated.  In case one of the locally set whitelist entries would provide +more access than the cgroup's parent, it'll be removed from the whitelist. + +Example: +      A +     / \ +        B + +    group        behavior	exceptions +    A            allow		"b 8:* rwm", "c 116:1 rw" +    B            deny		"c 1:3 rwm", "c 116:2 rwm", "b 3:* rwm" + +If a device is denied in group A: +	# echo "c 116:* r" > A/devices.deny +it'll propagate down and after revalidating B's entries, the whitelist entry +"c 116:2 rwm" will be removed: + +    group        whitelist entries                        denied devices +    A            all                                      "b 8:* rwm", "c 116:* rw" +    B            "c 1:3 rwm", "b 3:* rwm"                 all the rest + +In case parent's exceptions change and local exceptions are not allowed +anymore, they'll be deleted. + +Notice that new whitelist entries will not be propagated: +      A +     / \ +        B + +    group        whitelist entries                        denied devices +    A            "c 1:3 rwm", "c 1:5 r"                   all the rest +    B            "c 1:3 rwm", "c 1:5 r"                   all the rest + +when adding "c *:3 rwm": +	# echo "c *:3 rwm" >A/devices.allow + +the result: +    group        whitelist entries                        denied devices +    A            "c *:3 rwm", "c 1:5 r"                   all the rest +    B            "c 1:3 rwm", "c 1:5 r"                   all the rest + +but now it'll be possible to add new entries to B: +	# echo "c 2:3 rwm" >B/devices.allow +	# echo "c 50:3 r" >B/devices.allow +or even +	# echo "c *:3 rwm" >B/devices.allow + +Allowing or denying all by writing 'a' to devices.allow or devices.deny will +not be possible once the device cgroups has children. + +4.1 Hierarchy (internal implementation) + +device cgroups is implemented internally using a behavior (ALLOW, DENY) and a +list of exceptions.  The internal state is controlled using the same user +interface to preserve compatibility with the previous whitelist-only +implementation.  Removal or addition of exceptions that will reduce the access +to devices will be propagated down the hierarchy. +For every propagated exception, the effective rules will be re-evaluated based +on current parent's access rules. |