Blame view

include/linux/cgroup.h 19.5 KB
ddbcc7e8e   Paul Menage   Task Control Grou...
1
2
3
4
5
6
7
8
9
10
11
  #ifndef _LINUX_CGROUP_H
  #define _LINUX_CGROUP_H
  /*
   *  cgroup interface
   *
   *  Copyright (C) 2003 BULL SA
   *  Copyright (C) 2004-2006 Silicon Graphics, Inc.
   *
   */
  
  #include <linux/sched.h>
ddbcc7e8e   Paul Menage   Task Control Grou...
12
13
14
  #include <linux/cpumask.h>
  #include <linux/nodemask.h>
  #include <linux/rcupdate.h>
846c7bb05   Balbir Singh   Add cgroupstats
15
  #include <linux/cgroupstats.h>
31a7df01f   Cliff Wickman   cgroups: mechanis...
16
  #include <linux/prio_heap.h>
cc31edcee   Paul Menage   cgroups: convert ...
17
  #include <linux/rwsem.h>
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
18
  #include <linux/idr.h>
ddbcc7e8e   Paul Menage   Task Control Grou...
19
20
21
22
23
24
  
  #ifdef CONFIG_CGROUPS
  
  struct cgroupfs_root;
  struct cgroup_subsys;
  struct inode;
84eea8428   Paul Menage   cgroups: misc cle...
25
  struct cgroup;
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
26
  struct css_id;
ddbcc7e8e   Paul Menage   Task Control Grou...
27
28
29
  
  extern int cgroup_init_early(void);
  extern int cgroup_init(void);
ddbcc7e8e   Paul Menage   Task Control Grou...
30
  extern void cgroup_lock(void);
d11c563dd   Paul E. McKenney   sched: Use lockde...
31
  extern int cgroup_lock_is_held(void);
84eea8428   Paul Menage   cgroups: misc cle...
32
  extern bool cgroup_lock_live_group(struct cgroup *cgrp);
ddbcc7e8e   Paul Menage   Task Control Grou...
33
  extern void cgroup_unlock(void);
b4f48b636   Paul Menage   Task Control Grou...
34
35
  extern void cgroup_fork(struct task_struct *p);
  extern void cgroup_fork_callbacks(struct task_struct *p);
817929ec2   Paul Menage   Task Control Grou...
36
  extern void cgroup_post_fork(struct task_struct *p);
b4f48b636   Paul Menage   Task Control Grou...
37
  extern void cgroup_exit(struct task_struct *p, int run_callbacks);
846c7bb05   Balbir Singh   Add cgroupstats
38
39
  extern int cgroupstats_build(struct cgroupstats *stats,
  				struct dentry *dentry);
e6a1105ba   Ben Blum   cgroups: subsyste...
40
  extern int cgroup_load_subsys(struct cgroup_subsys *ss);
cf5d5941f   Ben Blum   cgroups: subsyste...
41
  extern void cgroup_unload_subsys(struct cgroup_subsys *ss);
ddbcc7e8e   Paul Menage   Task Control Grou...
42

828c09509   Alexey Dobriyan   const: constify r...
43
  extern const struct file_operations proc_cgroup_operations;
a424316ca   Paul Menage   Task Control Grou...
44

aae8aab40   Ben Blum   cgroups: revamp s...
45
  /* Define the enumeration of all builtin cgroup subsystems */
817929ec2   Paul Menage   Task Control Grou...
46
47
48
  #define SUBSYS(_x) _x ## _subsys_id,
  enum cgroup_subsys_id {
  #include <linux/cgroup_subsys.h>
aae8aab40   Ben Blum   cgroups: revamp s...
49
  	CGROUP_BUILTIN_SUBSYS_COUNT
817929ec2   Paul Menage   Task Control Grou...
50
51
  };
  #undef SUBSYS
aae8aab40   Ben Blum   cgroups: revamp s...
52
53
54
55
56
57
  /*
   * This define indicates the maximum number of subsystems that can be loaded
   * at once. We limit to this many since cgroupfs_root has subsys_bits to keep
   * track of all of them.
   */
  #define CGROUP_SUBSYS_COUNT (BITS_PER_BYTE*sizeof(unsigned long))
817929ec2   Paul Menage   Task Control Grou...
58

