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 const 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
144
145enum cgroup_filetype {
146 CGROUP_FILE_PROCS,
147 CGROUP_FILE_TASKS,
148};
149
150
151
152
153
154
155
156struct cgroup_pidlist {
157
158
159
160
161 struct { enum cgroup_filetype type; struct pid_namespace *ns; } key;
162
163 pid_t *list;
164
165 int length;
166
167 int use_count;
168
169 struct list_head links;
170
171 struct cgroup *owner;
172
173 struct rw_semaphore mutex;
174};
175
176struct cgroup {
177 unsigned long flags;
178
179
180
181
182
183 atomic_t count;
184
185
186
187
188
189 struct list_head sibling;
190 struct list_head children;
191
192 struct cgroup *parent;
193 struct dentry *dentry;
194
195
196 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
197
198 struct cgroupfs_root *root;
199 struct cgroup *top_cgroup;
200
201
202
203
204
205 struct list_head css_sets;
206
207
208
209
210
211
212 struct list_head release_list;
213
214
215
216
217
218 struct list_head pidlists;
219 struct mutex pidlist_mutex;
220
221
222 struct rcu_head rcu_head;
223};
224
225
226
227
228
229
230
231
232
233struct css_set {
234
235
236 atomic_t refcount;
237
238
239
240
241
242 struct hlist_node hlist;
243
244
245
246
247
248 struct list_head tasks;
249
250
251
252
253
254
255 struct list_head cg_links;
256
257
258
259
260
261
262 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
263
264
265 struct rcu_head rcu_head;
266};
267
268
269
270
271
272
273struct cgroup_map_cb {
274 int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
275 void *state;
276};
277
278
279
280
281
282
283
284
285
286#define MAX_CFTYPE_NAME 64
287struct cftype {
288
289
290
291
292 char name[MAX_CFTYPE_NAME];
293 int private;
294
295
296
297
298 mode_t mode;
299
300
301
302
303
304 size_t max_write_len;
305
306 int (*open)(struct inode *inode, struct file *file);
307 ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
308 struct file *file,
309 char __user *buf, size_t nbytes, loff_t *ppos);
310
311
312
313
314 u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
315
316
317
318 s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
319
320
321
322
323
324
325 int (*read_map)(struct cgroup *cont, struct cftype *cft,
326 struct cgroup_map_cb *cb);
327
328
329
330
331 int (*read_seq_string)(struct cgroup *cont, struct cftype *cft,
332 struct seq_file *m);
333
334 ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
335 struct file *file,
336 const char __user *buf, size_t nbytes, loff_t *ppos);
337
338
339
340
341
342
343 int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
344
345
346
347 int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
348
349
350
351
352
353
354 int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
355 const char *buffer);
356
357
358
359
360
361
362 int (*trigger)(struct cgroup *cgrp, unsigned int event);
363
364 int (*release)(struct inode *inode, struct file *file);
365};
366
367struct cgroup_scanner {
368 struct cgroup *cg;
369 int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
370 void (*process_task)(struct task_struct *p,
371 struct cgroup_scanner *scan);
372 struct ptr_heap *heap;
373 void *data;
374};
375
376
377
378
379
380int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
381 const struct cftype *cft);
382
383
384
385
386
387int cgroup_add_files(struct cgroup *cgrp,
388 struct cgroup_subsys *subsys,
389 const struct cftype cft[],
390 int count);
391
392int cgroup_is_removed(const struct cgroup *cgrp);
393
394int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
395
396int cgroup_task_count(const struct cgroup *cgrp);
397
398
399int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415void cgroup_exclude_rmdir(struct cgroup_subsys_state *css);
416void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css);
417
418
419
420
421
422
423struct cgroup_subsys {
424 struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss,
425 struct cgroup *cgrp);
426 int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
427 void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
428 int (*can_attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
429 struct task_struct *tsk, bool threadgroup);
430 void (*attach)(struct cgroup_subsys *ss, struct cgroup *cgrp,
431 struct cgroup *old_cgrp, struct task_struct *tsk,
432 bool threadgroup);
433 void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
434 void (*exit)(struct cgroup_subsys *ss, struct task_struct *task);
435 int (*populate)(struct cgroup_subsys *ss,
436 struct cgroup *cgrp);
437 void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
438 void (*bind)(struct cgroup_subsys *ss, struct cgroup *root);
439
440 int subsys_id;
441 int active;
442 int disabled;
443 int early_init;
444
445
446
447
448 bool use_id;
449#define MAX_CGROUP_TYPE_NAMELEN 32
450 const char *name;
451
452
453
454
455
456
457
458
459
460
461
462 struct mutex hierarchy_mutex;
463 struct lock_class_key subsys_key;
464
465
466
467
468
469 struct cgroupfs_root *root;
470 struct list_head sibling;
471
472 struct idr idr;
473 spinlock_t id_lock;
474};
475
476#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
477#include <linux/cgroup_subsys.h>
478#undef SUBSYS
479
480static inline struct cgroup_subsys_state *cgroup_subsys_state(
481 struct cgroup *cgrp, int subsys_id)
482{
483 return cgrp->subsys[subsys_id];
484}
485
486static inline struct cgroup_subsys_state *task_subsys_state(
487 struct task_struct *task, int subsys_id)
488{
489 return rcu_dereference(task->cgroups->subsys[subsys_id]);
490}
491
492static inline struct cgroup* task_cgroup(struct task_struct *task,
493 int subsys_id)
494{
495 return task_subsys_state(task, subsys_id)->cgroup;
496}
497
498int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss,
499 char *nodename);
500
501
502struct cgroup_iter {
503 struct list_head *cg_link;
504 struct list_head *task;
505};
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it);
523struct task_struct *cgroup_iter_next(struct cgroup *cgrp,
524 struct cgroup_iter *it);
525void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
526int cgroup_scan_tasks(struct cgroup_scanner *scan);
527int cgroup_attach_task(struct cgroup *, struct task_struct *);
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
547
548
549
550struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
551
552
553
554
555
556struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
557 struct cgroup_subsys_state *root, int *foundid);
558
559
560bool css_is_ancestor(struct cgroup_subsys_state *cg,
561 const struct cgroup_subsys_state *root);
562
563
564unsigned short css_id(struct cgroup_subsys_state *css);
565unsigned short css_depth(struct cgroup_subsys_state *css);
566
567#else
568
569static inline int cgroup_init_early(void) { return 0; }
570static inline int cgroup_init(void) { return 0; }
571static inline void cgroup_fork(struct task_struct *p) {}
572static inline void cgroup_fork_callbacks(struct task_struct *p) {}
573static inline void cgroup_post_fork(struct task_struct *p) {}
574static inline void cgroup_exit(struct task_struct *p, int callbacks) {}
575
576static inline void cgroup_lock(void) {}
577static inline void cgroup_unlock(void) {}
578static inline int cgroupstats_build(struct cgroupstats *stats,
579 struct dentry *dentry)
580{
581 return -EINVAL;
582}
583
584#endif
585
586#endif
587