4825 lines · 130.4 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. */ #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/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> /* * 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_tree_mutex nests above cgroup_mutex and protects cftypes, file * creation/removal and hierarchy changing operations including cgroup * creation, removal, css association and controller rebinding.  This outer * lock is needed mainly to resolve the circular dependency between kernfs * active ref and cgroup_mutex.  cgroup_tree_mutex nests above both. */static DEFINE_MUTEX(cgroup_tree_mutex); /* * cgroup_mutex is the master lock.  Any modification to cgroup or its * hierarchy must be performed while holding it. * * css_set_rwsem 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);DECLARE_RWSEM(css_set_rwsem);EXPORT_SYMBOL_GPL(cgroup_mutex);EXPORT_SYMBOL_GPL(css_set_rwsem);#elsestatic DEFINE_MUTEX(cgroup_mutex);static DECLARE_RWSEM(css_set_rwsem);#endif /* * 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); #define cgroup_assert_mutexes_or_rcu_locked()				\	rcu_lockdep_assert(rcu_read_lock_held() ||			\			   lockdep_is_held(&cgroup_tree_mutex) ||	\			   lockdep_is_held(&cgroup_mutex),		\			   "cgroup_[tree_]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 /* * 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; /* * The default hierarchy always exists but is hidden until mounted for the * first time.  This is for backward compatibility. */static bool cgrp_dfl_root_visible; /* 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 cgroups.  It * guarantees cgroups with bigger numbers are newer than those with smaller * numbers.  Also, as cgroups are always appended to the parent's * ->children list, it guarantees that sibling cgroups are always sorted in * the ascending serial number order on the list.  Protected by * cgroup_mutex. */static u64 cgroup_serial_nr_next = 1; /* This flag indicates whether tasks in the fork and exit paths should * check for fork/exit handlers to call. This avoids us having to do * extra work in the fork/exit path if none of the subsystems need to * be called. */static int need_forkexit_callback __read_mostly; static struct cftype cgroup_base_files[]; static void cgroup_put(struct cgroup *cgrp);static int rebind_subsystems(struct cgroup_root *dst_root,			     unsigned long ss_mask);static void cgroup_destroy_css_killed(struct cgroup *cgrp);static int cgroup_destroy_locked(struct cgroup *cgrp);static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[],			      bool is_add);static void cgroup_pidlist_destroy_all(struct cgroup *cgrp); /** * cgroup_css - obtain a cgroup's css for the specified subsystem * @cgrp: the cgroup of interest * @ss: the subsystem of interest (%NULL returns the dummy_css) * * 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_tree_mutex) ||					lockdep_is_held(&cgroup_mutex));	else		return &cgrp->dummy_css;} /* convenient tests for these bits */static inline bool cgroup_is_dead(const struct cgroup *cgrp){	return test_bit(CGRP_DEAD, &cgrp->flags);} struct cgroup_subsys_state *seq_css(struct seq_file *seq){	struct kernfs_open_file *of = seq->private;	struct cgroup *cgrp = of->kn->parent->priv;	struct cftype *cft = seq_cft(seq); 	/*	 * This is open and unprotected implementation of cgroup_css().	 * seq_css() is only called from a kernfs file operation which has	 * an active reference on the file.  Because all the subsystem	 * files are drained before a css is disassociated with a cgroup,	 * the matching css from the cgroup's subsys table is guaranteed to	 * be and stay valid until the enclosing operation is complete.	 */	if (cft->ss)		return rcu_dereference_raw(cgrp->subsys[cft->ss->id]);	else		return &cgrp->dummy_css;}EXPORT_SYMBOL_GPL(seq_css); /** * cgroup_is_descendant - test ancestry * @cgrp: the cgroup to be tested * @ancestor: possible ancestor of @cgrp * * Test whether @cgrp is a descendant of @ancestor.  It also returns %true * if @cgrp == @ancestor.  This function is safe to call as long as @cgrp * and @ancestor are accessible. */bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor){	while (cgrp) {		if (cgrp == ancestor)			return true;		cgrp = cgrp->parent;	}	return false;} static int cgroup_is_releasable(const struct cgroup *cgrp){	const int bits =		(1 << CGRP_RELEASABLE) |		(1 << CGRP_NOTIFY_ON_RELEASE);	return (cgrp->flags & bits) == bits;} static int notify_on_release(const struct cgroup *cgrp){	return test_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);} /** * for_each_css - iterate all css's of a cgroup * @css: the iteration cursor * @ssid: the index of the subsystem, CGROUP_SUBSYS_COUNT after reaching the end * @cgrp: the target cgroup to iterate css's of * * Should be called under cgroup_mutex. */#define for_each_css(css, ssid, cgrp)					\	for ((ssid) = 0; (ssid) < CGROUP_SUBSYS_COUNT; (ssid)++)	\		if (!((css) = rcu_dereference_check(			\				(cgrp)->subsys[(ssid)],			\				lockdep_is_held(&cgroup_tree_mutex) ||	\				lockdep_is_held(&cgroup_mutex)))) { }	\		else /** * for_each_subsys - iterate all enabled cgroup subsystems * @ss: the iteration cursor * @ssid: the index of @ss, CGROUP_SUBSYS_COUNT after reaching the end */#define for_each_subsys(ss, ssid)					\	for ((ssid) = 0; (ssid) < CGROUP_SUBSYS_COUNT &&		\	     (((ss) = cgroup_subsys[ssid]) || true); (ssid)++) /* iterate across the hierarchies */#define for_each_root(root)						\	list_for_each_entry((root), &cgroup_roots, root_list) /** * cgroup_lock_live_group - take cgroup_mutex and check that cgrp is alive. * @cgrp: the cgroup to be checked for liveness * * On success, returns true; the mutex should be later unlocked.  On * failure returns false with no lock held. */static bool cgroup_lock_live_group(struct cgroup *cgrp){	mutex_lock(&cgroup_mutex);	if (cgroup_is_dead(cgrp)) {		mutex_unlock(&cgroup_mutex);		return false;	}	return true;} /* the list of cgroups eligible for automatic release. Protected by * release_list_lock */static LIST_HEAD(release_list);static DEFINE_RAW_SPINLOCK(release_list_lock);static void cgroup_release_agent(struct work_struct *work);static DECLARE_WORK(release_agent_work, cgroup_release_agent);static void check_for_release(struct cgroup *cgrp); /* * A cgroup can be associated with multiple css_sets as different tasks may * belong to different cgroups on different hierarchies.  In the other * direction, a css_set is naturally associated with multiple cgroups. * This M:N relationship is represented by the following link structure * which exists for each association and allows traversing the associations * from both sides. */struct cgrp_cset_link {	/* the cgroup and css_set this link associates */	struct cgroup		*cgrp;	struct css_set		*cset; 	/* list of cgrp_cset_links anchored at cgrp->cset_links */	struct list_head	cset_link; 	/* list of cgrp_cset_links anchored at css_set->cgrp_links */	struct list_head	cgrp_link;}; /* * The default css_set - used by init and its children prior to any * hierarchies being mounted. It contains a pointer to the root state * for each subsystem. Also used to anchor the list of css_sets. Not * reference-counted, to improve performance when child cgroups * haven't been created. */struct css_set init_css_set = {	.refcount		= ATOMIC_INIT(1),	.cgrp_links		= LIST_HEAD_INIT(init_css_set.cgrp_links),	.tasks			= LIST_HEAD_INIT(init_css_set.tasks),	.mg_tasks		= LIST_HEAD_INIT(init_css_set.mg_tasks),	.mg_preload_node	= LIST_HEAD_INIT(init_css_set.mg_preload_node),	.mg_node		= LIST_HEAD_INIT(init_css_set.mg_node),}; static int css_set_count	= 1;	/* 1 for init_css_set */ /* * hash table for cgroup groups. This improves the performance to find * an existing css_set. This hash doesn't (currently) take into * account cgroups in empty hierarchies. */#define CSS_SET_HASH_BITS	7static DEFINE_HASHTABLE(css_set_table, CSS_SET_HASH_BITS); static unsigned long css_set_hash(struct cgroup_subsys_state *css[]){	unsigned long key = 0UL;	struct cgroup_subsys *ss;	int i; 	for_each_subsys(ss, i)		key += (unsigned long)css[i];	key = (key >> 16) ^ key; 	return key;} static void put_css_set_locked(struct css_set *cset, bool taskexit){	struct cgrp_cset_link *link, *tmp_link; 	lockdep_assert_held(&css_set_rwsem); 	if (!atomic_dec_and_test(&cset->refcount))		return; 	/* This css_set is dead. unlink it and release cgroup refcounts */	hash_del(&cset->hlist);	css_set_count--; 	list_for_each_entry_safe(link, tmp_link, &cset->cgrp_links, cgrp_link) {		struct cgroup *cgrp = link->cgrp; 		list_del(&link->cset_link);		list_del(&link->cgrp_link); 		/* @cgrp can't go away while we're holding css_set_rwsem */		if (list_empty(&cgrp->cset_links) && notify_on_release(cgrp)) {			if (taskexit)				set_bit(CGRP_RELEASABLE, &cgrp->flags);			check_for_release(cgrp);		} 		kfree(link);	} 	kfree_rcu(cset, rcu_head);} static void put_css_set(struct css_set *cset, bool taskexit){	/*	 * Ensure that the refcount doesn't hit zero while any readers	 * can see it. Similar to atomic_dec_and_lock(), but for an	 * rwlock	 */	if (atomic_add_unless(&cset->refcount, -1, 1))		return; 	down_write(&css_set_rwsem);	put_css_set_locked(cset, taskexit);	up_write(&css_set_rwsem);} /* * refcounted get/put for css_set objects */static inline void get_css_set(struct css_set *cset){	atomic_inc(&cset->refcount);} /** * compare_css_sets - helper function for find_existing_css_set(). * @cset: candidate css_set being tested * @old_cset: existing css_set for a task * @new_cgrp: cgroup that's being entered by the task * @template: desired set of css pointers in css_set (pre-calculated) * * Returns true if "cset" matches "old_cset" except for the hierarchy * which "new_cgrp" belongs to, for which it should match "new_cgrp". */static bool compare_css_sets(struct css_set *cset,			     struct css_set *old_cset,			     struct cgroup *new_cgrp,			     struct cgroup_subsys_state *template[]){	struct list_head *l1, *l2; 	if (memcmp(template, cset->subsys, sizeof(cset->subsys))) {		/* Not all subsystems matched */		return false;	} 	/*	 * Compare cgroup pointers in order to distinguish between	 * different cgroups in heirarchies with no subsystems. We	 * could get by with just this check alone (and skip the	 * memcmp above) but on most setups the memcmp check will	 * avoid the need for this more expensive check on almost all	 * candidates.	 */ 	l1 = &cset->cgrp_links;	l2 = &old_cset->cgrp_links;	while (1) {		struct cgrp_cset_link *link1, *link2;		struct cgroup *cgrp1, *cgrp2; 		l1 = l1->next;		l2 = l2->next;		/* See if we reached the end - both lists are equal length. */		if (l1 == &cset->cgrp_links) {			BUG_ON(l2 != &old_cset->cgrp_links);			break;		} else {			BUG_ON(l2 == &old_cset->cgrp_links);		}		/* Locate the cgroups associated with these links. */		link1 = list_entry(l1, struct cgrp_cset_link, cgrp_link);		link2 = list_entry(l2, struct cgrp_cset_link, cgrp_link);		cgrp1 = link1->cgrp;		cgrp2 = link2->cgrp;		/* Hierarchies should be linked in the same order. */		BUG_ON(cgrp1->root != cgrp2->root); 		/*		 * If this hierarchy is the hierarchy of the cgroup		 * that's changing, then we need to check that this		 * css_set points to the new cgroup; if it's any other		 * hierarchy, then this css_set should point to the		 * same cgroup as the old css_set.		 */		if (cgrp1->root == new_cgrp->root) {

Lines 1–500 of 4825.