ddbcc7e8e   Paul Menage   Task Control Grou...
59
60
  /* Per-subsystem/per-cgroup state maintained by the system. */
  struct cgroup_subsys_state {
d20a390a0   Paul Menage   cgroups: fix cgro...
61
62
  	/*
  	 * The cgroup that this subsystem is attached to. Useful
ddbcc7e8e   Paul Menage   Task Control Grou...
63
  	 * for subsystems that want to know about the cgroup
d20a390a0   Paul Menage   cgroups: fix cgro...
64
65
  	 * hierarchy structure
  	 */
ddbcc7e8e   Paul Menage   Task Control Grou...
66
  	struct cgroup *cgroup;
d20a390a0   Paul Menage   cgroups: fix cgro...
67
68
  	/*
  	 * State maintained by the cgroup system to allow subsystems
e7c5ec919   Paul Menage   cgroups: add css_...
69
  	 * to be "busy". Should be accessed via css_get(),
d20a390a0   Paul Menage   cgroups: fix cgro...
70
71
  	 * css_tryget() and and css_put().
  	 */
ddbcc7e8e   Paul Menage   Task Control Grou...
72
73
74
75
  
  	atomic_t refcnt;
  
  	unsigned long flags;
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
76
  	/* ID for this css, if possible */
2c392b8c3   Arnd Bergmann   cgroups: __rcu an...
77
  	struct css_id __rcu *id;
ddbcc7e8e   Paul Menage   Task Control Grou...
78
79
80
81
82
  };
  
  /* bits in struct cgroup_subsys_state flags field */
  enum {
  	CSS_ROOT, /* This CSS is the root of the subsystem */
e7c5ec919   Paul Menage   cgroups: add css_...
83
  	CSS_REMOVED, /* This CSS is dead */
ddbcc7e8e   Paul Menage   Task Control Grou...
84
  };
d7b9fff71   Daisuke Nishimura   cgroup: introduce...
85
86
87
88
89
  /* Caller must verify that the css is not for root cgroup */
  static inline void __css_get(struct cgroup_subsys_state *css, int count)
  {
  	atomic_add(count, &css->refcnt);
  }
ddbcc7e8e   Paul Menage   Task Control Grou...
90
  /*
e7c5ec919   Paul Menage   cgroups: add css_...
91
92
93
94
   * Call css_get() to hold a reference on the css; it can be used
   * for a reference obtained via:
   * - an existing ref-counted reference to the css
   * - task->cgroups for a locked task
ddbcc7e8e   Paul Menage   Task Control Grou...
95
96
97
98
99
100
   */
  
  static inline void css_get(struct cgroup_subsys_state *css)
  {
  	/* We don't need to reference count the root state */
  	if (!test_bit(CSS_ROOT, &css->flags))
d7b9fff71   Daisuke Nishimura   cgroup: introduce...
101
  		__css_get(css, 1);
ddbcc7e8e   Paul Menage   Task Control Grou...
102
  }
e7c5ec919   Paul Menage   cgroups: add css_...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  
  static inline bool css_is_removed(struct cgroup_subsys_state *css)
  {
  	return test_bit(CSS_REMOVED, &css->flags);
  }
  
  /*
   * Call css_tryget() to take a reference on a css if your existing
   * (known-valid) reference isn't already ref-counted. Returns false if
   * the css has been destroyed.
   */
  
  static inline bool css_tryget(struct cgroup_subsys_state *css)
  {
  	if (test_bit(CSS_ROOT, &css->flags))
  		return true;
  	while (!atomic_inc_not_zero(&css->refcnt)) {
  		if (test_bit(CSS_REMOVED, &css->flags))
  			return false;
804b3c28a   Paul Menage   cgroups: add cpu_...
122
  		cpu_relax();
e7c5ec919   Paul Menage   cgroups: add css_...
123
124
125
  	}
  	return true;
  }
ddbcc7e8e   Paul Menage   Task Control Grou...
126
127
  /*
   * css_put() should be called to release a reference taken by
e7c5ec919   Paul Menage   cgroups: add css_...
128
   * css_get() or css_tryget()
ddbcc7e8e   Paul Menage   Task Control Grou...
129
   */
d7b9fff71   Daisuke Nishimura   cgroup: introduce...
130
  extern void __css_put(struct cgroup_subsys_state *css, int count);
ddbcc7e8e   Paul Menage   Task Control Grou...
131
132
133
  static inline void css_put(struct cgroup_subsys_state *css)
  {
  	if (!test_bit(CSS_ROOT, &css->flags))
d7b9fff71   Daisuke Nishimura   cgroup: introduce...
134
  		__css_put(css, 1);
ddbcc7e8e   Paul Menage   Task Control Grou...
135
  }
3116f0e3d   Paul Menage   CGroup API files:...
136
137
138
139
  /* bits in struct cgroup flags field */
  enum {
  	/* Control Group is dead */
  	CGRP_REMOVED,
d20a390a0   Paul Menage   cgroups: fix cgro...
140
141
142
143
  	/*
  	 * Control Group has previously had a child cgroup or a task,
  	 * but no longer (only if CGRP_NOTIFY_ON_RELEASE is set)
  	 */
3116f0e3d   Paul Menage   CGroup API files:...
144
145
146
  	CGRP_RELEASABLE,
  	/* Control Group requires release notifications to userspace */
  	CGRP_NOTIFY_ON_RELEASE,
ec64f5154   KAMEZAWA Hiroyuki   cgroup: fix frequ...
147
148
149
150
  	/*
  	 * A thread in rmdir() is wating for this cgroup.
  	 */
  	CGRP_WAIT_ON_RMDIR,
97978e6d1   Daniel Lezcano   cgroup: add clone...
151
152
153
154
  	/*
  	 * Clone cgroup values when creating a new child cgroup
  	 */
  	CGRP_CLONE_CHILDREN,
3116f0e3d   Paul Menage   CGroup API files:...
155
  };
