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 pids_list and cached pid arrays. */
 183        struct rw_semaphore pids_mutex;
 184
 185        /* Linked list of struct cgroup_pids */
 186        struct list_head pids_list;
 187
 188        /* For RCU-protected deletion */
 189        struct rcu_head rcu_head;
 190};
 191
 192/*
 193 * A css_set is a structure holding pointers to a set of
 194 * cgroup_subsys_state objects. This saves space in the task struct
 195 * object and speeds up fork()/exit(), since a single inc/dec and a
 196 * list_add()/del() can bump the reference count on the entire cgroup
 197 * set for a task.
 198 */
 199
 200struct css_set {
 201
 202        /* Reference count */
 203        atomic_t refcount;
 204
 205        /*
 206         * List running through all cgroup groups in the same hash
 207         * slot. Protected by css_set_lock
 208         */
 209        struct hlist_node hlist;
 210
 211        /*
 212         * List running through all tasks using this cgroup
 213         * group. Protected by css_set_lock
 214         */
 215        struct list_head tasks;
 216
 217        /*
 218         * List of cg_cgroup_link objects on link chains from
 219         * cgroups referenced from this css_set. Protected by
 220         * css_set_lock
 221         */
 222        struct list_head cg_links;
 223
 224        /*
 225         * Set of subsystem states, one for each subsystem. This array
 226         * is immutable after creation apart from the init_css_set
 227         * during subsystem registration (at boot time).
 228         */
 229        struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
 230};
 231
 232/*
 233 * cgroup_map_cb is an abstract callback API for reporting map-valued
 234 * control files
 235 */
 236
 237struct cgroup_map_cb {
 238        int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
 239        void *state;
 240};
 241
 242/*
 243 * struct cftype: handler definitions for cgroup control files
 244 *
 245 * When reading/writing to a file:
 246 *      - the cgroup to use is file->f_dentry->d_parent->d_fsdata
 247 *      - the 'cftype' of the file is file->f_dentry->d_fsdata
 248 */
 249
 250#define MAX_CFTYPE_NAME 64
 251struct cftype {
 252        /*
 253         * By convention, the name should begin with the name of the
 254         * subsystem, followed by a period
 255         */
 256        char name[MAX_CFTYPE_NAME];
 257        int private;
 258        /*
 259         * If not 0, file mode is set to this value, otherwise it will
 260         * be figured out automatically
 261         */
 262        mode_t mode;
 263
 264        /*
 265         * If non-zero, defines the maximum length of string that can
 266         * be passed to write_string; defaults to 64
 267         */
 268        size_t max_write_len;
 269
 270        int (*open)(struct inode *inode, struct file *file);
 271        ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
 272                        struct file *file,
 273                        char __user *buf, size_t nbytes, loff_t *ppos);
 274        /*
 275         * read_u64() is a shortcut for the common case of returning a
 276         * single integer. Use it in place of read()
 277         */
 278        u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
 279        /*
 280         * read_s64() is a signed version of read_u64()
 281         */
 282        s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
 283        /*
 284         * read_map() is used for defining a map of key/value
 285         * pairs. It should call cb->fill(cb, key, value) for each
 286         * entry. The key/value pairs (and their ordering) should not
 287         * change between reboots.
 288         */
 289        int (*read_map)(struct cgroup *cont, struct cftype *cft,
 290                        struct cgroup_map_cb *cb);
 291        /*
 292         * read_seq_string() is used for outputting a simple sequence
 293         * using seqfile.
 294         */
 295        int (*read_seq_string)(struct cgroup *cont, struct cftype *cft,
 296                               struct seq_file *m);
 297
 298        ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
 299                         struct file *file,
 300                         const char __user *buf, size_t nbytes, loff_t *ppos);
 301
 302        /*
 303         * write_u64() is a shortcut for the common case of accepting
 304         * a single integer (as parsed by simple_strtoull) from
 305         * userspace. Use in place of write(); return 0 or error.
 306         */
 307        int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
 308        /*
 309         * write_s64() is a signed version of write_u64()
 310         */
 311        int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
 312
 313        /*
 314         * write_string() is passed a nul-terminated kernelspace
 315         * buffer of maximum length determined by max_write_len.
 316         * Returns 0 or -ve error code.
 317         */
 318        int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
 319                            const char *buffer);
 320        /*
 321         * trigger() callback can be used to get some kick from the
 322         * userspace, when the actual string written is not important
 323         * at all. The private field can be used to determine the
 324         * kick type for multiplexing.
 325         */
 326        int (*trigger)(struct cgroup *cgrp, unsigned int event);
 327
 328        int (*release)(struct inode *inode, struct file *file);
 329};
 330
 331struct cgroup_scanner {
 332        struct cgroup *cg;
 333        int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
 334        void (*process_task)(struct task_struct *p,
 335                        struct cgroup_scanner *scan);
 336        struct ptr_heap *heap;
 337        void *data;
 338};
 339
 340/*
 341 * Add a new file to the given cgroup directory. Should only be
 342 * called by subsystems from within a populate() method
 343 */
 344int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
 345                       const struct cftype *cft);
 346
 347/*
 348 * Add a set of new files to the given cgroup directory. Should
 349 * only be called by subsystems from within a populate() method
 350 */
 351int cgroup_add_files(struct cgroup *cgrp,
 352                        struct cgroup_subsys *subsys,
 353                        const struct cftype cft[],
 354                        int count);
 355
 356int cgroup_is_removed(const struct cgroup *cgrp);
 357
 358int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
 359
 360int cgroup_task_count(const struct cgroup *cgrp);
 361
 362/* Return true if cgrp is a descendant of the task's cgroup */
 363int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
 364
 365/*
 366 * When the subsys has to access css and may add permanent refcnt to css,
 367 * it should take care of racy conditions with rmdir(). Following set of
 368 * functions, is for stop/restart rmdir if necessary.
 369 * Because these will call css_get/put, "css" should be alive css.
 370 *
 371 *  cgroup_exclude_rmdir();
 372 *  ...do some jobs which may access arbitrary empty cgroup
 373 *  cgroup_release_and_wakeup_rmdir();
 374 *
 375 *  When someone removes a cgroup while cgroup_exclude_rmdir() holds it,
 376 *  it sleeps and cgroup_release_and_wakeup_rmdir() will wake him up.
 377 */
 378
 379void cgroup_exclude_rmdir(struct cgroup_subsys_state *css);
 380void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css);
 381
 382/*
 383 * Control Group subsystem type.
 384 * See Documentation/cgroups/cgroups.txt for details
 385 */
 386
 387struct cgroup_subsys {
 388        struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss,
 389                                                  struct cgroup *cgrp);
 390        int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 391        void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 392        int (*can_attach)(struct cgroup_subsys *ss,
 393                          struct cgroup *cgrp, struct task_struct *tsk);
 394        void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
 395                        struct cgroup *old_cgrp, struct task_struct *tsk);
 396        void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
 397        void (*exit)(struct cgroup_subsys *ss, struct task_struct *task);
 398        int (*populate)(struct cgroup_subsys *ss,
 399                        struct cgroup *cgrp);
 400        void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
 401        void (*bind)(struct cgroup_subsys *ss, struct cgroup *root);
 402
 403        int subsys_id;
 404        int active;
 405        int disabled;
 406        int early_init;
 407        /*
 408         * True if this subsys uses ID. ID is not available before cgroup_init()
 409         * (not available in early_init time.)
 410         */
 411        bool use_id;
 412#define MAX_CGROUP_TYPE_NAMELEN 32
 413        const char *name;
 414
 415        /*
 416         * Protects sibling/children links of cgroups in this
 417         * hierarchy, plus protects which hierarchy (or none) the
 418         * subsystem is a part of (i.e. root/sibling).  To avoid
 419         * potential deadlocks, the following operations should not be
 420         * undertaken while holding any hierarchy_mutex:
 421         *
 422         * - allocating memory
 423         * - initiating hotplug events
 424         */
 425        struct mutex hierarchy_mutex;
 426        struct lock_class_key subsys_key;
 427
 428        /*
 429         * Link to parent, and list entry in parent's children.
 430         * Protected by this->hierarchy_mutex and cgroup_lock()
 431         */
 432        struct cgroupfs_root *root;
 433        struct list_head sibling;
 434        /* used when use_id == true */
 435        struct idr idr;
 436        spinlock_t id_lock;
 437};
 438
 439#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
 440#include <linux/cgroup_subsys.h>
 441#undef SUBSYS
 442
 443static inline struct cgroup_subsys_state *cgroup_subsys_state(
 444        struct cgroup *cgrp, int subsys_id)
 445{
 446        return cgrp->subsys[subsys_id];
 447}
 448
 449static inline struct cgroup_subsys_state *task_subsys_state(
 450        struct task_struct *task, int subsys_id)
 451{
 452        return rcu_dereference(task->cgroups->subsys[subsys_id]);
 453}
 454
 455static inline struct cgroup* task_cgroup(struct task_struct *task,
 456                                               int subsys_id)
 457{
 458        return task_subsys_state(task, subsys_id)->cgroup;
 459}
 460
 461int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss,
 462                                                        char *nodename);
 463
 464/* A cgroup_iter should be treated as an opaque object */
 465struct cgroup_iter {
 466        struct list_head *cg_link;
 467        struct list_head *task;
 468};
 469
 470/*
 471 * To iterate across the tasks in a cgroup:
 472 *
 473 * 1) call cgroup_iter_start to intialize an iterator
 474 *
 475 * 2) call cgroup_iter_next() to retrieve member tasks until it
 476 *    returns NULL or until you want to end the iteration
 477 *
 478 * 3) call cgroup_iter_end() to destroy the iterator.
 479 *
 480 * Or, call cgroup_scan_tasks() to iterate through every task in a
 481 * cgroup - cgroup_scan_tasks() holds the css_set_lock when calling
 482 * the test_task() callback, but not while calling the process_task()
 483 * callback.
 484 */
 485void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it);
 486struct task_struct *cgroup_iter_next(struct cgroup *cgrp,
 487                                        struct cgroup_iter *it);
 488void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
 489int cgroup_scan_tasks(struct cgroup_scanner *scan);
 490int cgroup_attach_task(struct cgroup *, struct task_struct *);
 491
 492/*
 493 * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works
 494 * if cgroup_subsys.use_id == true. It can be used for looking up and scanning.
 495 * CSS ID is assigned at cgroup allocation (create) automatically
 496 * and removed when subsys calls free_css_id() function. This is because
 497 * the lifetime of cgroup_subsys_state is subsys's matter.
 498 *
 499 * Looking up and scanning function should be called under rcu_read_lock().
 500 * Taking cgroup_mutex()/hierarchy_mutex() is not necessary for following calls.
 501 * But the css returned by this routine can be "not populated yet" or "being
 502 * destroyed". The caller should check css and cgroup's status.
 503 */
 504
 505/*
 506 * Typically Called at ->destroy(), or somewhere the subsys frees
 507 * cgroup_subsys_state.
 508 */
 509void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
 510
 511/* Find a cgroup_subsys_state which has given ID */
 512
 513struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
 514
 515/*
 516 * Get a cgroup whose id is greater than or equal to id under tree of root.
 517 * Returning a cgroup_subsys_state or NULL.
 518 */
 519struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
 520                struct cgroup_subsys_state *root, int *foundid);
 521
 522/* Returns true if root is ancestor of cg */
 523bool css_is_ancestor(struct cgroup_subsys_state *cg,
 524                     const struct cgroup_subsys_state *root);
 525
 526/* Get id and depth of css */
 527unsigned short css_id(struct cgroup_subsys_state *css);
 528unsigned short css_depth(struct cgroup_subsys_state *css);
 529
 530#else /* !CONFIG_CGROUPS */
 531
 532static inline int cgroup_init_early(void) { return 0; }
 533static inline int cgroup_init(void) { return 0; }
 534static inline void cgroup_fork(struct task_struct *p) {}
 535static inline void cgroup_fork_callbacks(struct task_struct *p) {}
 536static inline void cgroup_post_fork(struct task_struct *p) {}
 537static inline void cgroup_exit(struct task_struct *p, int callbacks) {}
 538
 539static inline void cgroup_lock(void) {}
 540static inline void cgroup_unlock(void) {}
 541static inline int cgroupstats_build(struct cgroupstats *stats,
 542                                        struct dentry *dentry)
 543{
 544        return -EINVAL;
 545}
 546
 547#endif /* !CONFIG_CGROUPS */
 548
 549#endif /* _LINUX_CGROUP_H */
 550
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.