6536 lines · 173.9 KB · C
RawDownload
/* *  Generic process-grouping system. * *  Based originally on the cpuset system, extracted by Paul Menage *  Copyright (C) 2006 Google, Inc * *  Notifications support *  Copyright (C) 2009 Nokia Corporation *  Author: Kirill A. Shutemov * *  Copyright notices from the original cpuset code: *  -------------------------------------------------- *  Copyright (C) 2003 BULL SA. *  Copyright (C) 2004-2006 Silicon Graphics, Inc. * *  Portions derived from Patrick Mochel's sysfs code. *  sysfs is Copyright (c) 2001-3 Patrick Mochel * *  2003-10-10 Written by Simon Derr. *  2003-10-22 Updates by Stephen Hemminger. *  2004 May-July Rework by Paul Jackson. *  --------------------------------------------------- * *  This file is subject to the terms and conditions of the GNU General Public *  License.  See the file COPYING in the main directory of the Linux *  distribution for more details. */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/cgroup.h>#include <linux/cred.h>#include <linux/ctype.h>#include <linux/errno.h>#include <linux/init_task.h>#include <linux/kernel.h>#include <linux/list.h>#include <linux/magic.h>#include <linux/mm.h>#include <linux/mutex.h>#include <linux/mount.h>#include <linux/pagemap.h>#include <linux/proc_fs.h>#include <linux/rcupdate.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/spinlock.h>#include <linux/percpu-rwsem.h>#include <linux/string.h>#include <linux/sort.h>#include <linux/kmod.h>#include <linux/delayacct.h>#include <linux/cgroupstats.h>#include <linux/hashtable.h>#include <linux/pid_namespace.h>#include <linux/idr.h>#include <linux/vmalloc.h> /* TODO: replace with more sophisticated array */#include <linux/kthread.h>#include <linux/delay.h>#include <linux/atomic.h>#include <linux/cpuset.h>#include <linux/proc_ns.h>#include <linux/nsproxy.h>#include <linux/proc_ns.h>#include <net/sock.h> /* * pidlists linger the following amount before being destroyed.  The goal * is avoiding frequent destruction in the middle of consecutive read calls * Expiring in the middle is a performance problem not a correctness one. * 1 sec should be enough. */#define CGROUP_PIDLIST_DESTROY_DELAY	HZ #define CGROUP_FILE_NAME_MAX		(MAX_CGROUP_TYPE_NAMELEN +	\					 MAX_CFTYPE_NAME + 2) /* * cgroup_mutex is the master lock.  Any modification to cgroup or its * hierarchy must be performed while holding it. * * css_set_lock protects task->cgroups pointer, the list of css_set * objects, and the chain of tasks off each css_set. * * These locks are exported if CONFIG_PROVE_RCU so that accessors in * cgroup.h can use them for lockdep annotations. */#ifdef CONFIG_PROVE_RCUDEFINE_MUTEX(cgroup_mutex);DEFINE_SPINLOCK(css_set_lock);EXPORT_SYMBOL_GPL(cgroup_mutex);EXPORT_SYMBOL_GPL(css_set_lock);#elsestatic DEFINE_MUTEX(cgroup_mutex);static DEFINE_SPINLOCK(css_set_lock);#endif /* * Protects cgroup_idr and css_idr so that IDs can be released without * grabbing cgroup_mutex. */static DEFINE_SPINLOCK(cgroup_idr_lock); /* * Protects cgroup_file->kn for !self csses.  It synchronizes notifications * against file removal/re-creation across css hiding. */static DEFINE_SPINLOCK(cgroup_file_kn_lock); /* * Protects cgroup_subsys->release_agent_path.  Modifying it also requires * cgroup_mutex.  Reading requires either cgroup_mutex or this spinlock. */static DEFINE_SPINLOCK(release_agent_path_lock); struct percpu_rw_semaphore cgroup_threadgroup_rwsem; #define cgroup_assert_mutex_or_rcu_locked()				\	RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&			\			   !lockdep_is_held(&cgroup_mutex),		\			   "cgroup_mutex or RCU read lock required"); /* * cgroup destruction makes heavy use of work items and there can be a lot * of concurrent destructions.  Use a separate workqueue so that cgroup * destruction work items don't end up filling up max_active of system_wq * which may lead to deadlock. */static struct workqueue_struct *cgroup_destroy_wq; /* * pidlist destructions need to be flushed on cgroup destruction.  Use a * separate workqueue as flush domain. */static struct workqueue_struct *cgroup_pidlist_destroy_wq; /* generate an array of cgroup subsystem pointers */#define SUBSYS(_x) [_x ## _cgrp_id] = &_x ## _cgrp_subsys,static struct cgroup_subsys *cgroup_subsys[] = {#include <linux/cgroup_subsys.h>};#undef SUBSYS /* array of cgroup subsystem names */#define SUBSYS(_x) [_x ## _cgrp_id] = #_x,static const char *cgroup_subsys_name[] = {#include <linux/cgroup_subsys.h>};#undef SUBSYS /* array of static_keys for cgroup_subsys_enabled() and cgroup_subsys_on_dfl() */#define SUBSYS(_x)								\	DEFINE_STATIC_KEY_TRUE(_x ## _cgrp_subsys_enabled_key);			\	DEFINE_STATIC_KEY_TRUE(_x ## _cgrp_subsys_on_dfl_key);			\	EXPORT_SYMBOL_GPL(_x ## _cgrp_subsys_enabled_key);			\	EXPORT_SYMBOL_GPL(_x ## _cgrp_subsys_on_dfl_key);#include <linux/cgroup_subsys.h>#undef SUBSYS #define SUBSYS(_x) [_x ## _cgrp_id] = &_x ## _cgrp_subsys_enabled_key,static struct static_key_true *cgroup_subsys_enabled_key[] = {#include <linux/cgroup_subsys.h>};#undef SUBSYS #define SUBSYS(_x) [_x ## _cgrp_id] = &_x ## _cgrp_subsys_on_dfl_key,static struct static_key_true *cgroup_subsys_on_dfl_key[] = {#include <linux/cgroup_subsys.h>};#undef SUBSYS /* * The default hierarchy, reserved for the subsystems that are otherwise * unattached - it never has more than a single cgroup, and all tasks are * part of that cgroup. */struct cgroup_root cgrp_dfl_root;EXPORT_SYMBOL_GPL(cgrp_dfl_root); /* * The default hierarchy always exists but is hidden until mounted for the * first time.  This is for backward compatibility. */static bool cgrp_dfl_visible; /* Controllers blocked by the commandline in v1 */static u16 cgroup_no_v1_mask; /* some controllers are not supported in the default hierarchy */static u16 cgrp_dfl_inhibit_ss_mask; /* some controllers are implicitly enabled on the default hierarchy */static unsigned long cgrp_dfl_implicit_ss_mask; /* The list of hierarchy roots */ static LIST_HEAD(cgroup_roots);static int cgroup_root_count; /* hierarchy ID allocation and mapping, protected by cgroup_mutex */static DEFINE_IDR(cgroup_hierarchy_idr); /* * Assign a monotonically increasing serial number to csses.  It guarantees * cgroups with bigger numbers are newer than those with smaller numbers. * Also, as csses are always appended to the parent's ->children list, it * guarantees that sibling csses are always sorted in the ascending serial * number order on the list.  Protected by cgroup_mutex. */static u64 css_serial_nr_next = 1; /* * These bitmask flags indicate whether tasks in the fork and exit paths have * fork/exit handlers to call. This avoids us having to do extra work in the * fork/exit path to check which subsystems have fork/exit callbacks. */static u16 have_fork_callback __read_mostly;static u16 have_exit_callback __read_mostly;static u16 have_free_callback __read_mostly; /* cgroup namespace for init task */struct cgroup_namespace init_cgroup_ns = {	.count		= { .counter = 2, },	.user_ns	= &init_user_ns,	.ns.ops		= &cgroupns_operations,	.ns.inum	= PROC_CGROUP_INIT_INO,	.root_cset	= &init_css_set,}; /* Ditto for the can_fork callback. */static u16 have_canfork_callback __read_mostly; static struct file_system_type cgroup2_fs_type;static struct cftype cgroup_dfl_base_files[];static struct cftype cgroup_legacy_base_files[]; static int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask);static void cgroup_lock_and_drain_offline(struct cgroup *cgrp);static int cgroup_apply_control(struct cgroup *cgrp);static void cgroup_finalize_control(struct cgroup *cgrp, int ret);static void css_task_iter_advance(struct css_task_iter *it);static int cgroup_destroy_locked(struct cgroup *cgrp);static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,					      struct cgroup_subsys *ss);static void css_release(struct percpu_ref *ref);static void kill_css(struct cgroup_subsys_state *css);static int cgroup_addrm_files(struct cgroup_subsys_state *css,			      struct cgroup *cgrp, struct cftype cfts[],			      bool is_add); /** * cgroup_ssid_enabled - cgroup subsys enabled test by subsys ID * @ssid: subsys ID of interest * * cgroup_subsys_enabled() can only be used with literal subsys names which * is fine for individual subsystems but unsuitable for cgroup core.  This * is slower static_key_enabled() based test indexed by @ssid. */static bool cgroup_ssid_enabled(int ssid){	if (CGROUP_SUBSYS_COUNT == 0)		return false; 	return static_key_enabled(cgroup_subsys_enabled_key[ssid]);} static bool cgroup_ssid_no_v1(int ssid){	return cgroup_no_v1_mask & (1 << ssid);} /** * cgroup_on_dfl - test whether a cgroup is on the default hierarchy * @cgrp: the cgroup of interest * * The default hierarchy is the v2 interface of cgroup and this function * can be used to test whether a cgroup is on the default hierarchy for * cases where a subsystem should behave differnetly depending on the * interface version. * * The set of behaviors which change on the default hierarchy are still * being determined and the mount option is prefixed with __DEVEL__. * * List of changed behaviors: * * - Mount options "noprefix", "xattr", "clone_children", "release_agent" *   and "name" are disallowed. * * - When mounting an existing superblock, mount options should match. * * - Remount is disallowed. * * - rename(2) is disallowed. * * - "tasks" is removed.  Everything should be at process granularity.  Use *   "cgroup.procs" instead. * * - "cgroup.procs" is not sorted.  pids will be unique unless they got *   recycled inbetween reads. * * - "release_agent" and "notify_on_release" are removed.  Replacement *   notification mechanism will be implemented. * * - "cgroup.clone_children" is removed. * * - "cgroup.subtree_populated" is available.  Its value is 0 if the cgroup *   and its descendants contain no task; otherwise, 1.  The file also *   generates kernfs notification which can be monitored through poll and *   [di]notify when the value of the file changes. * * - cpuset: tasks will be kept in empty cpusets when hotplug happens and *   take masks of ancestors with non-empty cpus/mems, instead of being *   moved to an ancestor. * * - cpuset: a task can be moved into an empty cpuset, and again it takes *   masks of ancestors. * * - memcg: use_hierarchy is on by default and the cgroup file for the flag *   is not created. * * - blkcg: blk-throttle becomes properly hierarchical. * * - debug: disallowed on the default hierarchy. */static bool cgroup_on_dfl(const struct cgroup *cgrp){	return cgrp->root == &cgrp_dfl_root;} /* IDR wrappers which synchronize using cgroup_idr_lock */static int cgroup_idr_alloc(struct idr *idr, void *ptr, int start, int end,			    gfp_t gfp_mask){	int ret; 	idr_preload(gfp_mask);	spin_lock_bh(&cgroup_idr_lock);	ret = idr_alloc(idr, ptr, start, end, gfp_mask & ~__GFP_DIRECT_RECLAIM);	spin_unlock_bh(&cgroup_idr_lock);	idr_preload_end();	return ret;} static void *cgroup_idr_replace(struct idr *idr, void *ptr, int id){	void *ret; 	spin_lock_bh(&cgroup_idr_lock);	ret = idr_replace(idr, ptr, id);	spin_unlock_bh(&cgroup_idr_lock);	return ret;} static void cgroup_idr_remove(struct idr *idr, int id){	spin_lock_bh(&cgroup_idr_lock);	idr_remove(idr, id);	spin_unlock_bh(&cgroup_idr_lock);} static struct cgroup *cgroup_parent(struct cgroup *cgrp){	struct cgroup_subsys_state *parent_css = cgrp->self.parent; 	if (parent_css)		return container_of(parent_css, struct cgroup, self);	return NULL;} /* subsystems visibly enabled on a cgroup */static u16 cgroup_control(struct cgroup *cgrp){	struct cgroup *parent = cgroup_parent(cgrp);	u16 root_ss_mask = cgrp->root->subsys_mask; 	if (parent)		return parent->subtree_control; 	if (cgroup_on_dfl(cgrp))		root_ss_mask &= ~(cgrp_dfl_inhibit_ss_mask |				  cgrp_dfl_implicit_ss_mask);	return root_ss_mask;} /* subsystems enabled on a cgroup */static u16 cgroup_ss_mask(struct cgroup *cgrp){	struct cgroup *parent = cgroup_parent(cgrp); 	if (parent)		return parent->subtree_ss_mask; 	return cgrp->root->subsys_mask;} /** * cgroup_css - obtain a cgroup's css for the specified subsystem * @cgrp: the cgroup of interest * @ss: the subsystem of interest (%NULL returns @cgrp->self) * * Return @cgrp's css (cgroup_subsys_state) associated with @ss.  This * function must be called either under cgroup_mutex or rcu_read_lock() and * the caller is responsible for pinning the returned css if it wants to * keep accessing it outside the said locks.  This function may return * %NULL if @cgrp doesn't have @subsys_id enabled. */static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp,					      struct cgroup_subsys *ss){	if (ss)		return rcu_dereference_check(cgrp->subsys[ss->id],					lockdep_is_held(&cgroup_mutex));	else		return &cgrp->self;} /** * cgroup_e_css - obtain a cgroup's effective css for the specified subsystem * @cgrp: the cgroup of interest * @ss: the subsystem of interest (%NULL returns @cgrp->self) * * Similar to cgroup_css() but returns the effective css, which is defined * as the matching css of the nearest ancestor including self which has @ss * enabled.  If @ss is associated with the hierarchy @cgrp is on, this * function is guaranteed to return non-NULL css. */static struct cgroup_subsys_state *cgroup_e_css(struct cgroup *cgrp,						struct cgroup_subsys *ss){	lockdep_assert_held(&cgroup_mutex); 	if (!ss)		return &cgrp->self; 	/*	 * This function is used while updating css associations and thus	 * can't test the csses directly.  Test ss_mask.	 */	while (!(cgroup_ss_mask(cgrp) & (1 << ss->id))) {		cgrp = cgroup_parent(cgrp);		if (!cgrp)			return NULL;	} 	return cgroup_css(cgrp, ss);} /** * cgroup_get_e_css - get a cgroup's effective css for the specified subsystem * @cgrp: the cgroup of interest * @ss: the subsystem of interest * * Find and get the effective css of @cgrp for @ss.  The effective css is * defined as the matching css of the nearest ancestor including self which * has @ss enabled.  If @ss is not mounted on the hierarchy @cgrp is on, * the root css is returned, so this function always returns a valid css. * The returned css must be put using css_put(). */struct cgroup_subsys_state *cgroup_get_e_css(struct cgroup *cgrp,					     struct cgroup_subsys *ss){	struct cgroup_subsys_state *css; 	rcu_read_lock(); 	do {		css = cgroup_css(cgrp, ss); 		if (css && css_tryget_online(css))			goto out_unlock;		cgrp = cgroup_parent(cgrp);	} while (cgrp); 	css = init_css_set.subsys[ss->id];	css_get(css);out_unlock:	rcu_read_unlock();	return css;} /* convenient tests for these bits */static inline bool cgroup_is_dead(const struct cgroup *cgrp){	return !(cgrp->self.flags & CSS_ONLINE);} static void cgroup_get(struct cgroup *cgrp){	WARN_ON_ONCE(cgroup_is_dead(cgrp));	css_get(&cgrp->self);} static bool cgroup_tryget(struct cgroup *cgrp){	return css_tryget(&cgrp->self);} struct cgroup_subsys_state *of_css(struct kernfs_open_file *of){	struct cgroup *cgrp = of->kn->parent->priv;

Lines 1–500 of 6536.