72a8cb30d   Ben Blum   cgroups: ensure c...
156
157
158
159
160
161
162
163
164
165
166
167
  /* which pidlist file are we talking about? */
  enum cgroup_filetype {
  	CGROUP_FILE_PROCS,
  	CGROUP_FILE_TASKS,
  };
  
  /*
   * A pidlist is a list of pids that virtually represents the contents of one
   * of the cgroup files ("procs" or "tasks"). We keep a list of such pidlists,
   * a pair (one each for procs, tasks) for each pid namespace that's relevant
   * to the cgroup.
   */
102a775e3   Ben Blum   cgroups: add a re...
168
  struct cgroup_pidlist {
72a8cb30d   Ben Blum   cgroups: ensure c...
169
170
171
172
173
  	/*
  	 * used to find which pidlist is wanted. doesn't change as long as
  	 * this particular list stays in the list.
  	 */
  	struct { enum cgroup_filetype type; struct pid_namespace *ns; } key;
102a775e3   Ben Blum   cgroups: add a re...
174
175
176
177
178
179
  	/* array of xids */
  	pid_t *list;
  	/* how many elements the above list has */
  	int length;
  	/* how many files are using the current array */
  	int use_count;
72a8cb30d   Ben Blum   cgroups: ensure c...
180
181
182
183
184
185
  	/* each of these stored in a list by its cgroup */
  	struct list_head links;
  	/* pointer to the cgroup we belong to, for list removal purposes */
  	struct cgroup *owner;
  	/* protects the other fields */
  	struct rw_semaphore mutex;
102a775e3   Ben Blum   cgroups: add a re...
186
  };
ddbcc7e8e   Paul Menage   Task Control Grou...
187
188
  struct cgroup {
  	unsigned long flags;		/* "unsigned long" so bitops work */
d20a390a0   Paul Menage   cgroups: fix cgro...
189
190
191
192
  	/*
  	 * count users of this cgroup. >0 means busy, but doesn't
  	 * necessarily indicate the number of tasks in the cgroup
  	 */
ddbcc7e8e   Paul Menage   Task Control Grou...
193
194
195
196
197
198
199
200
  	atomic_t count;
  
  	/*
  	 * We link our 'sibling' struct into our parent's 'children'.
  	 * Our children link their 'sibling' into our 'children'.
  	 */
  	struct list_head sibling;	/* my parent's children */
  	struct list_head children;	/* my children */
d20a390a0   Paul Menage   cgroups: fix cgro...
201
  	struct cgroup *parent;		/* my parent */
2c392b8c3   Arnd Bergmann   cgroups: __rcu an...
202
  	struct dentry __rcu *dentry;	/* cgroup fs entry, RCU protected */
ddbcc7e8e   Paul Menage   Task Control Grou...
203
204
205
206
207
208
  
  	/* Private pointers for each registered subsystem */
  	struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
  
  	struct cgroupfs_root *root;
  	struct cgroup *top_cgroup;
817929ec2   Paul Menage   Task Control Grou...
209
210
211
212
213
214
  
  	/*
  	 * List of cg_cgroup_links pointing at css_sets with
  	 * tasks in this cgroup. Protected by css_set_lock
  	 */
  	struct list_head css_sets;
81a6a5cdd   Paul Menage   Task Control Grou...
215
216
217
218
219
220
221
  
  	/*
  	 * Linked list running through all cgroups that can
  	 * potentially be reaped by the release agent. Protected by
  	 * release_list_lock
  	 */
  	struct list_head release_list;
cc31edcee   Paul Menage   cgroups: convert ...
222

72a8cb30d   Ben Blum   cgroups: ensure c...
223
224
225
226
227
228
  	/*
  	 * list of pidlists, up to two for each namespace (one for procs, one
  	 * for tasks); created on demand.
  	 */
  	struct list_head pidlists;
  	struct mutex pidlist_mutex;
a47295e6b   Paul Menage   cgroups: make cgr...
229
230
231
  
  	/* For RCU-protected deletion */
  	struct rcu_head rcu_head;
0dea11687   Kirill A. Shutemov   cgroup: implement...
232

25985edce   Lucas De Marchi   Fix common misspe...
233
  	/* List of events which userspace want to receive */
0dea11687   Kirill A. Shutemov   cgroup: implement...
234
235
  	struct list_head event_list;
  	spinlock_t event_list_lock;
817929ec2   Paul Menage   Task Control Grou...
236
  };
