1#ifndef _LINUX_CGROUP_H
2#define _LINUX_CGROUP_H
3
4
5
6
7
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
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
51struct cgroup_subsys_state {
52
53
54
55
56
57 struct cgroup *cgroup;
58
59
60
61
62
63
64
65 atomic_t refcnt;
66
67 unsigned long flags;
68
69 struct css_id *id;
70};
71
72
73enum {
74 CSS_ROOT,
75 CSS_REMOVED,
76};
77
78
79
80
81
82
83
84
85static inline void css_get(struct cgroup_subsys_state *css)
86{
87
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
99
100
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
117
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
128enum {
129
130 CGRP_REMOVED,
131
132
133
134
135 CGRP_RELEASABLE,
136
137 CGRP_NOTIFY_ON_RELEASE,
138
139
140
141 CGRP_WAIT_ON_RMDIR,
142};
143
144struct cgroup {
145 unsigned long flags;
146
147
148
149
150
151 atomic_t count;
152
153
154
155
156
157 struct list_head sibling;
158 struct list_head children;
159
160 struct cgroup *parent;
161 struct dentry *dentry;
162
163
164 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
165
166 struct cgroupfs_root *root;
167 struct cgroup *top_cgroup;
168
169
170
171
172
173 struct list_head css_sets;
174
175
176
177
178
179
180 struct list_head release_list;
181
182
183 struct rw_semaphore pids_mutex;
184
185
186 struct list_head pids_list;
187
188
189 struct rcu_head rcu_head;
190};
191
192
193
194
195
196
197
198
199
200struct css_set {
201
202
203 atomic_t refcount;
204
205
206
207
208
209 struct hlist_node hlist;
210
211
212
213
214
215 struct list_head tasks;
216
217
218
219
220
221
222 struct list_head cg_links;
223
224
225
226
227
228
229 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
230};
231
232
233
234
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
244
245
246
247
248
249
250#define MAX_CFTYPE_NAME 64
251struct cftype {
252
253
254
255
256 char name[MAX_CFTYPE_NAME];
257 int private;
258
259
260
261
262 mode_t mode;
263
264
265
266
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
276
277
278 u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
279
280
281
282 s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
283
284
285
286
287
288
289 int (*read_map)(struct cgroup *cont, struct cftype *cft,
290 struct cgroup_map_cb *cb);
291
292
293
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
304
305
306
307 int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
308
309
310
311 int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
312
313
314
315
316
317
318 int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
319 const char *buffer);
320
321
322
323
324
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
342
343
344int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
345 const struct cftype *cft);
346
347
348
349
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
363int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
364
365
366
367
368
369
370
371
372
373
374
375
376
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
384
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
409
410
411 bool use_id;
412#define MAX_CGROUP_TYPE_NAMELEN 32
413 const char *name;
414
415
416
417
418
419
420
421
422
423
424
425 struct mutex hierarchy_mutex;
426 struct lock_class_key subsys_key;
427
428
429
430
431
432 struct cgroupfs_root *root;
433 struct list_head sibling;
434
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
465struct cgroup_iter {
466 struct list_head *cg_link;
467 struct list_head *task;
468};
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
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
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
510
511
512
513struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
514
515
516
517
518
519struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
520 struct cgroup_subsys_state *root, int *foundid);
521
522
523bool css_is_ancestor(struct cgroup_subsys_state *cg,
524 const struct cgroup_subsys_state *root);
525
526
527unsigned short css_id(struct cgroup_subsys_state *css);
528unsigned short css_depth(struct cgroup_subsys_state *css);
529
530#else
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
548
549#endif
550