]>
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 | ||
c1ff5570 TA |
10 | #include <stdbool.h> |
11 | ||
6a48d82f DM |
12 | #include "cgroup-util.h" |
13 | #include "ip-address-access.h" | |
4ad49000 | 14 | #include "list.h" |
c1ff5570 | 15 | #include "time-util.h" |
8e274523 | 16 | |
4ad49000 LP |
17 | typedef struct CGroupContext CGroupContext; |
18 | typedef struct CGroupDeviceAllow CGroupDeviceAllow; | |
13c31542 TH |
19 | typedef struct CGroupIODeviceWeight CGroupIODeviceWeight; |
20 | typedef struct CGroupIODeviceLimit CGroupIODeviceLimit; | |
4ad49000 LP |
21 | typedef struct CGroupBlockIODeviceWeight CGroupBlockIODeviceWeight; |
22 | typedef struct CGroupBlockIODeviceBandwidth CGroupBlockIODeviceBandwidth; | |
8e274523 | 23 | |
4ad49000 | 24 | typedef enum CGroupDevicePolicy { |
8e274523 | 25 | |
4ad49000 LP |
26 | /* When devices listed, will allow those, plus built-in ones, |
27 | if none are listed will allow everything. */ | |
28 | CGROUP_AUTO, | |
8e274523 | 29 | |
4ad49000 LP |
30 | /* Everything forbidden, except built-in ones and listed ones. */ |
31 | CGROUP_CLOSED, | |
9d58f1db | 32 | |
4ad49000 LP |
33 | /* Everythings forbidden, except for the listed devices */ |
34 | CGROUP_STRICT, | |
9d58f1db | 35 | |
4ad49000 LP |
36 | _CGROUP_DEVICE_POLICY_MAX, |
37 | _CGROUP_DEVICE_POLICY_INVALID = -1 | |
38 | } CGroupDevicePolicy; | |
8e274523 | 39 | |
4ad49000 LP |
40 | struct CGroupDeviceAllow { |
41 | LIST_FIELDS(CGroupDeviceAllow, device_allow); | |
42 | char *path; | |
43 | bool r:1; | |
44 | bool w:1; | |
45 | bool m:1; | |
46 | }; | |
8c6db833 | 47 | |
13c31542 TH |
48 | struct CGroupIODeviceWeight { |
49 | LIST_FIELDS(CGroupIODeviceWeight, device_weights); | |
50 | char *path; | |
51 | uint64_t weight; | |
52 | }; | |
53 | ||
54 | struct CGroupIODeviceLimit { | |
55 | LIST_FIELDS(CGroupIODeviceLimit, device_limits); | |
56 | char *path; | |
9be57249 | 57 | uint64_t limits[_CGROUP_IO_LIMIT_TYPE_MAX]; |
13c31542 TH |
58 | }; |
59 | ||
4ad49000 LP |
60 | struct CGroupBlockIODeviceWeight { |
61 | LIST_FIELDS(CGroupBlockIODeviceWeight, device_weights); | |
62 | char *path; | |
d53d9474 | 63 | uint64_t weight; |
8e274523 LP |
64 | }; |
65 | ||
4ad49000 LP |
66 | struct CGroupBlockIODeviceBandwidth { |
67 | LIST_FIELDS(CGroupBlockIODeviceBandwidth, device_bandwidths); | |
68 | char *path; | |
979d0311 TH |
69 | uint64_t rbps; |
70 | uint64_t wbps; | |
4ad49000 | 71 | }; |
8e274523 | 72 | |
4ad49000 LP |
73 | struct CGroupContext { |
74 | bool cpu_accounting; | |
13c31542 | 75 | bool io_accounting; |
4ad49000 LP |
76 | bool blockio_accounting; |
77 | bool memory_accounting; | |
03a7b521 | 78 | bool tasks_accounting; |
6a48d82f | 79 | bool ip_accounting; |
8e274523 | 80 | |
13c31542 | 81 | /* For unified hierarchy */ |
66ebf6c0 TH |
82 | uint64_t cpu_weight; |
83 | uint64_t startup_cpu_weight; | |
84 | usec_t cpu_quota_per_sec_usec; | |
85 | ||
13c31542 TH |
86 | uint64_t io_weight; |
87 | uint64_t startup_io_weight; | |
88 | LIST_HEAD(CGroupIODeviceWeight, io_device_weights); | |
89 | LIST_HEAD(CGroupIODeviceLimit, io_device_limits); | |
90 | ||
da4d897e TH |
91 | uint64_t memory_low; |
92 | uint64_t memory_high; | |
93 | uint64_t memory_max; | |
96e131ea | 94 | uint64_t memory_swap_max; |
da4d897e | 95 | |
6a48d82f DM |
96 | LIST_HEAD(IPAddressAccessItem, ip_address_allow); |
97 | LIST_HEAD(IPAddressAccessItem, ip_address_deny); | |
98 | ||
13c31542 | 99 | /* For legacy hierarchies */ |
d53d9474 LP |
100 | uint64_t cpu_shares; |
101 | uint64_t startup_cpu_shares; | |
8e274523 | 102 | |
d53d9474 LP |
103 | uint64_t blockio_weight; |
104 | uint64_t startup_blockio_weight; | |
4ad49000 LP |
105 | LIST_HEAD(CGroupBlockIODeviceWeight, blockio_device_weights); |
106 | LIST_HEAD(CGroupBlockIODeviceBandwidth, blockio_device_bandwidths); | |
246aa6dd | 107 | |
4ad49000 | 108 | uint64_t memory_limit; |
64747e2d | 109 | |
4ad49000 LP |
110 | CGroupDevicePolicy device_policy; |
111 | LIST_HEAD(CGroupDeviceAllow, device_allow); | |
a931ad47 | 112 | |
13c31542 | 113 | /* Common */ |
03a7b521 | 114 | uint64_t tasks_max; |
d53d9474 LP |
115 | |
116 | bool delegate; | |
02638280 | 117 | CGroupMask delegate_controllers; |
4ad49000 | 118 | }; |
64747e2d | 119 | |
906c06f6 DM |
120 | /* Used when querying IP accounting data */ |
121 | typedef enum CGroupIPAccountingMetric { | |
122 | CGROUP_IP_INGRESS_BYTES, | |
123 | CGROUP_IP_INGRESS_PACKETS, | |
124 | CGROUP_IP_EGRESS_BYTES, | |
125 | CGROUP_IP_EGRESS_PACKETS, | |
126 | _CGROUP_IP_ACCOUNTING_METRIC_MAX, | |
127 | _CGROUP_IP_ACCOUNTING_METRIC_INVALID = -1, | |
128 | } CGroupIPAccountingMetric; | |
129 | ||
90a8f0b9 FS |
130 | typedef struct Unit Unit; |
131 | typedef struct Manager Manager; | |
8e274523 | 132 | |
4ad49000 LP |
133 | void cgroup_context_init(CGroupContext *c); |
134 | void cgroup_context_done(CGroupContext *c); | |
135 | void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix); | |
bc432dc7 | 136 | |
efdb0237 | 137 | CGroupMask cgroup_context_get_mask(CGroupContext *c); |
fb385181 | 138 | |
4ad49000 | 139 | void cgroup_context_free_device_allow(CGroupContext *c, CGroupDeviceAllow *a); |
13c31542 TH |
140 | void cgroup_context_free_io_device_weight(CGroupContext *c, CGroupIODeviceWeight *w); |
141 | void cgroup_context_free_io_device_limit(CGroupContext *c, CGroupIODeviceLimit *l); | |
4ad49000 LP |
142 | void cgroup_context_free_blockio_device_weight(CGroupContext *c, CGroupBlockIODeviceWeight *w); |
143 | void cgroup_context_free_blockio_device_bandwidth(CGroupContext *c, CGroupBlockIODeviceBandwidth *b); | |
8e274523 | 144 | |
efdb0237 | 145 | CGroupMask unit_get_own_mask(Unit *u); |
02638280 | 146 | CGroupMask unit_get_delegate_mask(Unit *u); |
efdb0237 | 147 | CGroupMask unit_get_members_mask(Unit *u); |
02638280 | 148 | CGroupMask unit_get_siblings_mask(Unit *u); |
efdb0237 LP |
149 | CGroupMask unit_get_subtree_mask(Unit *u); |
150 | ||
151 | CGroupMask unit_get_target_mask(Unit *u); | |
152 | CGroupMask unit_get_enable_mask(Unit *u); | |
bc432dc7 | 153 | |
906c06f6 DM |
154 | bool unit_get_needs_bpf(Unit *u); |
155 | ||
bc432dc7 | 156 | void unit_update_cgroup_members_masks(Unit *u); |
efdb0237 | 157 | |
6592b975 | 158 | const char *unit_get_realized_cgroup_path(Unit *u, CGroupMask mask); |
efdb0237 LP |
159 | char *unit_default_cgroup_path(Unit *u); |
160 | int unit_set_cgroup_path(Unit *u, const char *path); | |
a4634b21 | 161 | int unit_pick_cgroup_path(Unit *u); |
efdb0237 | 162 | |
0a1eb06d | 163 | int unit_realize_cgroup(Unit *u); |
efdb0237 LP |
164 | void unit_release_cgroup(Unit *u); |
165 | void unit_prune_cgroup(Unit *u); | |
166 | int unit_watch_cgroup(Unit *u); | |
167 | ||
09e24654 LP |
168 | void unit_add_to_cgroup_empty_queue(Unit *u); |
169 | ||
6592b975 | 170 | int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path); |
8e274523 | 171 | |
4ad49000 LP |
172 | int manager_setup_cgroup(Manager *m); |
173 | void manager_shutdown_cgroup(Manager *m, bool delete); | |
6dde1f33 | 174 | |
91a6073e | 175 | unsigned manager_dispatch_cgroup_realize_queue(Manager *m); |
4fbf50b3 | 176 | |
4ad49000 | 177 | Unit *manager_get_unit_by_cgroup(Manager *m, const char *cgroup); |
b3ac818b | 178 | Unit *manager_get_unit_by_pid_cgroup(Manager *m, pid_t pid); |
4ad49000 | 179 | Unit* manager_get_unit_by_pid(Manager *m, pid_t pid); |
8e274523 | 180 | |
efdb0237 LP |
181 | int unit_search_main_pid(Unit *u, pid_t *ret); |
182 | int unit_watch_all_pids(Unit *u); | |
8e274523 | 183 | |
11aef522 LP |
184 | int unit_synthesize_cgroup_empty_event(Unit *u); |
185 | ||
5ad096b3 | 186 | int unit_get_memory_current(Unit *u, uint64_t *ret); |
03a7b521 | 187 | int unit_get_tasks_current(Unit *u, uint64_t *ret); |
5ad096b3 | 188 | int unit_get_cpu_usage(Unit *u, nsec_t *ret); |
906c06f6 DM |
189 | int unit_get_ip_accounting(Unit *u, CGroupIPAccountingMetric metric, uint64_t *ret); |
190 | ||
191 | int unit_reset_cpu_accounting(Unit *u); | |
192 | int unit_reset_ip_accounting(Unit *u); | |
5ad096b3 | 193 | |
2e4025c0 ZJS |
194 | #define UNIT_CGROUP_BOOL(u, name) \ |
195 | ({ \ | |
196 | CGroupContext *cc = unit_get_cgroup_context(u); \ | |
197 | cc ? cc->name : false; \ | |
198 | }) | |
e9db43d5 | 199 | |
cc6271f1 | 200 | bool manager_owns_root_cgroup(Manager *m); |
f3725e64 LP |
201 | bool unit_has_root_cgroup(Unit *u); |
202 | ||
efdb0237 LP |
203 | int manager_notify_cgroup_empty(Manager *m, const char *group); |
204 | ||
e7ab4d1a | 205 | void unit_invalidate_cgroup(Unit *u, CGroupMask m); |
906c06f6 | 206 | void unit_invalidate_cgroup_bpf(Unit *u); |
e7ab4d1a LP |
207 | |
208 | void manager_invalidate_startup_units(Manager *m); | |
209 | ||
4ad49000 LP |
210 | const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_; |
211 | CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_; | |
1d9cc876 LP |
212 | |
213 | bool unit_cgroup_delegate(Unit *u); |