d20a390a0   Paul Menage   cgroups: fix cgro...
237
238
  /*
   * A css_set is a structure holding pointers to a set of
817929ec2   Paul Menage   Task Control Grou...
239
240
   * cgroup_subsys_state objects. This saves space in the task struct
   * object and speeds up fork()/exit(), since a single inc/dec and a
d20a390a0   Paul Menage   cgroups: fix cgro...
241
242
   * list_add()/del() can bump the reference count on the entire cgroup
   * set for a task.
817929ec2   Paul Menage   Task Control Grou...
243
244
245
246
247
   */
  
  struct css_set {
  
  	/* Reference count */
146aa1bd0   Lai Jiangshan   cgroups: fix prob...
248
  	atomic_t refcount;
817929ec2   Paul Menage   Task Control Grou...
249
250
  
  	/*
472b1053f   Li Zefan   cgroups: use a ha...
251
252
253
254
255
256
  	 * List running through all cgroup groups in the same hash
  	 * slot. Protected by css_set_lock
  	 */
  	struct hlist_node hlist;
  
  	/*
817929ec2   Paul Menage   Task Control Grou...
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  	 * List running through all tasks using this cgroup
  	 * group. Protected by css_set_lock
  	 */
  	struct list_head tasks;
  
  	/*
  	 * List of cg_cgroup_link objects on link chains from
  	 * cgroups referenced from this css_set. Protected by
  	 * css_set_lock
  	 */
  	struct list_head cg_links;
  
  	/*
  	 * Set of subsystem states, one for each subsystem. This array
  	 * is immutable after creation apart from the init_css_set
cf5d5941f   Ben Blum   cgroups: subsyste...
272
273
  	 * during subsystem registration (at boot time) and modular subsystem
  	 * loading/unloading.
817929ec2   Paul Menage   Task Control Grou...
274
275
  	 */
  	struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
c378369d8   Ben Blum   cgroups: change c...
276
277
278
  
  	/* For RCU-protected deletion */
  	struct rcu_head rcu_head;
ddbcc7e8e   Paul Menage   Task Control Grou...
279
  };
917965696   Paul Menage   CGroup API files:...
280
281
282
283
284
285
286
287
288
  /*
   * cgroup_map_cb is an abstract callback API for reporting map-valued
   * control files
   */
  
  struct cgroup_map_cb {
  	int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
  	void *state;
  };
d20a390a0   Paul Menage   cgroups: fix cgro...
289
290
  /*
   * struct cftype: handler definitions for cgroup control files
ddbcc7e8e   Paul Menage   Task Control Grou...
291
292
   *
   * When reading/writing to a file:
a043e3b2c   Li Zefan   cgroup: fix comments
293
   *	- the cgroup to use is file->f_dentry->d_parent->d_fsdata
ddbcc7e8e   Paul Menage   Task Control Grou...
294
295
296
297
298
   *	- the 'cftype' of the file is file->f_dentry->d_fsdata
   */
  
  #define MAX_CFTYPE_NAME 64
  struct cftype {
d20a390a0   Paul Menage   cgroups: fix cgro...
299
300
301
302
  	/*
  	 * By convention, the name should begin with the name of the
  	 * subsystem, followed by a period
  	 */
ddbcc7e8e   Paul Menage   Task Control Grou...
303
304
  	char name[MAX_CFTYPE_NAME];
  	int private;
099fca322   Li Zefan   cgroups: show cor...
305
306
307
308
309
  	/*
  	 * If not 0, file mode is set to this value, otherwise it will
  	 * be figured out automatically
  	 */
  	mode_t mode;
db3b14978   Paul Menage   cgroup files: add...
310
311
312
313
314
315
  
  	/*
  	 * If non-zero, defines the maximum length of string that can
  	 * be passed to write_string; defaults to 64
  	 */
  	size_t max_write_len;
ce16b49d3   Paul Menage   cgroup files: cle...
316
317
318
319
  	int (*open)(struct inode *inode, struct file *file);
  	ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
  			struct file *file,
  			char __user *buf, size_t nbytes, loff_t *ppos);
