linux/include/linux/cgroup.h
<<
>>
Prefs
   1#ifndef _LINUX_CGROUP_H
   2#define _LINUX_CGROUP_H
   3/*
   4 *  cgroup interface
   5 *
   6 *  Copyright (C) 2003 BULL SA
   7 *  Copyright (C) 2004-2006 Silicon Graphics, Inc.
   8 *
   9 */
  10
  11#include <linux/sched.h>
  12#include <linux/cpumask.h>
  13#include <linux/nodemask.h>
  14#include <linux/rcupdate.h>
  15#include <linux/cgroupstats.h>
  16#include <linux/prio_heap.h>
  17#include <linux/rwsem.h>
  18#include <linux/idr.h>
  19
  20#ifdef CONFIG_CGROUPS
  21
  22struct cgroupfs_root;
  23struct cgroup_subsys;
  24struct inode;
  25struct cgroup;
  26struct css_id;
  27
  28extern int cgroup_init_early(void);
  29extern int cgroup_init(void);
  30extern void cgroup_lock(void);
  31extern bool cgroup_lock_live_group(struct cgroup *cgrp);
  32extern void cgroup_unlock(void);
  33extern void cgroup_fork(struct task_struct *p);
  34extern void cgroup_fork_callbacks(struct task_struct *p);
  35extern void cgroup_post_fork(struct task_struct *p);
  36extern void cgroup_exit(struct task_struct *p, int run_callbacks);
  37extern int cgroupstats_build(struct cgroupstats *stats,
  38                                struct dentry *dentry);
  39
  40extern struct file_operations proc_cgroup_operations;
  41
  42/* Define the enumeration of all cgroup subsystems */
  43#define SUBSYS(_x) _x ## _subsys_id,
  44enum cgroup_subsys_id {
  45#include <linux/cgroup_subsys.h>
  46        CGROUP_SUBSYS_COUNT
  47};
  48#undef SUBSYS
  49
  50/* Per-subsystem/per-cgroup state maintained by the system. */
  51struct cgroup_subsys_state {
  52        /*
  53         * The cgroup that this subsystem is attached to. Useful
  54         * for subsystems that want to know about the cgroup
  55         * hierarchy structure
  56         */
  57        struct cgroup *cgroup;
  58
  59        /*
  60         * State maintained by the cgroup system to allow subsystems
  61         * to be "busy". Should be accessed via css_get(),
  62         * css_tryget() and and css_put().
  63         */
  64
  65        atomic_t refcnt;
  66
  67        unsigned long flags;
  68        /* ID for this css, if possible */
  69        struct css_id *id;
  70};
  71
  72/* bits in struct cgroup_subsys_state flags field */
  73enum {
  74        CSS_ROOT, /* This CSS is the root of the subsystem */
  75        CSS_REMOVED, /* This CSS is dead */
  76};
  77
  78/*
  79 * Call css_get() to hold a reference on the css; it can be used
  80 * for a reference obtained via:
  81 * - an existing ref-counted reference to the css
  82 * - task->cgroups for a locked task
  83 */
  84
  85static inline void css_get(struct cgroup_subsys_state *css)
  86{
  87        /* We don't need to reference count the root state */
  88        if (!test_bit(CSS_ROOT, &css->flags))
  89                atomic_inc(&css->refcnt);
  90}
  91
  92static inline bool css_is_removed(struct cgroup_subsys_state *css)
  93{
  94        return test_bit(CSS_REMOVED, &css->flags);
  95}
  96
  97/*
  98 * Call css_tryget() to take a reference on a css if your existing
  99 * (known-valid) reference isn't already ref-counted. Returns false if
 100 * the css has been destroyed.
 101 */
 102
 103static inline bool css_tryget(struct cgroup_subsys_state *css)
 104{
 105        if (test_bit(CSS_ROOT, &css->flags))
 106                return true;
 107        while (!atomic_inc_not_zero(&css->refcnt)) {
 108                if (test_bit(CSS_REMOVED, &css->flags))
 109                        return false;
 110                cpu_relax();
 111        }
 112        return true;
 113}
 114
 115/*
 116 * css_put() should be called to release a reference taken by
 117 * css_get() or css_tryget()
 118 */
 119
 120extern void __css_put(struct cgroup_subsys_state *css);
 121static inline void css_put(struct cgroup_subsys_state *css)
 122{
 123        if (!test_bit(CSS_ROOT, &css->flags))
 124                __css_put(css);
 125}
 126
 127/* bits in struct cgroup flags field */
 128enum {
 129        /* Control Group is dead */
 130        CGRP_REMOVED,
 131        /*
 132         * Control Group has previously had a child cgroup or a task,
 133         * but no longer (only if CGRP_NOTIFY_ON_RELEASE is set)
 134         */
 135        CGRP_RELEASABLE,
 136        /* Control Group requires release notifications to userspace */
 137        CGRP_NOTIFY_ON_RELEASE,
 138        /*
 139         * A thread in rmdir() is wating for this cgroup.
 140         */
 141        CGRP_WAIT_ON_RMDIR,
 142};
 143
 144struct cgroup {
 145        unsigned long flags;            /* "unsigned long" so bitops work */
 146
 147        /*
 148         * count users of this cgroup. >0 means busy, but doesn't
 149         * necessarily indicate the number of tasks in the cgroup
 150         */
 151        atomic_t count;
 152
 153        /*
 154         * We link our 'sibling' struct into our parent's 'children'.
 155         * Our children link their 'sibling' into our 'children'.
 156         */
 157        struct list_head sibling;       /* my parent's children */
 158        struct list_head children;      /* my children */
 159
 160        struct cgroup *parent;          /* my parent */
 161        struct dentry *dentry;          /* cgroup fs entry, RCU protected */
 162
 163        /* Private pointers for each registered subsystem */
 164        struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
 165
 166        struct cgroupfs_root *root;
 167        struct cgroup *top_cgroup;
 168
 169        /*
 170         * List of cg_cgroup_links pointing at css_sets with
 171         * tasks in this cgroup. Protected by css_set_lock
 172         */
 173        struct list_head css_sets;
 174
 175        /*
 176         * Linked list running through all cgroups that can
 177         * potentially be reaped by the release agent. Protected by
 178         * release_list_lock
 179         */
 180        struct list_head release_list;
 181
 182        /* pids_mutex protects the fields below */
 183        struct rw_semaphore pids_mutex;
 184        /* Array of process ids in the cgroup */
 185        pid_t *tasks_pids;
 186        /* How many files are using the current tasks_pids array */
 187        int pids_use_count;
 188        /* Length of the current tasks_pids array */
 189        int pids_length;
 190
 191        /* For RCU-protected deletion */
 192        struct rcu_head rcu_head;
 193};
 194
 195/*
 196 * A css_set is a structure holding pointers to a set of
 197 * cgroup_subsys_state objects. This saves space in the task struct
 198 * object and speeds up fork()/exit(), since a single inc/dec and a
 199 * list_add()/del() can bump the reference count on the entire cgroup
 200 * set for a task.
 201 */
 202
 203struct css_set {
 204
 205        /* Reference count */
 206        atomic_t refcount;
 207
 208        /*
 209         * List running through all cgroup groups in the same hash
 210         * slot. Protected by css_set_lock
 211         */
 212        struct hlist_node hlist;
 213
 214        /*
 215         * List running through all tasks using this cgroup
 216         * group. Protected by css_set_lock
 217         */
 218        struct list_head tasks;
 219
 220        /*
 221         * List of cg_cgroup_link objects on link chains from
 222         * cgroups referenced from this css_set. Protected by
 223         * css_set_lock
 224         */
 225        struct list_head cg_links;
 226
 227        /*
 228         * Set of subsystem states, one for each subsystem. This array
 229         * is immutable after creation apart from the init_css_set
 230         * during subsystem registration (at boot time).
 231         */
 232        struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
 233};
 234
 235/*
 236 * cgroup_map_cb is an abstract callback API for reporting map-valued
 237 * control files
 238 */
 239
 240struct cgroup_map_cb {
 241        int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
 242        void *state;
 243};
 244
 245/*
 246 * struct cftype: handler definitions for cgroup control files
 247 *
 248 * When reading/writing to a file:
 249 *      - the cgroup to use is file->f_dentry->d_parent->d_fsdata
 250 *      - the 'cftype' of the file is file->f_dentry->d_fsdata
 251 */
 252
 253#define MAX_CFTYPE_NAME 64
 254struct cftype {
 255        /*
 256         * By convention, the name should begin with the name of the
 257         * subsystem, followed by a period
 258         */
 259        char name[MAX_CFTYPE_NAME];
 260        int private;
 261        /*
 262         * If not 0, file mode is set to this value, otherwise it will
 263         * be figured out automatically
 264         */
 265        mode_t mode;
 266
 267        /*
 268         * If non-zero, defines the maximum length of string that can
 269         * be passed to write_string; defaults to 64
 270         */
 271        size_t max_write_len;
 272
 273        int (*open)(struct inode *inode, struct file *file);
 274        ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
 275                        struct file *file,
 276                        char __user *buf, size_t nbytes, loff_t *ppos);
 277        /*
 278         * read_u64() is a shortcut for the common case of returning a
 279         * single integer. Use it in place of read()
 280         */
 281        u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
 282        /*
 283         * read_s64() is a signed version of read_u64()
 284         */
 285        s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
 286        /*
 287         * read_map() is used for defining a map of key/value
 288         * pairs. It should call cb->fill(cb, key, value) for each
 289         * entry. The key/value pairs (and their ordering) should not
 290         * change between reboots.
 291         */
 292        int (*read_map)(struct cgroup *cont, struct cftype *cft,
 293                        struct cgroup_map_cb *cb);
 294        /*
 295         * read_seq_string() is used for outputting a simple sequence
 296         * using seqfile.
 297         */
 298        int (*read_seq_string)(struct cgroup *cont, struct cftype *cft,
 299                               struct seq_file *m);
 300
 301        ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
 302                         struct file *file,
 303                         const char __user *buf, size_t nbytes, loff_t *ppos);
 304
 305        /*
 306         * write_u64() is a shortcut for the common case of accepting
 307         * a single integer (as parsed by simple_strtoull) from
 308         * userspace. Use in place of write(); return 0 or error.
 309         */
 310        int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
 311        /*
 312         * write_s64() is a signed version of write_u64()
 313         */
 314        int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
 315
 316        /*
 317         * write_string() is passed a nul-terminated kernelspace
 318         * buffer of maximum length determined by max_write_len.
 319         * Returns 0 or -ve error code.
 320         */
 321        int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
 322                            const char *buffer);
 323        /*
 324         * trigger() callback can be used to get some kick from the
 325         * userspace, when the actual string written is not important
 326         * at all. The private field can be used to determine the
 327         * kick type for multiplexing.
 328         */
 329        int (*trigger)(struct cgroup *cgrp, unsigned int event);
 330
 331        int (*release)(struct inode *inode, struct file *file);
 332};
 333
 334struct cgroup_scanner {
 335        struct cgroup *cg;
 336        int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
 337        void (*process_task)(struct task_struct *p,
 338                        struct cgroup_scanner *scan);
 339        struct ptr_heap *heap;
 340        void *data;
 341};
 342
 343/*
 344 * Add a new file to the given cgroup directory. Should only be
 345 * called by subsystems from within a populate() method
 346 */
 347int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
 348                       const struct cftype *cft);
 349
 350/*
 351 * Add a set of new files to the given cgroup directory. Should
 352 * only be called by subsystems from within a populate() method
 353 */
 354int cgroup_add_files(struct cgroup *cgrp,
 355                        struct cgroup_subsys *subsys,
 356                        const struct cftype cft[],
 357                        int count);
 358
 359int cgroup_is_removed(const struct cgroup *cgrp);
 360
 361int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
 362
 363int cgroup_task_count(const struct cgroup *cgrp);
 364
 365/* Return true if cgrp is a descendant of the task's cgroup */
 366int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
 367
 368/*
 369 * Control Group subsystem type.
 370 * See Documentation/cgroups/cgroups.txt for details
 371 */
 372
 373struct cgroup_subsys {
 374        struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss,
 375                                                  struct cgroup *cgrp);
 376        int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 377        void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 378        int (*can_attach)(struct cgroup_subsys *ss,
 379                          struct cgroup *cgrp, struct task_struct *tsk);
 380        void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
 381                        struct cgroup *old_cgrp, struct task_struct *tsk);
 382        void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
 383        void (*exit)(struct cgroup_subsys *ss, struct task_struct *task);
 384        int (*populate)(struct cgroup_subsys *ss,
 385                        struct cgroup *cgrp);
 386        void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 387        void (*bind)(struct cgroup_subsys *ss, struct cgroup *root);
 388
 389        int subsys_id;
 390        int active;
 391        int disabled;
 392        int early_init;
 393        /*
 394         * True if this subsys uses ID. ID is not available before cgroup_init()
 395         * (not available in early_init time.)
 396         */
 397        bool use_id;
 398#define MAX_CGROUP_TYPE_NAMELEN 32
 399        const char *name;
 400
 401        /*
 402         * Protects sibling/children links of cgroups in this
 403         * hierarchy, plus protects which hierarchy (or none) the
 404         * subsystem is a part of (i.e. root/sibling).  To avoid
 405         * potential deadlocks, the following operations should not be
 406         * undertaken while holding any hierarchy_mutex:
 407         *
 408         * - allocating memory
 409         * - initiating hotplug events
 410         */
 411        struct mutex hierarchy_mutex;
 412        struct lock_class_key subsys_key;
 413
 414        /*
 415         * Link to parent, and list entry in parent's children.
 416         * Protected by this->hierarchy_mutex and cgroup_lock()
 417         */
 418        struct cgroupfs_root *root;
 419        struct list_head sibling;
 420        /* used when use_id == true */
 421        struct idr idr;
 422        spinlock_t id_lock;
 423};
 424
 425#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
 426#include <linux/cgroup_subsys.h>
 427#undef SUBSYS
 428
 429static inline struct cgroup_subsys_state *cgroup_subsys_state(
 430        struct cgroup *cgrp, int subsys_id)
 431{
 432        return cgrp->subsys[subsys_id];
 433}
 434
 435static inline struct cgroup_subsys_state *task_subsys_state(
 436        struct task_struct *task, int subsys_id)
 437{
 438        return rcu_dereference(task->cgroups->subsys[subsys_id]);
 439}
 440
 441static inline struct cgroup* task_cgroup(struct task_struct *task,
 442                                               int subsys_id)
 443{
 444        return task_subsys_state(task, subsys_id)->cgroup;
 445}
 446
 447int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss,
 448                                                        char *nodename);
 449
 450/* A cgroup_iter should be treated as an opaque object */
 451struct cgroup_iter {
 452        struct list_head *cg_link;
 453        struct list_head *task;
 454};
 455
 456/*
 457 * To iterate across the tasks in a cgroup:
 458 *
 459 * 1) call cgroup_iter_start to intialize an iterator
 460 *
 461 * 2) call cgroup_iter_next() to retrieve member tasks until it
 462 *    returns NULL or until you want to end the iteration
 463 *
 464 * 3) call cgroup_iter_end() to destroy the iterator.
 465 *
 466 * Or, call cgroup_scan_tasks() to iterate through every task in a
 467 * cgroup - cgroup_scan_tasks() holds the css_set_lock when calling
 468 * the test_task() callback, but not while calling the process_task()
 469 * callback.
 470 */
 471void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it);
 472struct task_struct *cgroup_iter_next(struct cgroup *cgrp,
 473                                        struct cgroup_iter *it);
 474void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
 475int cgroup_scan_tasks(struct cgroup_scanner *scan);
 476int cgroup_attach_task(struct cgroup *, struct task_struct *);
 477
 478/*
 479 * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works
 480 * if cgroup_subsys.use_id == true. It can be used for looking up and scanning.
 481 * CSS ID is assigned at cgroup allocation (create) automatically
 482 * and removed when subsys calls free_css_id() function. This is because
 483 * the lifetime of cgroup_subsys_state is subsys's matter.
 484 *
 485 * Looking up and scanning function should be called under rcu_read_lock().
 486 * Taking cgroup_mutex()/hierarchy_mutex() is not necessary for following calls.
 487 * But the css returned by this routine can be "not populated yet" or "being
 488 * destroyed". The caller should check css and cgroup's status.
 489 */
 490
 491/*
 492 * Typically Called at ->destroy(), or somewhere the subsys frees
 493 * cgroup_subsys_state.
 494 */
 495void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
 496
 497/* Find a cgroup_subsys_state which has given ID */
 498
 499struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
 500
 501/*
 502 * Get a cgroup whose id is greater than or equal to id under tree of root.
 503 * Returning a cgroup_subsys_state or NULL.
 504 */
 505struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
 506                struct cgroup_subsys_state *root, int *foundid);
 507
 508/* Returns true if root is ancestor of cg */
 509bool css_is_ancestor(struct cgroup_subsys_state *cg,
 510                     const struct cgroup_subsys_state *root);
 511
 512/* Get id and depth of css */
 513unsigned short css_id(struct cgroup_subsys_state *css);
 514unsigned short css_depth(struct cgroup_subsys_state *css);
 515
 516#else /* !CONFIG_CGROUPS */
 517
 518static inline int cgroup_init_early(void) { return 0; }
 519static inline int cgroup_init(void) { return 0; }
 520static inline void cgroup_fork(struct task_struct *p) {}
 521static inline void cgroup_fork_callbacks(struct task_struct *p) {}
 522static inline void cgroup_post_fork(struct task_struct *p) {}
 523static inline void cgroup_exit(struct task_struct *p, int callbacks) {}
 524
 525static inline void cgroup_lock(void) {}
 526static inline void cgroup_unlock(void) {}
 527static inline int cgroupstats_build(struct cgroupstats *stats,
 528                                        struct dentry *dentry)
 529{
 530        return -EINVAL;
 531}
 532
 533#endif /* !CONFIG_CGROUPS */
 534
 535#endif /* _LINUX_CGROUP_H */
 536
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.