]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/cgroup.h
core: unified cgroup hierarchy support
[thirdparty/systemd.git] / src / core / cgroup.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
8e274523 2
c2f1db8f 3#pragma once
8e274523
LP
4
5/***
6 This file is part of systemd.
7
4ad49000 8 Copyright 2013 Lennart Poettering
8e274523
LP
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
8e274523
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
8e274523 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
8e274523
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
c1ff5570
TA
24#include <stdbool.h>
25
4ad49000 26#include "list.h"
c1ff5570 27#include "time-util.h"
8e274523 28
4ad49000
LP
29typedef struct CGroupContext CGroupContext;
30typedef struct CGroupDeviceAllow CGroupDeviceAllow;
31typedef struct CGroupBlockIODeviceWeight CGroupBlockIODeviceWeight;
32typedef struct CGroupBlockIODeviceBandwidth CGroupBlockIODeviceBandwidth;
8e274523 33
4ad49000 34typedef enum CGroupDevicePolicy {
8e274523 35
4ad49000
LP
36 /* When devices listed, will allow those, plus built-in ones,
37 if none are listed will allow everything. */
38 CGROUP_AUTO,
8e274523 39
4ad49000
LP
40 /* Everything forbidden, except built-in ones and listed ones. */
41 CGROUP_CLOSED,
9d58f1db 42
4ad49000
LP
43 /* Everythings forbidden, except for the listed devices */
44 CGROUP_STRICT,
9d58f1db 45
4ad49000
LP
46 _CGROUP_DEVICE_POLICY_MAX,
47 _CGROUP_DEVICE_POLICY_INVALID = -1
48} CGroupDevicePolicy;
8e274523 49
4ad49000
LP
50struct CGroupDeviceAllow {
51 LIST_FIELDS(CGroupDeviceAllow, device_allow);
52 char *path;
53 bool r:1;
54 bool w:1;
55 bool m:1;
56};
8c6db833 57
4ad49000
LP
58struct CGroupBlockIODeviceWeight {
59 LIST_FIELDS(CGroupBlockIODeviceWeight, device_weights);
60 char *path;
61 unsigned long weight;
8e274523
LP
62};
63
4ad49000
LP
64struct CGroupBlockIODeviceBandwidth {
65 LIST_FIELDS(CGroupBlockIODeviceBandwidth, device_bandwidths);
66 char *path;
67 uint64_t bandwidth;
68 bool read;
69};
8e274523 70
4ad49000
LP
71struct CGroupContext {
72 bool cpu_accounting;
73 bool blockio_accounting;
74 bool memory_accounting;
8e274523 75
4ad49000 76 unsigned long cpu_shares;
95ae05c0 77 unsigned long startup_cpu_shares;
b2f8b02e 78 usec_t cpu_quota_per_sec_usec;
8e274523 79
4ad49000 80 unsigned long blockio_weight;
95ae05c0 81 unsigned long startup_blockio_weight;
4ad49000
LP
82 LIST_HEAD(CGroupBlockIODeviceWeight, blockio_device_weights);
83 LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths);
246aa6dd 84
4ad49000 85 uint64_t memory_limit;
64747e2d 86
4ad49000
LP
87 CGroupDevicePolicy device_policy;
88 LIST_HEAD(CGroupDeviceAllow, device_allow);
a931ad47
LP
89
90 bool delegate;
4ad49000 91};
64747e2d 92
4ad49000 93#include "unit.h"
4ad49000 94#include "cgroup-util.h"
8e274523 95
4ad49000
LP
96void cgroup_context_init(CGroupContext *c);
97void cgroup_context_done(CGroupContext *c);
98void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix);
efdb0237 99void cgroup_context_apply(CGroupContext *c, CGroupMask mask, const char *path, ManagerState state);
bc432dc7 100
efdb0237 101CGroupMask cgroup_context_get_mask(CGroupContext *c);
fb385181 102
4ad49000
LP
103void cgroup_context_free_device_allow(CGroupContext *c, CGroupDeviceAllow *a);
104void cgroup_context_free_blockio_device_weight(CGroupContext *c, CGroupBlockIODeviceWeight *w);
105void cgroup_context_free_blockio_device_bandwidth(CGroupContext *c, CGroupBlockIODeviceBandwidth *b);
8e274523 106
efdb0237
LP
107CGroupMask unit_get_own_mask(Unit *u);
108CGroupMask unit_get_siblings_mask(Unit *u);
109CGroupMask unit_get_members_mask(Unit *u);
110CGroupMask unit_get_subtree_mask(Unit *u);
111
112CGroupMask unit_get_target_mask(Unit *u);
113CGroupMask unit_get_enable_mask(Unit *u);
bc432dc7
LP
114
115void unit_update_cgroup_members_masks(Unit *u);
efdb0237
LP
116
117char *unit_default_cgroup_path(Unit *u);
118int unit_set_cgroup_path(Unit *u, const char *path);
119
0a1eb06d 120int unit_realize_cgroup(Unit *u);
efdb0237
LP
121void unit_release_cgroup(Unit *u);
122void unit_prune_cgroup(Unit *u);
123int unit_watch_cgroup(Unit *u);
124
7b3fd631 125int unit_attach_pids_to_cgroup(Unit *u);
8e274523 126
4ad49000
LP
127int manager_setup_cgroup(Manager *m);
128void manager_shutdown_cgroup(Manager *m, bool delete);
6dde1f33 129
4ad49000 130unsigned manager_dispatch_cgroup_queue(Manager *m);
4fbf50b3 131
4ad49000
LP
132Unit *manager_get_unit_by_cgroup(Manager *m, const char *cgroup);
133Unit* manager_get_unit_by_pid(Manager *m, pid_t pid);
8e274523 134
efdb0237
LP
135int unit_search_main_pid(Unit *u, pid_t *ret);
136int unit_watch_all_pids(Unit *u);
8e274523 137
5ad096b3
LP
138int unit_get_memory_current(Unit *u, uint64_t *ret);
139int unit_get_cpu_usage(Unit *u, nsec_t *ret);
140int unit_reset_cpu_usage(Unit *u);
141
e9db43d5
LP
142bool unit_cgroup_delegate(Unit *u);
143
efdb0237
LP
144int unit_notify_cgroup_empty(Unit *u);
145int manager_notify_cgroup_empty(Manager *m, const char *group);
146
4ad49000
LP
147const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_;
148CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_;