ddbcc7e8e   Paul Menage   Task Control Grou...
320
  	/*
f4c753b7e   Paul Menage   CGroup API files:...
321
  	 * read_u64() is a shortcut for the common case of returning a
ddbcc7e8e   Paul Menage   Task Control Grou...
322
323
  	 * single integer. Use it in place of read()
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
324
  	u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
917965696   Paul Menage   CGroup API files:...
325
  	/*
e73d2c61d   Paul Menage   CGroups _s64 file...
326
327
  	 * read_s64() is a signed version of read_u64()
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
328
  	s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
e73d2c61d   Paul Menage   CGroups _s64 file...
329
  	/*
917965696   Paul Menage   CGroup API files:...
330
331
332
333
334
  	 * read_map() is used for defining a map of key/value
  	 * pairs. It should call cb->fill(cb, key, value) for each
  	 * entry. The key/value pairs (and their ordering) should not
  	 * change between reboots.
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
335
336
  	int (*read_map)(struct cgroup *cont, struct cftype *cft,
  			struct cgroup_map_cb *cb);
29486df32   Serge E. Hallyn   cgroups: introduc...
337
338
339
340
  	/*
  	 * read_seq_string() is used for outputting a simple sequence
  	 * using seqfile.
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
341
342
  	int (*read_seq_string)(struct cgroup *cont, struct cftype *cft,
  			       struct seq_file *m);
917965696   Paul Menage   CGroup API files:...
343

ce16b49d3   Paul Menage   cgroup files: cle...
344
345
346
  	ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
  			 struct file *file,
  			 const char __user *buf, size_t nbytes, loff_t *ppos);
355e0c48b   Paul Menage   Add cgroup write_...
347
348
  
  	/*
f4c753b7e   Paul Menage   CGroup API files:...
349
  	 * write_u64() is a shortcut for the common case of accepting
355e0c48b   Paul Menage   Add cgroup write_...
350
351
352
  	 * a single integer (as parsed by simple_strtoull) from
  	 * userspace. Use in place of write(); return 0 or error.
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
353
  	int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
e73d2c61d   Paul Menage   CGroups _s64 file...
354
355
356
  	/*
  	 * write_s64() is a signed version of write_u64()
  	 */
ce16b49d3   Paul Menage   cgroup files: cle...
357
  	int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
355e0c48b   Paul Menage   Add cgroup write_...
358

d447ea2f3   Pavel Emelyanov   cgroups: add the ...
359
  	/*
db3b14978   Paul Menage   cgroup files: add...
360
361
362
363
364
365
366
  	 * write_string() is passed a nul-terminated kernelspace
  	 * buffer of maximum length determined by max_write_len.
  	 * Returns 0 or -ve error code.
  	 */
  	int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
  			    const char *buffer);
  	/*
d447ea2f3   Pavel Emelyanov   cgroups: add the ...
367
368
369
370
371
372
  	 * trigger() callback can be used to get some kick from the
  	 * userspace, when the actual string written is not important
  	 * at all. The private field can be used to determine the
  	 * kick type for multiplexing.
  	 */
  	int (*trigger)(struct cgroup *cgrp, unsigned int event);
ce16b49d3   Paul Menage   cgroup files: cle...
373
  	int (*release)(struct inode *inode, struct file *file);
0dea11687   Kirill A. Shutemov   cgroup: implement...
374
375
376
377
378
379
380
381
382
383
384
385
386
387
  
  	/*
  	 * register_event() callback will be used to add new userspace
  	 * waiter for changes related to the cftype. Implement it if
  	 * you want to provide this functionality. Use eventfd_signal()
  	 * on eventfd to send notification to userspace.
  	 */
  	int (*register_event)(struct cgroup *cgrp, struct cftype *cft,
  			struct eventfd_ctx *eventfd, const char *args);
  	/*
  	 * unregister_event() callback will be called when userspace
  	 * closes the eventfd or on cgroup removing.
  	 * This callback must be implemented, if you want provide
  	 * notification functionality.
0dea11687   Kirill A. Shutemov   cgroup: implement...
388
  	 */
907860ed3   Kirill A. Shutemov   cgroups: make cft...
389
  	void (*unregister_event)(struct cgroup *cgrp, struct cftype *cft,
0dea11687   Kirill A. Shutemov   cgroup: implement...
390
  			struct eventfd_ctx *eventfd);
ddbcc7e8e   Paul Menage   Task Control Grou...
391
  };
31a7df01f   Cliff Wickman   cgroups: mechanis...
392
393
394
395
396
397
  struct cgroup_scanner {
  	struct cgroup *cg;
  	int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
  	void (*process_task)(struct task_struct *p,
  			struct cgroup_scanner *scan);
  	struct ptr_heap *heap;
bd1a8ab73   Li Zefan   cgroups: add 'dat...
398
  	void *data;
31a7df01f   Cliff Wickman   cgroups: mechanis...
399
  };
d20a390a0   Paul Menage   cgroups: fix cgro...
400
401
402
403
  /*
   * Add a new file to the given cgroup directory. Should only be
   * called by subsystems from within a populate() method
   */
ffd2d8833   Li Zefan   cgroup: clean up ...
404
  int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
ddbcc7e8e   Paul Menage   Task Control Grou...
405
  		       const struct cftype *cft);
d20a390a0   Paul Menage   cgroups: fix cgro...
406
407
408
409
  /*
   * Add a set of new files to the given cgroup directory. Should
   * only be called by subsystems from within a populate() method
   */
