cgroup: *squashing updates from 01. April 2012*

cgroup: deprecate remount option changes

      This patch marks the following features for deprecation.

      * Rebinding subsys by remount: Never reached useful state - only works
	on empty hierarchies.

      * release_agent update by remount: release_agent itself will be
	replaced with conventional fsnotify notification.

      v2: Lennart pointed out that "name=" is necessary for mounts w/o any
	  controller attached.  Drop "name=" deprecation.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>
      Cc: Lennart Poettering <mzxreary@0pointer.de>

cgroup: move cgroup_clear_directory() call out of cgroup_populate_dir()

      cgroup_populate_dir() currently clears all files and then repopulate
      the directory; however, the clearing part is only useful when it's
      called from cgroup_remount().  Relocate the invocation to
      cgroup_remount().

      This is to prepare for further cgroup file handling updates.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: build list of all cgroups under a given cgroupfs_root

      Build a list of all cgroups anchored at cgroupfs_root->allcg_list and
      going through cgroup->allcg_node.  The list is protected by
      cgroup_mutex and will be used to improve cgroup file handling.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: implement cgroup_add_cftypes() and friends

      Currently, cgroup directories are populated by subsys->populate()
      callback explicitly creating files on each cgroup creation.  This
      level of flexibility isn't needed or desirable.  It provides largely
      unused flexibility which call for abuses while severely limiting what
      the core layer can do through the lack of structure and conventions.

      Per each cgroup file type, the only distinction that cgroup users is
      making is whether a cgroup is root or not, which can easily be
      expressed with flags.

      This patch introduces cgroup_add_cftypes().  These deal with cftypes
      instead of individual files - controllers indicate that certain types
      of files exist for certain subsystem.  Newly added CFTYPE_*_ON_ROOT
      flags indicate whether a cftype should be excluded or created only on
      the root cgroup.

      cgroup_add_cftypes() can be called any time whether the target
      subsystem is currently attached or not.  cgroup core will create files
      on the existing cgroups as necessary.

      Also, cgroup_subsys->base_cftypes is added to ease registration of the
      base files for the subsystem.  If non-NULL on subsys init, the cftypes
      pointed to by ->base_cftypes are automatically registered on subsys
      init / load.

      Further patches will convert the existing users and remove the file
      based interface.  Note that this interface allows dynamic addition of
      files to an active controller.  This will be used for sub-controller
      modularity and unified hierarchy in the longer term.

      This patch implements the new mechanism but doesn't apply it to any
      user.

      v2: replaced DECLARE_CGROUP_CFTYPES[_COND]() with
	  cgroup_subsys->base_cftypes, which works better for cgroup_subsys
	  which is loaded as module.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: merge cft_release_agent cftype array into the base files array

      Now that cftype can express whether a file should only be on root,
      cft_release_agent can be merged into the base files cftypes array.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: relocate cftype and cgroup_subsys definitions in controllers

      blk-cgroup, netprio_cgroup, cls_cgroup and tcp_memcontrol
      unnecessarily define cftype array and cgroup_subsys structures at the
      top of the file, which is unconventional and necessiates forward
      declaration of methods.

      This patch relocates those below the definitions of the methods and
      removes the forward declarations.  Note that forward declaration of
      tcp_files[] is added in tcp_memcontrol.c for tcp_init_cgroup().  This
      will be removed soon by another patch.

      This patch doesn't introduce any functional change.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

      # This is the 7th commit message:

      cgroup: convert all non-memcg controllers to the new cftype interface

      Convert debug, freezer, cpuset, cpu_cgroup, cpuacct, net_prio, blkio,
      net_cls and device controllers to use the new cftype based interface.
      Termination entry is added to cftype arrays and populate callbacks are
      replaced with cgroup_subsys->base_cftypes initializations.

      This is functionally identical transformation.  There shouldn't be any
      visible behavior change.

      memcg is rather special and will be converted separately.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>
      Cc: Paul Menage <paul@paulmenage.org>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: "David S. Miller" <davem@davemloft.net>
      Cc: Vivek Goyal <vgoyal@redhat.com>

memcg: always create memsw files if CONFIG_CGROUP_MEM_RES_CTLR_SWAP

      Instead of conditioning creation of memsw files on do_swap_account,
      always create the files if compiled-in and fail read/write attempts
      with -EOPNOTSUPP if !do_swap_account.

      This is suggested by KAMEZAWA to simplify memcg file creation so that
      it can use cgroup->subsys_cftypes.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: convert memcg controller to the new cftype interface

      Convert memcg to use the new cftype based interface.  kmem support
      abuses ->populate() for mem_cgroup_sockets_init() so it can't be
      removed at the moment.

      tcp_memcontrol is updated so that tcp_files[] is registered via a
      __initcall.  This change also allows removing the forward declaration
      of tcp_files[].  Removed.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Michal Hocko <mhocko@suse.cz>
      Cc: Balbir Singh <bsingharora@gmail.com>
      Cc: Glauber Costa <glommer@parallels.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Greg Thelen <gthelen@google.com>

