aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/cgroup.h2
-rw-r--r--kernel/cgroup.c142
2 files changed, 80 insertions, 64 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index ff9055fc3d2a..2ebf7afedd9f 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -175,7 +175,7 @@ struct css_set {
175 * 175 *
176 * 176 *
177 * When reading/writing to a file: 177 * When reading/writing to a file:
178 * - the cgroup to use in file->f_dentry->d_parent->d_fsdata 178 * - the cgroup to use is file->f_dentry->d_parent->d_fsdata
179 * - the 'cftype' of the file is file->f_dentry->d_fsdata 179 * - the 'cftype' of the file is file->f_dentry->d_fsdata
180 */ 180 */
181 181
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 4766bb65e4d9..36066d8a4911 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -113,9 +113,9 @@ static int root_count;
113#define dummytop (&rootnode.top_cgroup) 113#define dummytop (&rootnode.top_cgroup)
114 114
115/* This flag indicates whether tasks in the fork and exit paths should 115/* This flag indicates whether tasks in the fork and exit paths should
116 * take callback_mutex and check for fork/exit handlers to call. This 116 * check for fork/exit handlers to call. This avoids us having to do
117 * avoids us having to do extra work in the fork/exit path if none of the 117 * extra work in the fork/exit path if none of the subsystems need to
118 * subsystems need to be called. 118 * be called.
119 */ 119 */
120static int need_forkexit_callback; 120static int need_forkexit_callback;
121 121
@@ -307,7 +307,6 @@ static inline void put_css_set_taskexit(struct css_set *cg)
307 * template: location in which to build the desired set of subsystem 307 * template: location in which to build the desired set of subsystem
308 * state objects for the new cgroup group 308 * state objects for the new cgroup group
309 */ 309 */
310
311static struct css_set *find_existing_css_set( 310static struct css_set *find_existing_css_set(
312 struct css_set *oldcg, 311 struct css_set *oldcg,
313 struct cgroup *cgrp, 312 struct cgroup *cgrp,
@@ -354,7 +353,6 @@ static struct css_set *find_existing_css_set(
354 * and chains them on tmp through their cgrp_link_list fields. Returns 0 on 353 * and chains them on tmp through their cgrp_link_list fields. Returns 0 on
355 * success or a negative error 354 * success or a negative error
356 */ 355 */
357
358static int allocate_cg_links(int count, struct list_head *tmp) 356static int allocate_cg_links(int count, struct list_head *tmp)
359{ 357{
360 struct cg_cgroup_link *link; 358 struct cg_cgroup_link *link;
@@ -396,7 +394,6 @@ static void free_cg_links(struct list_head *tmp)
396 * substituted into the appropriate hierarchy. Must be called with 394 * substituted into the appropriate hierarchy. Must be called with
397 * cgroup_mutex held 395 * cgroup_mutex held
398 */ 396 */
399
400static struct css_set *find_css_set( 397static struct css_set *find_css_set(
401 struct css_set *oldcg, struct cgroup *cgrp) 398 struct css_set *oldcg, struct cgroup *cgrp)
402{ 399{
@@ -507,8 +504,8 @@ static struct css_set *find_css_set(
507 * critical pieces of code here. The exception occurs on cgroup_exit(), 504 * critical pieces of code here. The exception occurs on cgroup_exit(),
508 * when a task in a notify_on_release cgroup exits. Then cgroup_mutex 505 * when a task in a notify_on_release cgroup exits. Then cgroup_mutex
509 * is taken, and if the cgroup count is zero, a usermode call made 506 * is taken, and if the cgroup count is zero, a usermode call made
510 * to /sbin/cgroup_release_agent with the name of the cgroup (path 507 * to the release agent with the name of the cgroup (path relative to
511 * relative to the root of cgroup file system) as the argument. 508 * the root of cgroup file system) as the argument.
512 * 509 *
513 * A cgroup can only be deleted if both its 'count' of using tasks 510 * A cgroup can only be deleted if both its 'count' of using tasks
514 * is zero, and its list of 'children' cgroups is empty. Since all 511 * is zero, and its list of 'children' cgroups is empty. Since all
@@ -521,7 +518,7 @@ static struct css_set *find_css_set(
521 * 518 *
522 * The need for this exception arises from the action of 519 * The need for this exception arises from the action of
523 * cgroup_attach_task(), which overwrites one tasks cgroup pointer with 520 * cgroup_attach_task(), which overwrites one tasks cgroup pointer with
524 * another. It does so using cgroup_mutexe, however there are 521 * another. It does so using cgroup_mutex, however there are
525 * several performance critical places that need to reference 522 * several performance critical places that need to reference
526 * task->cgroup without the expense of grabbing a system global 523 * task->cgroup without the expense of grabbing a system global
527 * mutex. Therefore except as noted below, when dereferencing or, as 524 * mutex. Therefore except as noted below, when dereferencing or, as
@@ -537,7 +534,6 @@ static struct css_set *find_css_set(
537 * cgroup_lock - lock out any changes to cgroup structures 534 * cgroup_lock - lock out any changes to cgroup structures
538 * 535 *
539 */ 536 */
540
541void cgroup_lock(void) 537void cgroup_lock(void)
542{ 538{
543 mutex_lock(&cgroup_mutex); 539 mutex_lock(&cgroup_mutex);
@@ -548,7 +544,6 @@ void cgroup_lock(void)
548 * 544 *
549 * Undo the lock taken in a previous cgroup_lock() call. 545 * Undo the lock taken in a previous cgroup_lock() call.
550 */ 546 */
551
552void cgroup_unlock(void) 547void cgroup_unlock(void)
553{ 548{
554 mutex_unlock(&cgroup_mutex); 549 mutex_unlock(&cgroup_mutex);
@@ -590,7 +585,6 @@ static struct inode *cgroup_new_inode(mode_t mode, struct super_block *sb)
590 * Call subsys's pre_destroy handler. 585 * Call subsys's pre_destroy handler.
591 * This is called before css refcnt check. 586 * This is called before css refcnt check.
592 */ 587 */
593
594static void cgroup_call_pre_destroy(struct cgroup *cgrp) 588static void cgroup_call_pre_destroy(struct cgroup *cgrp)
595{ 589{
596 struct cgroup_subsys *ss; 590 struct cgroup_subsys *ss;
@@ -600,7 +594,6 @@ static void cgroup_call_pre_destroy(struct cgroup *cgrp)
600 return; 594 return;
601} 595}
602 596
603
604static void cgroup_diput(struct dentry *dentry, struct inode *inode) 597static void cgroup_diput(struct dentry *dentry, struct inode *inode)
605{ 598{
606 /* is dentry a directory ? if so, kfree() associated cgroup */ 599 /* is dentry a directory ? if so, kfree() associated cgroup */
@@ -1129,8 +1122,13 @@ static inline struct cftype *__d_cft(struct dentry *dentry)
1129 return dentry->d_fsdata; 1122 return dentry->d_fsdata;
1130} 1123}
1131 1124
1132/* 1125/**
1133 * Called with cgroup_mutex held. Writes path of cgroup into buf. 1126 * cgroup_path - generate the path of a cgroup
1127 * @cgrp: the cgroup in question
1128 * @buf: the buffer to write the path into
1129 * @buflen: the length of the buffer
1130 *
1131 * Called with cgroup_mutex held. Writes path of cgroup into buf.
1134 * Returns 0 on success, -errno on error. 1132 * Returns 0 on success, -errno on error.
1135 */ 1133 */
1136int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen) 1134int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen)
@@ -1188,11 +1186,13 @@ static void get_first_subsys(const struct cgroup *cgrp,
1188 *subsys_id = test_ss->subsys_id; 1186 *subsys_id = test_ss->subsys_id;
1189} 1187}
1190 1188
1191/* 1189/**
1192 * Attach task 'tsk' to cgroup 'cgrp' 1190 * cgroup_attach_task - attach task 'tsk' to cgroup 'cgrp'
1191 * @cgrp: the cgroup the task is attaching to
1192 * @tsk: the task to be attached
1193 * 1193 *
1194 * Call holding cgroup_mutex. May take task_lock of 1194 * Call holding cgroup_mutex. May take task_lock of
1195 * the task 'pid' during call. 1195 * the task 'tsk' during call.
1196 */ 1196 */
1197int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk) 1197int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
1198{ 1198{
@@ -1293,7 +1293,6 @@ static int attach_task_by_pid(struct cgroup *cgrp, char *pidbuf)
1293} 1293}
1294 1294
1295/* The various types of files and directories in a cgroup file system */ 1295/* The various types of files and directories in a cgroup file system */
1296
1297enum cgroup_filetype { 1296enum cgroup_filetype {
1298 FILE_ROOT, 1297 FILE_ROOT,
1299 FILE_DIR, 1298 FILE_DIR,
@@ -1584,12 +1583,11 @@ static int cgroup_create_file(struct dentry *dentry, int mode,
1584} 1583}
1585 1584
1586/* 1585/*
1587 * cgroup_create_dir - create a directory for an object. 1586 * cgroup_create_dir - create a directory for an object.
1588 * cgrp: the cgroup we create the directory for. 1587 * @cgrp: the cgroup we create the directory for. It must have a valid
1589 * It must have a valid ->parent field 1588 * ->parent field. And we are going to fill its ->dentry field.
1590 * And we are going to fill its ->dentry field. 1589 * @dentry: dentry of the new cgroup
1591 * dentry: dentry of the new cgroup 1590 * @mode: mode to set on new directory.
1592 * mode: mode to set on new directory.
1593 */ 1591 */
1594static int cgroup_create_dir(struct cgroup *cgrp, struct dentry *dentry, 1592static int cgroup_create_dir(struct cgroup *cgrp, struct dentry *dentry,
1595 int mode) 1593 int mode)
@@ -1651,8 +1649,12 @@ int cgroup_add_files(struct cgroup *cgrp,
1651 return 0; 1649 return 0;
1652} 1650}
1653 1651
1654/* Count the number of tasks in a cgroup. */ 1652/**
1655 1653 * cgroup_task_count - count the number of tasks in a cgroup.
1654 * @cgrp: the cgroup in question
1655 *
1656 * Return the number of tasks in the cgroup.
1657 */
1656int cgroup_task_count(const struct cgroup *cgrp) 1658int cgroup_task_count(const struct cgroup *cgrp)
1657{ 1659{
1658 int count = 0; 1660 int count = 0;
@@ -1962,12 +1964,13 @@ static int pid_array_load(pid_t *pidarray, int npids, struct cgroup *cgrp)
1962} 1964}
1963 1965
1964/** 1966/**
1965 * Build and fill cgroupstats so that taskstats can export it to user 1967 * cgroupstats_build - build and fill cgroupstats
1966 * space.
1967 *
1968 * @stats: cgroupstats to fill information into 1968 * @stats: cgroupstats to fill information into
1969 * @dentry: A dentry entry belonging to the cgroup for which stats have 1969 * @dentry: A dentry entry belonging to the cgroup for which stats have
1970 * been requested. 1970 * been requested.
1971 *
1972 * Build and fill cgroupstats so that taskstats can export it to user
1973 * space.
1971 */ 1974 */
1972int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) 1975int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
1973{ 1976{
@@ -2199,14 +2202,13 @@ static void init_cgroup_css(struct cgroup_subsys_state *css,
2199} 2202}
2200 2203
2201/* 2204/*
2202 * cgroup_create - create a cgroup 2205 * cgroup_create - create a cgroup
2203 * parent: cgroup that will be parent of the new cgroup. 2206 * @parent: cgroup that will be parent of the new cgroup
2204 * name: name of the new cgroup. Will be strcpy'ed. 2207 * @dentry: dentry of the new cgroup
2205 * mode: mode to set on new inode 2208 * @mode: mode to set on new inode
2206 * 2209 *
2207 * Must be called with the mutex on the parent inode held 2210 * Must be called with the mutex on the parent inode held
2208 */ 2211 */
2209
2210static long cgroup_create(struct cgroup *parent, struct dentry *dentry, 2212static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
2211 int mode) 2213 int mode)
2212{ 2214{
@@ -2349,13 +2351,12 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
2349 parent = cgrp->parent; 2351 parent = cgrp->parent;
2350 root = cgrp->root; 2352 root = cgrp->root;
2351 sb = root->sb; 2353 sb = root->sb;
2354
2352 /* 2355 /*
2353 * Call pre_destroy handlers of subsys 2356 * Call pre_destroy handlers of subsys. Notify subsystems
2357 * that rmdir() request comes.
2354 */ 2358 */
2355 cgroup_call_pre_destroy(cgrp); 2359 cgroup_call_pre_destroy(cgrp);
2356 /*
2357 * Notify subsyses that rmdir() request comes.
2358 */
2359 2360
2360 if (cgroup_has_css_refs(cgrp)) { 2361 if (cgroup_has_css_refs(cgrp)) {
2361 mutex_unlock(&cgroup_mutex); 2362 mutex_unlock(&cgroup_mutex);
@@ -2431,8 +2432,10 @@ static void cgroup_init_subsys(struct cgroup_subsys *ss)
2431} 2432}
2432 2433
2433/** 2434/**
2434 * cgroup_init_early - initialize cgroups at system boot, and 2435 * cgroup_init_early - cgroup initialization at system boot
2435 * initialize any subsystems that request early init. 2436 *
2437 * Initialize cgroups at system boot, and initialize any
2438 * subsystems that request early init.
2436 */ 2439 */
2437int __init cgroup_init_early(void) 2440int __init cgroup_init_early(void)
2438{ 2441{
@@ -2474,8 +2477,10 @@ int __init cgroup_init_early(void)
2474} 2477}
2475 2478
2476/** 2479/**
2477 * cgroup_init - register cgroup filesystem and /proc file, and 2480 * cgroup_init - cgroup initialization
2478 * initialize any subsystems that didn't request early init. 2481 *
2482 * Register cgroup filesystem and /proc file, and initialize
2483 * any subsystems that didn't request early init.
2479 */ 2484 */
2480int __init cgroup_init(void) 2485int __init cgroup_init(void)
2481{ 2486{
@@ -2618,7 +2623,7 @@ static struct file_operations proc_cgroupstats_operations = {
2618 2623
2619/** 2624/**
2620 * cgroup_fork - attach newly forked task to its parents cgroup. 2625 * cgroup_fork - attach newly forked task to its parents cgroup.
2621 * @tsk: pointer to task_struct of forking parent process. 2626 * @child: pointer to task_struct of forking parent process.
2622 * 2627 *
2623 * Description: A task inherits its parent's cgroup at fork(). 2628 * Description: A task inherits its parent's cgroup at fork().
2624 * 2629 *
@@ -2642,9 +2647,12 @@ void cgroup_fork(struct task_struct *child)
2642} 2647}
2643 2648
2644/** 2649/**
2645 * cgroup_fork_callbacks - called on a new task very soon before 2650 * cgroup_fork_callbacks - run fork callbacks
2646 * adding it to the tasklist. No need to take any locks since no-one 2651 * @child: the new task
2647 * can be operating on this task 2652 *
2653 * Called on a new task very soon before adding it to the
2654 * tasklist. No need to take any locks since no-one can
2655 * be operating on this task.
2648 */ 2656 */
2649void cgroup_fork_callbacks(struct task_struct *child) 2657void cgroup_fork_callbacks(struct task_struct *child)
2650{ 2658{
@@ -2659,11 +2667,14 @@ void cgroup_fork_callbacks(struct task_struct *child)
2659} 2667}
2660 2668
2661/** 2669/**
2662 * cgroup_post_fork - called on a new task after adding it to the 2670 * cgroup_post_fork - called on a new task after adding it to the task list
2663 * task list. Adds the task to the list running through its css_set 2671 * @child: the task in question
2664 * if necessary. Has to be after the task is visible on the task list 2672 *
2665 * in case we race with the first call to cgroup_iter_start() - to 2673 * Adds the task to the list running through its css_set if necessary.
2666 * guarantee that the new task ends up on its list. */ 2674 * Has to be after the task is visible on the task list in case we race
2675 * with the first call to cgroup_iter_start() - to guarantee that the
2676 * new task ends up on its list.
2677 */
2667void cgroup_post_fork(struct task_struct *child) 2678void cgroup_post_fork(struct task_struct *child)
2668{ 2679{
2669 if (use_task_css_set_links) { 2680 if (use_task_css_set_links) {
@@ -2676,6 +2687,7 @@ void cgroup_post_fork(struct task_struct *child)
2676/** 2687/**
2677 * cgroup_exit - detach cgroup from exiting task 2688 * cgroup_exit - detach cgroup from exiting task
2678 * @tsk: pointer to task_struct of exiting process 2689 * @tsk: pointer to task_struct of exiting process
2690 * @run_callback: run exit callbacks?
2679 * 2691 *
2680 * Description: Detach cgroup from @tsk and release it. 2692 * Description: Detach cgroup from @tsk and release it.
2681 * 2693 *
@@ -2706,7 +2718,6 @@ void cgroup_post_fork(struct task_struct *child)
2706 * top_cgroup isn't going away, and either task has PF_EXITING set, 2718 * top_cgroup isn't going away, and either task has PF_EXITING set,
2707 * which wards off any cgroup_attach_task() attempts, or task is a failed 2719 * which wards off any cgroup_attach_task() attempts, or task is a failed
2708 * fork, never visible to cgroup_attach_task. 2720 * fork, never visible to cgroup_attach_task.
2709 *
2710 */ 2721 */
2711void cgroup_exit(struct task_struct *tsk, int run_callbacks) 2722void cgroup_exit(struct task_struct *tsk, int run_callbacks)
2712{ 2723{
@@ -2743,9 +2754,13 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks)
2743} 2754}
2744 2755
2745/** 2756/**
2746 * cgroup_clone - duplicate the current cgroup in the hierarchy 2757 * cgroup_clone - clone the cgroup the given subsystem is attached to
2747 * that the given subsystem is attached to, and move this task into 2758 * @tsk: the task to be moved
2748 * the new child 2759 * @subsys: the given subsystem
2760 *
2761 * Duplicate the current cgroup in the hierarchy that the given
2762 * subsystem is attached to, and move this task into the new
2763 * child.
2749 */ 2764 */
2750int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys) 2765int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys)
2751{ 2766{
@@ -2858,9 +2873,12 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys)
2858 return ret; 2873 return ret;
2859} 2874}
2860 2875
2861/* 2876/**
2862 * See if "cgrp" is a descendant of the current task's cgroup in 2877 * cgroup_is_descendant - see if @cgrp is a descendant of current task's cgrp
2863 * the appropriate hierarchy 2878 * @cgrp: the cgroup in question
2879 *
2880 * See if @cgrp is a descendant of the current task's cgroup in
2881 * the appropriate hierarchy.
2864 * 2882 *
2865 * If we are sending in dummytop, then presumably we are creating 2883 * If we are sending in dummytop, then presumably we are creating
2866 * the top cgroup in the subsystem. 2884 * the top cgroup in the subsystem.
@@ -2939,9 +2957,7 @@ void __css_put(struct cgroup_subsys_state *css)
2939 * release agent task. We don't bother to wait because the caller of 2957 * release agent task. We don't bother to wait because the caller of
2940 * this routine has no use for the exit status of the release agent 2958 * this routine has no use for the exit status of the release agent
2941 * task, so no sense holding our caller up for that. 2959 * task, so no sense holding our caller up for that.
2942 *
2943 */ 2960 */
2944
2945static void cgroup_release_agent(struct work_struct *work) 2961static void cgroup_release_agent(struct work_struct *work)
2946{ 2962{
2947 BUG_ON(work != &release_agent_work); 2963 BUG_ON(work != &release_agent_work);