ffd2d8833   Li Zefan   cgroup: clean up ...
410
  int cgroup_add_files(struct cgroup *cgrp,
ddbcc7e8e   Paul Menage   Task Control Grou...
411
412
413
  			struct cgroup_subsys *subsys,
  			const struct cftype cft[],
  			int count);
ffd2d8833   Li Zefan   cgroup: clean up ...
414
  int cgroup_is_removed(const struct cgroup *cgrp);
ddbcc7e8e   Paul Menage   Task Control Grou...
415

ffd2d8833   Li Zefan   cgroup: clean up ...
416
  int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
ddbcc7e8e   Paul Menage   Task Control Grou...
417

ffd2d8833   Li Zefan   cgroup: clean up ...
418
  int cgroup_task_count(const struct cgroup *cgrp);
bbcb81d09   Paul Menage   Task Control Grou...
419

313e924c0   Grzegorz Nosek   cgroups: relax ns...
420
421
  /* Return true if cgrp is a descendant of the task's cgroup */
  int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
ddbcc7e8e   Paul Menage   Task Control Grou...
422

21acb9caa   Thadeu Lima de Souza Cascardo   trivial: fix wher...
423
  /*
887032670   KAMEZAWA Hiroyuki   cgroup avoid perm...
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
   * When the subsys has to access css and may add permanent refcnt to css,
   * it should take care of racy conditions with rmdir(). Following set of
   * functions, is for stop/restart rmdir if necessary.
   * Because these will call css_get/put, "css" should be alive css.
   *
   *  cgroup_exclude_rmdir();
   *  ...do some jobs which may access arbitrary empty cgroup
   *  cgroup_release_and_wakeup_rmdir();
   *
   *  When someone removes a cgroup while cgroup_exclude_rmdir() holds it,
   *  it sleeps and cgroup_release_and_wakeup_rmdir() will wake him up.
   */
  
  void cgroup_exclude_rmdir(struct cgroup_subsys_state *css);
  void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css);
  
  /*
21acb9caa   Thadeu Lima de Souza Cascardo   trivial: fix wher...
441
442
443
   * Control Group subsystem type.
   * See Documentation/cgroups/cgroups.txt for details
   */
ddbcc7e8e   Paul Menage   Task Control Grou...
444
445
446
  
  struct cgroup_subsys {
  	struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss,
ffd2d8833   Li Zefan   cgroup: clean up ...
447
  						  struct cgroup *cgrp);
ec64f5154   KAMEZAWA Hiroyuki   cgroup: fix frequ...
448
  	int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
ffd2d8833   Li Zefan   cgroup: clean up ...
449
  	void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
be367d099   Ben Blum   cgroups: let ss->...
450
  	int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
f780bdb7c   Ben Blum   cgroups: add per-...
451
452
  			  struct task_struct *tsk);
  	int (*can_attach_task)(struct cgroup *cgrp, struct task_struct *tsk);
2468c7234   Daisuke Nishimura   cgroup: introduce...
453
  	void (*cancel_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
f780bdb7c   Ben Blum   cgroups: add per-...
454
455
456
  			      struct task_struct *tsk);
  	void (*pre_attach)(struct cgroup *cgrp);
  	void (*attach_task)(struct cgroup *cgrp, struct task_struct *tsk);
ffd2d8833   Li Zefan   cgroup: clean up ...
457
  	void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
f780bdb7c   Ben Blum   cgroups: add per-...
458
  		       struct cgroup *old_cgrp, struct task_struct *tsk);
ddbcc7e8e   Paul Menage   Task Control Grou...
459
  	void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
d41d5a016   Peter Zijlstra   cgroup: Fix cgrou...
460
461
  	void (*exit)(struct cgroup_subsys *ss, struct cgroup *cgrp,
  			struct cgroup *old_cgrp, struct task_struct *task);
ddbcc7e8e   Paul Menage   Task Control Grou...
462
  	int (*populate)(struct cgroup_subsys *ss,
ffd2d8833   Li Zefan   cgroup: clean up ...
463
464
  			struct cgroup *cgrp);
  	void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
ddbcc7e8e   Paul Menage   Task Control Grou...
465
  	void (*bind)(struct cgroup_subsys *ss, struct cgroup *root);
e5991371e   Hugh Dickins   mm: remove cgroup...
466

ddbcc7e8e   Paul Menage   Task Control Grou...
467
468
  	int subsys_id;
  	int active;
8bab8dded   Paul Menage   cgroups: add cgro...
469
  	int disabled;
ddbcc7e8e   Paul Menage   Task Control Grou...
470
  	int early_init;
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
471
472
473
474
475
  	/*
  	 * True if this subsys uses ID. ID is not available before cgroup_init()
  	 * (not available in early_init time.)
  	 */
  	bool use_id;