cgroup: remove cgroup_add_file[s]()

      No controller is using cgroup_add_files[s]().  Unexport them, and
      convert cgroup_add_files() to handle NULL entry terminated array
      instead of taking count explicitly and continue creation on failure
      for internal use.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: relocate __d_cgrp() and __d_cft()

      Move the two macros upwards as they'll be used earlier in the file.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

      # This is the 12th commit message:

      cgroup: introduce struct cfent

      This patch adds cfent (cgroup file entry) which is the association
      between a cgroup and a file.  This is in-cgroup representation of
      files under a cgroup directory.  This simplifies walking walking
      cgroup files and thus cgroup_clear_directory(), which is now
      implemented in two parts - cgroup_rm_file() and a loop around it.

      cgroup_rm_file() will be used to implement cftype removal and cfent is
      scheduled to serve cgroup specific per-file data (e.g. for sysfs-like
      "sever" semantics).

      v2: - cfe was freed from cgroup_rm_file() which led to use-after-free
	    if the file had openers at the time of removal.  Moved to
	    cgroup_diput().

	  - cgroup_clear_directory() triggered WARN_ON_ONCE() if d_subdirs
	    wasn't empty after removing all files.  This triggered
	    spuriously if some files were open during directory clearing.
	    Removed.

      v3: - In cgroup_diput(), WARN_ONCE(!list_empty(&cfe->node)) could be
	    spuriously triggered for root cgroups because they don't go
	    through cgroup_clear_directory() on unmount.  Don't trigger WARN
	    for root cgroups.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>
      Cc: Glauber Costa <glommer@parallels.com>

cgroup: implement cgroup_rm_cftypes()

      Implement cgroup_rm_cftypes() which removes an array of cftypes from a
      subsystem.  It can be called whether the target subsys is attached or
      not.  cgroup core will remove the specified file from all existing
      cgroups.

      This will be used to improve sub-subsys modularity and will be helpful
      for unified hierarchy.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: use negative bias on css->refcnt to block css_tryget()

      When a cgroup is about to be removed, cgroup_clear_css_refs() is
      called to check and ensure that there are no active css references.

      This is currently achieved by dropping the refcnt to zero iff it has
      only the base ref.  If all css refs could be dropped to zero, ref
      clearing is successful and CSS_REMOVED is set on all css.  If not, the
      base ref is restored.  While css ref is zero w/o CSS_REMOVED set, any
      css_tryget() attempt on it busy loops so that they are atomic
      w.r.t. the whole css ref clearing.

      This does work but dropping and re-instating the base ref is somewhat
      hairy and makes it difficult to add more logic to the put path as
      there are two of them - the regular css_put() and the reversible base
      ref clearing.

      This patch updates css ref clearing such that blocking new
      css_tryget() and putting the base ref are separate operations.
      CSS_DEACT_BIAS, defined as INT_MIN, is added to css->refcnt and
      css_tryget() busy loops while refcnt is negative.  After all css refs
      are deactivated, if they were all one, ref clearing succeeded and
      CSS_REMOVED is set and the base ref is put using the regular
      css_put(); otherwise, CSS_DEACT_BIAS is subtracted from the refcnts
      and the original postive values are restored.

      css_refcnt() accessor which always returns the unbiased positive
      reference counts is added and used to simplify refcnt usages.  While
      at it, relocate and reformat comments in cgroup_has_css_refs().

      This separates css->refcnt deactivation and putting the base ref,
      which enables the next patch to make ref clearing optional.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>

cgroup: make css->refcnt clearing on cgroup removal optional

      Currently, cgroup removal tries to drain all css references.  If there
      are active css references, the removal logic waits and retries
      ->pre_detroy() until either all refs drop to zero or removal is
      cancelled.

      This semantics is unusual and adds non-trivial complexity to cgroup
      core and IMHO is fundamentally misguided in that it couples internal
      implementation details (references to internal data structure) with
      externally visible operation (rmdir).  To userland, this is a behavior
      peculiarity which is unnecessary and difficult to expect (css refs is
      otherwise invisible from userland), and, to policy implementations,
      this is an unnecessary restriction (e.g. blkcg wants to hold css refs
      for caching purposes but can't as that becomes visible as rmdir hang).

      Unfortunately, memcg currently depends on ->pre_destroy() retrials and
      cgroup removal vetoing and can't be immmediately switched to the new
      behavior.  This patch introduces the new behavior of not waiting for
      css refs to drain and maintains the old behavior for subsystems which
      have __DEPRECATED_clear_css_refs set.

      Once, memcg is updated, we can drop the code paths for the old
      behavior as proposed in the following patch.  Note that the following
      patch is incorrect in that dput work item is in cgroup and may lose
      some of dputs when multiples css's are released back-to-back, and
      __css_put() triggers check_for_release() when refcnt reaches 0 instead
      of 1; however, it shows what part can be removed.

	http://thread.gmane.org/gmane.linux.kernel.containers/22559/focus=75251

      Note that, in not-too-distant future, cgroup core will start emitting
      warning messages for subsys which require the old behavior, so please
      get moving.

      Signed-off-by: Tejun Heo <tj@kernel.org>
      Acked-by: Li Zefan <lizf@cn.fujitsu.com>
      Cc: Vivek Goyal <vgoyal@redhat.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Michal Hocko <mhocko@suse.cz>
      Cc: Balbir Singh <bsingharora@gmail.com>
      Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>