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