ddbcc7e8e   Paul Menage   Task Control Grou...
476
477
  #define MAX_CGROUP_TYPE_NAMELEN 32
  	const char *name;
999cd8a45   Paul Menage   cgroups: add a pe...
478
479
480
481
482
483
484
485
486
487
488
  	/*
  	 * Protects sibling/children links of cgroups in this
  	 * hierarchy, plus protects which hierarchy (or none) the
  	 * subsystem is a part of (i.e. root/sibling).  To avoid
  	 * potential deadlocks, the following operations should not be
  	 * undertaken while holding any hierarchy_mutex:
  	 *
  	 * - allocating memory
  	 * - initiating hotplug events
  	 */
  	struct mutex hierarchy_mutex;
cfebe563b   Li Zefan   cgroups: fix lock...
489
  	struct lock_class_key subsys_key;
ddbcc7e8e   Paul Menage   Task Control Grou...
490

999cd8a45   Paul Menage   cgroups: add a pe...
491
492
493
494
495
  	/*
  	 * Link to parent, and list entry in parent's children.
  	 * Protected by this->hierarchy_mutex and cgroup_lock()
  	 */
  	struct cgroupfs_root *root;
ddbcc7e8e   Paul Menage   Task Control Grou...
496
  	struct list_head sibling;
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
497
498
  	/* used when use_id == true */
  	struct idr idr;
c1e2ee2dc   Andrew Bresticker   memcg: replace ss...
499
  	rwlock_t id_lock;
e6a1105ba   Ben Blum   cgroups: subsyste...
500
501
502
  
  	/* should be defined only by modular subsystems */
  	struct module *module;
ddbcc7e8e   Paul Menage   Task Control Grou...
503
504
505
506
507
508
509
  };
  
  #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
  #include <linux/cgroup_subsys.h>
  #undef SUBSYS
  
  static inline struct cgroup_subsys_state *cgroup_subsys_state(
ffd2d8833   Li Zefan   cgroup: clean up ...
510
  	struct cgroup *cgrp, int subsys_id)
ddbcc7e8e   Paul Menage   Task Control Grou...
511
  {
ffd2d8833   Li Zefan   cgroup: clean up ...
512
  	return cgrp->subsys[subsys_id];
ddbcc7e8e   Paul Menage   Task Control Grou...
513
  }
dc61b1d65   Peter Zijlstra   sched: Fix PROVE_...
514
515
516
517
518
519
520
  /*
   * function to get the cgroup_subsys_state which allows for extra
   * rcu_dereference_check() conditions, such as locks used during the
   * cgroup_subsys::attach() methods.
   */
  #define task_subsys_state_check(task, subsys_id, __c)			\
  	rcu_dereference_check(task->cgroups->subsys[subsys_id],		\
dc61b1d65   Peter Zijlstra   sched: Fix PROVE_...
521
522
523
524
525
  			      lockdep_is_held(&task->alloc_lock) ||	\
  			      cgroup_lock_is_held() || (__c))
  
  static inline struct cgroup_subsys_state *
  task_subsys_state(struct task_struct *task, int subsys_id)
ddbcc7e8e   Paul Menage   Task Control Grou...
526
  {
dc61b1d65   Peter Zijlstra   sched: Fix PROVE_...
527
  	return task_subsys_state_check(task, subsys_id, false);
ddbcc7e8e   Paul Menage   Task Control Grou...
528
529
530
531
532
533
534
  }
  
  static inline struct cgroup* task_cgroup(struct task_struct *task,
  					       int subsys_id)
  {
  	return task_subsys_state(task, subsys_id)->cgroup;
  }
817929ec2   Paul Menage   Task Control Grou...
535
536
537
538
539
  /* A cgroup_iter should be treated as an opaque object */
  struct cgroup_iter {
  	struct list_head *cg_link;
  	struct list_head *task;
  };
d20a390a0   Paul Menage   cgroups: fix cgro...
540
541
  /*
   * To iterate across the tasks in a cgroup:
817929ec2   Paul Menage   Task Control Grou...
542
   *
b595076a1   Uwe Kleine-König   tree-wide: fix co...
543
   * 1) call cgroup_iter_start to initialize an iterator
817929ec2   Paul Menage   Task Control Grou...
544
545
546
547
548
   *
   * 2) call cgroup_iter_next() to retrieve member tasks until it
   *    returns NULL or until you want to end the iteration
   *
   * 3) call cgroup_iter_end() to destroy the iterator.
31a7df01f   Cliff Wickman   cgroups: mechanis...
549
   *
d20a390a0   Paul Menage   cgroups: fix cgro...
550
551
552
553
   * Or, call cgroup_scan_tasks() to iterate through every task in a
   * cgroup - cgroup_scan_tasks() holds the css_set_lock when calling
   * the test_task() callback, but not while calling the process_task()
   * callback.
817929ec2   Paul Menage   Task Control Grou...
554
   */
