]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
c2f1db8f | 2 | #pragma once |
8e274523 LP |
3 | |
4 | /*** | |
5 | This file is part of systemd. | |
6 | ||
4ad49000 | 7 | Copyright 2013 Lennart Poettering |
8e274523 LP |
8 | |
9 | systemd is free software; you can redistribute it and/or modify it | |
5430f7f2 LP |
10 | under the terms of the GNU Lesser General Public License as published by |
11 | the Free Software Foundation; either version 2.1 of the License, or | |
8e274523 LP |
12 | (at your option) any later version. |
13 | ||
14 | systemd is distributed in the hope that it will be useful, but | |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
5430f7f2 | 17 | Lesser General Public License for more details. |
8e274523 | 18 | |
5430f7f2 | 19 | You should have received a copy of the GNU Lesser General Public License |
8e274523 LP |
20 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
21 | ***/ | |
22 | ||
c1ff5570 TA |
23 | #include <stdbool.h> |
24 | ||
6a48d82f DM |
25 | #include "cgroup-util.h" |
26 | #include "ip-address-access.h" | |
4ad49000 | 27 | #include "list.h" |
c1ff5570 | 28 | #include "time-util.h" |
8e274523 | 29 | |
4ad49000 LP |
30 | typedef struct CGroupContext CGroupContext; |
31 | typedef struct CGroupDeviceAllow CGroupDeviceAllow; | |
13c31542 TH |
32 | typedef struct CGroupIODeviceWeight CGroupIODeviceWeight; |
33 | typedef struct CGroupIODeviceLimit CGroupIODeviceLimit; | |
4ad49000 LP |
34 | typedef struct CGroupBlockIODeviceWeight CGroupBlockIODeviceWeight; |
35 | typedef struct CGroupBlockIODeviceBandwidth CGroupBlockIODeviceBandwidth; | |
8e274523 | 36 | |
4ad49000 | 37 | typedef enum CGroupDevicePolicy { |
8e274523 | 38 | |
4ad49000 LP |
39 | /* When devices listed, will allow those, plus built-in ones, |
40 | if none are listed will allow everything. */ | |
41 | CGROUP_AUTO, | |
8e274523 | 42 | |
4ad49000 LP |
43 | /* Everything forbidden, except built-in ones and listed ones. */ |
44 | CGROUP_CLOSED, | |
9d58f1db | 45 | |
4ad49000 LP |
46 | /* Everythings forbidden, except for the listed devices */ |
47 | CGROUP_STRICT, | |
9d58f1db | 48 | |
4ad49000 LP |
49 | _CGROUP_DEVICE_POLICY_MAX, |
50 | _CGROUP_DEVICE_POLICY_INVALID = -1 | |
51 | } CGroupDevicePolicy; | |
8e274523 | 52 | |
4ad49000 LP |
53 | struct CGroupDeviceAllow { |
54 | LIST_FIELDS(CGroupDeviceAllow, device_allow); | |
55 | char *path; | |
56 | bool r:1; | |
57 | bool w:1; | |
58 | bool m:1; | |
59 | }; | |
8c6db833 | 60 | |
13c31542 TH |
61 | struct CGroupIODeviceWeight { |
62 | LIST_FIELDS(CGroupIODeviceWeight, device_weights); | |
63 | char *path; | |
64 | uint64_t weight; | |
65 | }; | |
66 | ||
67 | struct CGroupIODeviceLimit { | |
68 | LIST_FIELDS(CGroupIODeviceLimit, device_limits); | |
69 | char *path; | |
9be57249 | 70 | uint64_t limits[_CGROUP_IO_LIMIT_TYPE_MAX]; |
13c31542 TH |
71 | }; |
72 | ||
4ad49000 LP |
73 | struct CGroupBlockIODeviceWeight { |
74 | LIST_FIELDS(CGroupBlockIODeviceWeight, device_weights); | |
75 | char *path; | |
d53d9474 | 76 | uint64_t weight; |
8e274523 LP |
77 | }; |
78 | ||
4ad49000 LP |
79 | struct CGroupBlockIODeviceBandwidth { |
80 | LIST_FIELDS(CGroupBlockIODeviceBandwidth, device_bandwidths); | |
81 | char *path; | |
979d0311 TH |
82 | uint64_t rbps; |
83 | uint64_t wbps; | |
4ad49000 | 84 | }; |
8e274523 | 85 | |
4ad49000 LP |
86 | struct CGroupContext { |
87 | bool cpu_accounting; | |
13c31542 | 88 | bool io_accounting; |
4ad49000 LP |
89 | bool blockio_accounting; |
90 | bool memory_accounting; | |
03a7b521 | 91 | bool tasks_accounting; |
6a48d82f | 92 | bool ip_accounting; |
8e274523 | 93 | |
13c31542 | 94 | /* For unified hierarchy */ |
66ebf6c0 TH |
95 | uint64_t cpu_weight; |
96 | uint64_t startup_cpu_weight; | |
97 | usec_t cpu_quota_per_sec_usec; | |
98 | ||
13c31542 TH |
99 | uint64_t io_weight; |
100 | uint64_t startup_io_weight; | |
101 | LIST_HEAD(CGroupIODeviceWeight, io_device_weights); | |
102 | LIST_HEAD(CGroupIODeviceLimit, io_device_limits); | |
103 | ||
da4d897e TH |
104 | uint64_t memory_low; |
105 | uint64_t memory_high; | |
106 | uint64_t memory_max; | |
96e131ea | 107 | uint64_t memory_swap_max; |
da4d897e | 108 | |
6a48d82f DM |
109 | LIST_HEAD(IPAddressAccessItem, ip_address_allow); |
110 | LIST_HEAD(IPAddressAccessItem, ip_address_deny); | |
111 | ||
13c31542 | 112 | /* For legacy hierarchies */ |
d53d9474 LP |
113 | uint64_t cpu_shares; |
114 | uint64_t startup_cpu_shares; | |
8e274523 | 115 | |
d53d9474 LP |
116 | uint64_t blockio_weight; |
117 | uint64_t startup_blockio_weight; | |
4ad49000 LP |
118 | LIST_HEAD(CGroupBlockIODeviceWeight, blockio_device_weights); |
119 | LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths); | |
246aa6dd | 120 | |
4ad49000 | 121 | uint64_t memory_limit; |
64747e2d | 122 | |
4ad49000 LP |
123 | CGroupDevicePolicy device_policy; |
124 | LIST_HEAD(CGroupDeviceAllow, device_allow); | |
a931ad47 | 125 | |
13c31542 | 126 | /* Common */ |
03a7b521 | 127 | uint64_t tasks_max; |
d53d9474 LP |
128 | |
129 | bool delegate; | |
02638280 | 130 | CGroupMask delegate_controllers; |
4ad49000 | 131 | }; |
64747e2d | 132 | |
906c06f6 DM |
133 | /* Used when querying IP accounting data */ |
134 | typedef enum CGroupIPAccountingMetric { | |
135 | CGROUP_IP_INGRESS_BYTES, | |
136 | CGROUP_IP_INGRESS_PACKETS, | |
137 | CGROUP_IP_EGRESS_BYTES, | |
138 | CGROUP_IP_EGRESS_PACKETS, | |
139 | _CGROUP_IP_ACCOUNTING_METRIC_MAX, | |
140 | _CGROUP_IP_ACCOUNTING_METRIC_INVALID = -1, | |
141 | } CGroupIPAccountingMetric; | |
142 | ||
71d35b6b | 143 | #include "unit.h" |
8e274523 | 144 | |
4ad49000 LP |
145 | void cgroup_context_init(CGroupContext *c); |
146 | void cgroup_context_done(CGroupContext *c); | |
147 | void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix); | |
bc432dc7 | 148 | |
efdb0237 | 149 | CGroupMask cgroup_context_get_mask(CGroupContext *c); |
fb385181 | 150 | |
4ad49000 | 151 | void cgroup_context_free_device_allow(CGroupContext *c, CGroupDeviceAllow *a); |
13c31542 TH |
152 | void cgroup_context_free_io_device_weight(CGroupContext *c, CGroupIODeviceWeight *w); |
153 | void cgroup_context_free_io_device_limit(CGroupContext *c, CGroupIODeviceLimit *l); | |
4ad49000 LP |
154 | void cgroup_context_free_blockio_device_weight(CGroupContext *c, CGroupBlockIODeviceWeight *w); |
155 | void cgroup_context_free_blockio_device_bandwidth(CGroupContext *c, CGroupBlockIODeviceBandwidth *b); | |
8e274523 | 156 | |
efdb0237 | 157 | CGroupMask unit_get_own_mask(Unit *u); |
02638280 | 158 | CGroupMask unit_get_delegate_mask(Unit *u); |
efdb0237 | 159 | CGroupMask unit_get_members_mask(Unit *u); |
02638280 | 160 | CGroupMask unit_get_siblings_mask(Unit *u); |
efdb0237 LP |
161 | CGroupMask unit_get_subtree_mask(Unit *u); |
162 | ||
163 | CGroupMask unit_get_target_mask(Unit *u); | |
164 | CGroupMask unit_get_enable_mask(Unit *u); | |
bc432dc7 | 165 | |
906c06f6 DM |
166 | bool unit_get_needs_bpf(Unit *u); |
167 | ||
bc432dc7 | 168 | void unit_update_cgroup_members_masks(Unit *u); |
efdb0237 LP |
169 | |
170 | char *unit_default_cgroup_path(Unit *u); | |
171 | int unit_set_cgroup_path(Unit *u, const char *path); | |
172 | ||
0a1eb06d | 173 | int unit_realize_cgroup(Unit *u); |
efdb0237 LP |
174 | void unit_release_cgroup(Unit *u); |
175 | void unit_prune_cgroup(Unit *u); | |
176 | int unit_watch_cgroup(Unit *u); | |
177 | ||
09e24654 LP |
178 | void unit_add_to_cgroup_empty_queue(Unit *u); |
179 | ||
7b3fd631 | 180 | int unit_attach_pids_to_cgroup(Unit *u); |
8e274523 | 181 | |
4ad49000 LP |
182 | int manager_setup_cgroup(Manager *m); |
183 | void manager_shutdown_cgroup(Manager *m, bool delete); | |
6dde1f33 | 184 | |
91a6073e | 185 | unsigned manager_dispatch_cgroup_realize_queue(Manager *m); |
4fbf50b3 | 186 | |
4ad49000 | 187 | Unit *manager_get_unit_by_cgroup(Manager *m, const char *cgroup); |
b3ac818b | 188 | Unit *manager_get_unit_by_pid_cgroup(Manager *m, pid_t pid); |
4ad49000 | 189 | Unit* manager_get_unit_by_pid(Manager *m, pid_t pid); |
8e274523 | 190 | |
efdb0237 LP |
191 | int unit_search_main_pid(Unit *u, pid_t *ret); |
192 | int unit_watch_all_pids(Unit *u); | |
8e274523 | 193 | |
5ad096b3 | 194 | int unit_get_memory_current(Unit *u, uint64_t *ret); |
03a7b521 | 195 | int unit_get_tasks_current(Unit *u, uint64_t *ret); |
5ad096b3 | 196 | int unit_get_cpu_usage(Unit *u, nsec_t *ret); |
906c06f6 DM |
197 | int unit_get_ip_accounting(Unit *u, CGroupIPAccountingMetric metric, uint64_t *ret); |
198 | ||
199 | int unit_reset_cpu_accounting(Unit *u); | |
200 | int unit_reset_ip_accounting(Unit *u); | |
5ad096b3 | 201 | |
2e4025c0 ZJS |
202 | #define UNIT_CGROUP_BOOL(u, name) \ |
203 | ({ \ | |
204 | CGroupContext *cc = unit_get_cgroup_context(u); \ | |
205 | cc ? cc->name : false; \ | |
206 | }) | |
e9db43d5 | 207 | |
efdb0237 LP |
208 | int manager_notify_cgroup_empty(Manager *m, const char *group); |
209 | ||
e7ab4d1a | 210 | void unit_invalidate_cgroup(Unit *u, CGroupMask m); |
906c06f6 | 211 | void unit_invalidate_cgroup_bpf(Unit *u); |
e7ab4d1a LP |
212 | |
213 | void manager_invalidate_startup_units(Manager *m); | |
214 | ||
4ad49000 LP |
215 | const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_; |
216 | CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_; |