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