ffd2d8833   Li Zefan   cgroup: clean up ...
555
556
  void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it);
  struct task_struct *cgroup_iter_next(struct cgroup *cgrp,
817929ec2   Paul Menage   Task Control Grou...
557
  					struct cgroup_iter *it);
ffd2d8833   Li Zefan   cgroup: clean up ...
558
  void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
31a7df01f   Cliff Wickman   cgroups: mechanis...
559
  int cgroup_scan_tasks(struct cgroup_scanner *scan);
956db3ca0   Cliff Wickman   hotplug cpu: move...
560
  int cgroup_attach_task(struct cgroup *, struct task_struct *);
31583bb0c   Michael S. Tsirkin   cgroups: fix API ...
561
562
563
564
565
566
  int cgroup_attach_task_all(struct task_struct *from, struct task_struct *);
  
  static inline int cgroup_attach_task_current_cg(struct task_struct *tsk)
  {
  	return cgroup_attach_task_all(current, tsk);
  }
817929ec2   Paul Menage   Task Control Grou...
567

38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
  /*
   * CSS ID is ID for cgroup_subsys_state structs under subsys. This only works
   * if cgroup_subsys.use_id == true. It can be used for looking up and scanning.
   * CSS ID is assigned at cgroup allocation (create) automatically
   * and removed when subsys calls free_css_id() function. This is because
   * the lifetime of cgroup_subsys_state is subsys's matter.
   *
   * Looking up and scanning function should be called under rcu_read_lock().
   * Taking cgroup_mutex()/hierarchy_mutex() is not necessary for following calls.
   * But the css returned by this routine can be "not populated yet" or "being
   * destroyed". The caller should check css and cgroup's status.
   */
  
  /*
   * Typically Called at ->destroy(), or somewhere the subsys frees
   * cgroup_subsys_state.
   */
  void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
  
  /* Find a cgroup_subsys_state which has given ID */
  
  struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
  
  /*
   * Get a cgroup whose id is greater than or equal to id under tree of root.
   * Returning a cgroup_subsys_state or NULL.
   */
  struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
  		struct cgroup_subsys_state *root, int *foundid);
  
  /* Returns true if root is ancestor of cg */
  bool css_is_ancestor(struct cgroup_subsys_state *cg,
0b7f569e4   KAMEZAWA Hiroyuki   memcg: fix OOM ki...
600
  		     const struct cgroup_subsys_state *root);
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
601
602
603
604
  
  /* Get id and depth of css */
  unsigned short css_id(struct cgroup_subsys_state *css);
  unsigned short css_depth(struct cgroup_subsys_state *css);
e5d1367f1   Stephane Eranian   perf: Add cgroup ...
605
  struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id);
38460b48d   KAMEZAWA Hiroyuki   cgroup: CSS ID su...
606

ddbcc7e8e   Paul Menage   Task Control Grou...
607
608
609
610
  #else /* !CONFIG_CGROUPS */
  
  static inline int cgroup_init_early(void) { return 0; }
  static inline int cgroup_init(void) { return 0; }
b4f48b636   Paul Menage   Task Control Grou...
611
612
  static inline void cgroup_fork(struct task_struct *p) {}
  static inline void cgroup_fork_callbacks(struct task_struct *p) {}
817929ec2   Paul Menage   Task Control Grou...
613
  static inline void cgroup_post_fork(struct task_struct *p) {}
b4f48b636   Paul Menage   Task Control Grou...
614
  static inline void cgroup_exit(struct task_struct *p, int callbacks) {}
ddbcc7e8e   Paul Menage   Task Control Grou...
615
616
617
  
  static inline void cgroup_lock(void) {}
  static inline void cgroup_unlock(void) {}
846c7bb05   Balbir Singh   Add cgroupstats
618
619
620
621
622
  static inline int cgroupstats_build(struct cgroupstats *stats,
  					struct dentry *dentry)
  {
  	return -EINVAL;
  }
ddbcc7e8e   Paul Menage   Task Control Grou...
623

d7926ee38   Sridhar Samudrala   cgroups: Add an A...
624
  /* No cgroups - nothing to do */
31583bb0c   Michael S. Tsirkin   cgroups: fix API ...
625
626
627
628
629
  static inline int cgroup_attach_task_all(struct task_struct *from,
  					 struct task_struct *t)
  {
  	return 0;
  }
d7926ee38   Sridhar Samudrala   cgroups: Add an A...
630
631
632
633
  static inline int cgroup_attach_task_current_cg(struct task_struct *t)
  {
  	return 0;
  }
ddbcc7e8e   Paul Menage   Task Control Grou...
634
635
636
  #endif /* !CONFIG_CGROUPS */
  
  #endif /* _LINUX_CGROUP_H */