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 int cgroup_lock_is_held(void);
32extern bool cgroup_lock_live_group(struct cgroup *cgrp);
33extern void cgroup_unlock(void);
34extern void cgroup_fork(struct task_struct *p);
35extern void cgroup_fork_callbacks(struct task_struct *p);
36extern void cgroup_post_fork(struct task_struct *p);
37extern void cgroup_exit(struct task_struct *p, int run_callbacks);
38extern int cgroupstats_build(struct cgroupstats *stats,
39 struct dentry *dentry);
40extern int cgroup_load_subsys(struct cgroup_subsys *ss);
41extern void cgroup_unload_subsys(struct cgroup_subsys *ss);
42
43extern const struct file_operations proc_cgroup_operations;
44
45
46#define SUBSYS(_x) _x ## _subsys_id,
47enum cgroup_subsys_id {
48#include <linux/cgroup_subsys.h>
49 CGROUP_BUILTIN_SUBSYS_COUNT
50};
51#undef SUBSYS
52
53
54
55
56
57#define CGROUP_SUBSYS_COUNT (BITS_PER_BYTE*sizeof(unsigned long))
58
59
60struct cgroup_subsys_state {
61
62
63
64
65
66 struct cgroup *cgroup;
67
68
69
70
71
72
73
74 atomic_t refcnt;
75
76 unsigned long flags;
77
78 struct css_id __rcu *id;
79};
80
81
82enum {
83 CSS_ROOT,
84 CSS_REMOVED,
85};
86
87
88static inline void __css_get(struct cgroup_subsys_state *css, int count)
89{
90 atomic_add(count, &css->refcnt);
91}
92
93
94
95
96
97
98
99
100static inline void css_get(struct cgroup_subsys_state *css)
101{
102
103 if (!test_bit(CSS_ROOT, &css->flags))
104 __css_get(css, 1);
105}
106
107static inline bool css_is_removed(struct cgroup_subsys_state *css)
108{
109 return test_bit(CSS_REMOVED, &css->flags);
110}
111
112
113
114
115
116
117
118static inline bool css_tryget(struct cgroup_subsys_state *css)
119{
120 if (test_bit(CSS_ROOT, &css->flags))
121 return true;
122 while (!atomic_inc_not_zero(&css->refcnt)) {
123 if (test_bit(CSS_REMOVED, &css->flags))
124 return false;
125 cpu_relax();
126 }
127 return true;
128}
129
130
131
132
133
134
135extern void __css_put(struct cgroup_subsys_state *css, int count);
136static inline void css_put(struct cgroup_subsys_state *css)
137{
138 if (!test_bit(CSS_ROOT, &css->flags))
139 __css_put(css, 1);
140}
141
142
143enum {
144
145 CGRP_REMOVED,
146
147
148
149
150 CGRP_RELEASABLE,
151
152 CGRP_NOTIFY_ON_RELEASE,
153
154
155
156 CGRP_WAIT_ON_RMDIR,
157
158
159
160 CGRP_CLONE_CHILDREN,
161};
162
163struct cgroup {
164 unsigned long flags;
165
166
167
168
169
170 atomic_t count;
171
172
173
174
175
176 struct list_head sibling;
177 struct list_head children;
178
179 struct cgroup *parent;
180 struct dentry __rcu *dentry;
181
182
183 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
184
185 struct cgroupfs_root *root;
186 struct cgroup *top_cgroup;
187
188
189
190
191
192 struct list_head css_sets;
193
194
195
196
197
198
199 struct list_head release_list;
200
201
202
203
204
205 struct list_head pidlists;
206 struct mutex pidlist_mutex;
207
208
209 struct rcu_head rcu_head;
210
211
212 struct list_head event_list;
213 spinlock_t event_list_lock;
214};
215
216
217
218
219
220
221
222
223
224struct css_set {
225
226
227 atomic_t refcount;
228
229
230
231
232
233 struct hlist_node hlist;
234
235
236
237
238
239 struct list_head tasks;
240
241
242
243
244
245
246 struct list_head cg_links;
247
248
249
250
251
252
253
254 struct cgroup_subsys_state *subsys[CGROUP_SUBSYS_COUNT];
255
256
257 struct rcu_head rcu_head;
258};
259
260
261
262
263
264
265struct cgroup_map_cb {
266 int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
267 void *state;
268};
269
270
271
272
273
274
275
276
277
278#define MAX_CFTYPE_NAME 64
279struct cftype {
280
281
282
283
284 char name[MAX_CFTYPE_NAME];
285 int private;
286
287
288
289
290 umode_t mode;
291
292
293
294
295
296 size_t max_write_len;
297
298 int (*open)(struct inode *inode, struct file *file);
299 ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft,
300 struct file *file,
301 char __user *buf, size_t nbytes, loff_t *ppos);
302
303
304
305
306 u64 (*read_u64)(struct cgroup *cgrp, struct cftype *cft);
307
308
309
310 s64 (*read_s64)(struct cgroup *cgrp, struct cftype *cft);
311
312
313
314
315
316
317 int (*read_map)(struct cgroup *cont, struct cftype *cft,
318 struct cgroup_map_cb *cb);
319
320
321
322
323 int (*read_seq_string)(struct cgroup *cont, struct cftype *cft,
324 struct seq_file *m);
325
326 ssize_t (*write)(struct cgroup *cgrp, struct cftype *cft,
327 struct file *file,
328 const char __user *buf, size_t nbytes, loff_t *ppos);
329
330
331
332
333
334
335 int (*write_u64)(struct cgroup *cgrp, struct cftype *cft, u64 val);
336
337
338
339 int (*write_s64)(struct cgroup *cgrp, struct cftype *cft, s64 val);
340
341
342
343
344
345
346 int (*write_string)(struct cgroup *cgrp, struct cftype *cft,
347 const char *buffer);
348
349
350
351
352
353
354 int (*trigger)(struct cgroup *cgrp, unsigned int event);
355
356 int (*release)(struct inode *inode, struct file *file);
357
358
359
360
361
362
363
364 int (*register_event)(struct cgroup *cgrp, struct cftype *cft,
365 struct eventfd_ctx *eventfd, const char *args);
366
367
368
369
370
371
372 void (*unregister_event)(struct cgroup *cgrp, struct cftype *cft,
373 struct eventfd_ctx *eventfd);
374};
375
376struct cgroup_scanner {
377 struct cgroup *cg;
378 int (*test_task)(struct task_struct *p, struct cgroup_scanner *scan);
379 void (*process_task)(struct task_struct *p,
380 struct cgroup_scanner *scan);
381 struct ptr_heap *heap;
382 void *data;
383};
384
385
386
387
388
389int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,
390 const struct cftype *cft);
391
392
393
394
395
396int cgroup_add_files(struct cgroup *cgrp,
397 struct cgroup_subsys *subsys,
398 const struct cftype cft[],
399 int count);
400
401int cgroup_is_removed(const struct cgroup *cgrp);
402
403int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen);
404
405int cgroup_task_count(const struct cgroup *cgrp);
406
407
408int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424void cgroup_exclude_rmdir(struct cgroup_subsys_state *css);
425void cgroup_release_and_wakeup_rmdir(struct cgroup_subsys_state *css);
426
427
428
429
430
431struct cgroup_taskset;
432struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset);
433struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset);
434struct cgroup *cgroup_taskset_cur_cgroup(struct cgroup_taskset *tset);
435int cgroup_taskset_size(struct cgroup_taskset *tset);
436
437
438
439
440
441
442
443#define cgroup_taskset_for_each(task, skip_cgrp, tset) \
444 for ((task) = cgroup_taskset_first((tset)); (task); \
445 (task) = cgroup_taskset_next((tset))) \
446 if (!(skip_cgrp) || \
447 cgroup_taskset_cur_cgroup((tset)) != (skip_cgrp))
448
449
450
451
452
453
454struct cgroup_subsys {
455 struct cgroup_subsys_state *(*create)(struct cgroup *cgrp);
456 int (*pre_destroy)(struct cgroup *cgrp);
457 void (*destroy)(struct cgroup *cgrp);
458 int (*can_attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
459 void (*cancel_attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
460 void (*attach)(struct cgroup *cgrp, struct cgroup_taskset *tset);
461 void (*fork)(struct task_struct *task);
462 void (*exit)(struct cgroup *cgrp, struct cgroup *old_cgrp,
463 struct task_struct *task);
464 int (*populate)(struct cgroup_subsys *ss, struct cgroup *cgrp);
465 void (*post_clone)(struct cgroup *cgrp);
466 void (*bind)(struct cgroup *root);
467
468 int subsys_id;
469 int active;
470 int disabled;
471 int early_init;
472
473
474
475
476 bool use_id;
477#define MAX_CGROUP_TYPE_NAMELEN 32
478 const char *name;
479
480
481
482
483
484
485
486
487
488
489
490 struct mutex hierarchy_mutex;
491 struct lock_class_key subsys_key;
492
493
494
495
496
497 struct cgroupfs_root *root;
498 struct list_head sibling;
499
500 struct idr idr;
501 spinlock_t id_lock;
502
503
504 struct module *module;
505};
506
507#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
508#include <linux/cgroup_subsys.h>
509#undef SUBSYS
510
511static inline struct cgroup_subsys_state *cgroup_subsys_state(
512 struct cgroup *cgrp, int subsys_id)
513{
514 return cgrp->subsys[subsys_id];
515}
516
517
518
519
520
521
522#define task_subsys_state_check(task, subsys_id, __c) \
523 rcu_dereference_check(task->cgroups->subsys[subsys_id], \
524 lockdep_is_held(&task->alloc_lock) || \
525 cgroup_lock_is_held() || (__c))
526
527static inline struct cgroup_subsys_state *
528task_subsys_state(struct task_struct *task, int subsys_id)
529{
530 return task_subsys_state_check(task, subsys_id, false);
531}
532
533static inline struct cgroup* task_cgroup(struct task_struct *task,
534 int subsys_id)
535{
536 return task_subsys_state(task, subsys_id)->cgroup;
537}
538
539
540struct cgroup_iter {
541 struct list_head *cg_link;
542 struct list_head *task;
543};
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560void cgroup_iter_start(struct cgroup *cgrp, struct cgroup_iter *it);
561struct task_struct *cgroup_iter_next(struct cgroup *cgrp,
562 struct cgroup_iter *it);
563void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
564int cgroup_scan_tasks(struct cgroup_scanner *scan);
565int cgroup_attach_task(struct cgroup *, struct task_struct *);
566int cgroup_attach_task_all(struct task_struct *from, struct task_struct *);
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css);
586
587
588
589struct cgroup_subsys_state *css_lookup(struct cgroup_subsys *ss, int id);
590
591
592
593
594
595struct cgroup_subsys_state *css_get_next(struct cgroup_subsys *ss, int id,
596 struct cgroup_subsys_state *root, int *foundid);
597
598
599bool css_is_ancestor(struct cgroup_subsys_state *cg,
600 const struct cgroup_subsys_state *root);
601
602
603unsigned short css_id(struct cgroup_subsys_state *css);
604unsigned short css_depth(struct cgroup_subsys_state *css);
605struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id);
606
607#else
608
609static inline int cgroup_init_early(void) { return 0; }
610static inline int cgroup_init(void) { return 0; }
611static inline void cgroup_fork(struct task_struct *p) {}
612static inline void cgroup_fork_callbacks(struct task_struct *p) {}
613static inline void cgroup_post_fork(struct task_struct *p) {}
614static inline void cgroup_exit(struct task_struct *p, int callbacks) {}
615
616static inline void cgroup_lock(void) {}
617static inline void cgroup_unlock(void) {}
618static inline int cgroupstats_build(struct cgroupstats *stats,
619 struct dentry *dentry)
620{
621 return -EINVAL;
622}
623
624
625static inline int cgroup_attach_task_all(struct task_struct *from,
626 struct task_struct *t)
627{
628 return 0;
629}
630
631#endif
632
633#endif
634