1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
|
From 167af3ce0cff3906c9976b249432d41167b15eb2 Mon Sep 17 00:00:00 2001
From: jikai <jikai11@huawei.com>
Date: Thu, 11 Jan 2024 17:06:57 +0800
Subject: [PATCH 24/43] add support for systemd cgroup driver
Signed-off-by: jikai <jikai11@huawei.com>
---
src/cmd/isulad-shim/process.c | 6 +
src/cmd/isulad/isulad_commands.h | 2 +
src/contrib/config/daemon.json | 3 +-
src/daemon/common/cgroup.h | 4 +
src/daemon/common/cgroup_v1.c | 116 ++++++++++++++++++
src/daemon/config/isulad_config.c | 23 ++++
src/daemon/config/isulad_config.h | 2 +
.../cri/v1/cri_v1_runtime_runtime_service.cc | 25 ++++
.../cri/v1/cri_v1_runtime_runtime_service.h | 4 +
.../cri/v1/v1_cri_runtime_manager_service.cc | 12 ++
.../cri/v1/v1_cri_runtime_manager_service.h | 2 +
.../entry/cri/v1/v1_cri_runtime_service.h | 2 +
.../cri/v1/v1_cri_runtime_service_impl.cc | 5 +
.../cri/v1/v1_cri_runtime_service_impl.h | 2 +
src/daemon/executor/container_cb/execution.c | 26 ++++
.../modules/runtime/engines/lcr/lcr_rt_ops.c | 7 ++
.../modules/runtime/isula/isula_rt_ops.c | 1 +
src/daemon/modules/runtime/shim/shim_rt_ops.c | 6 +
src/daemon/modules/spec/specs.c | 22 +++-
19 files changed, 268 insertions(+), 2 deletions(-)
diff --git a/src/cmd/isulad-shim/process.c b/src/cmd/isulad-shim/process.c
index bf67c414..8a4ca175 100644
--- a/src/cmd/isulad-shim/process.c
+++ b/src/cmd/isulad-shim/process.c
@@ -1287,6 +1287,12 @@ static void get_runtime_cmd(process_t *p, const char *log_path, const char *pid_
params[i++] = p->state->cwd;
}
} else {
+ // the --systemd-cgroup argument is not in oci spec, but up to now,
+ // the latest version of runc, crun, youki, runsc, kata-runtime all support this argument
+ // should ensure that this is supported for oci runtime
+ if (p->state->systemd_cgroup) {
+ params[i++] = "--systemd-cgroup";
+ }
params[i++] = "create";
params[i++] = "--bundle";
params[i++] = p->bundle;
diff --git a/src/cmd/isulad/isulad_commands.h b/src/cmd/isulad/isulad_commands.h
index ba4b838d..cf5f65f5 100644
--- a/src/cmd/isulad/isulad_commands.h
+++ b/src/cmd/isulad/isulad_commands.h
@@ -226,6 +226,8 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
&(cmdargs)->json_confs->storage_opts, \
"Storage driver options", \
command_append_array }, \
+ { CMD_OPT_TYPE_BOOL, false, "systemd-cgroup", 0, &(cmdargs)->json_confs->systemd_cgroup, \
+ "Use systemd cgroup driver(default false)", NULL }, \
SUP_GROUPS_OPT(cmdargs) \
{ CMD_OPT_TYPE_CALLBACK, \
false, \
diff --git a/src/contrib/config/daemon.json b/src/contrib/config/daemon.json
index 966e016a..69362c26 100644
--- a/src/contrib/config/daemon.json
+++ b/src/contrib/config/daemon.json
@@ -36,5 +36,6 @@
"cri-runtimes": {
"kata": "io.containerd.kata.v2"
},
- "enable-cri-v1": false
+ "enable-cri-v1": false,
+ "systemd-cgroup": false
}
diff --git a/src/daemon/common/cgroup.h b/src/daemon/common/cgroup.h
index 6664fb15..fa20f42c 100644
--- a/src/daemon/common/cgroup.h
+++ b/src/daemon/common/cgroup.h
@@ -141,6 +141,10 @@ typedef struct {
int common_get_cgroup_v1_metrics(const char *cgroup_path, cgroup_metrics_t *cgroup_metrics);
+char *common_get_init_cgroup(const char *subsystem);
+
+char *common_get_own_cgroup(const char *subsystem);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/daemon/common/cgroup_v1.c b/src/daemon/common/cgroup_v1.c
index 9004becc..e38fc03e 100644
--- a/src/daemon/common/cgroup_v1.c
+++ b/src/daemon/common/cgroup_v1.c
@@ -554,3 +554,119 @@ int common_get_cgroup_v1_metrics(const char *cgroup_path, cgroup_metrics_t *cgro
return 0;
}
+/* parse cgroup files, such as /proc/self/cgroup or /proc/1/cgroup */
+static int parse_cgroup_file(const char *path, char ***nlist, char ***plist)
+{
+ int ret = 0;
+ size_t length = 0;
+ __isula_auto_file FILE *fp = NULL;
+ __isula_auto_free char *pline = NULL;
+
+ fp = util_fopen(path, "r");
+ if (fp == NULL) {
+ return -1;
+ }
+
+ while (getline(&pline, &length, fp) != -1) {
+ char *pos = NULL;
+ char *pos2 = NULL;
+ char *pos3 = NULL;
+ char *ptoken = NULL;
+ char *psave = NULL;
+ pos = strchr(pline, ':');
+ if (pos == NULL) {
+ ERROR("Invalid cgroup entry: must contain at least two colons: %s", pline);
+ ret = -1;
+ goto out;
+ }
+ pos++;
+ pos2 = strchr(pos, ':');
+ if (pos2 == NULL) {
+ ERROR("Invalid cgroup entry: must contain at least two colons: %s", pline);
+ ret = -1;
+ goto out;
+ }
+ pos3 = strchr(pos2, '\n');
+ if (pos3 != NULL) {
+ *pos3 = '\0';
+ }
+ *pos2 = '\0';
+
+ if ((pos2 - pos) == 0) {
+ INFO("Cgroup entry: %s not supported by cgroup v1", pline);
+ continue;
+ }
+
+ for (ptoken = strtok_r(pos, ",", &psave); ptoken; ptoken = strtok_r(NULL, ",", &psave)) {
+ ret = util_array_append(nlist, ptoken);
+ if (ret != 0) {
+ ERROR("Failed to append string");
+ goto out;
+ }
+
+ ret = util_array_append(plist, pos2 + 1);
+ if (ret != 0) {
+ ERROR("Failed to append string");
+ goto out;
+ }
+ }
+ }
+
+out:
+ if (ret != 0) {
+ util_free_array(*nlist);
+ *nlist = NULL;
+ util_free_array(*plist);
+ *plist = NULL;
+ }
+ return ret;
+}
+
+static char *common_get_cgroup_path(const char *path, const char *subsystem)
+{
+ char **nlist = NULL, **plist = NULL;
+ size_t i = 0;
+ char *res = NULL;
+ if (path == NULL) {
+ ERROR("Invalid NULL param");
+ return NULL;
+ }
+
+ if (parse_cgroup_file(path, &nlist, &plist) < 0) {
+ return NULL;
+ }
+
+ for (i = 0; i < util_array_len((const char **)nlist); i++) {
+ const char *prefix = "name=";
+ bool find_sub = (strcmp(nlist[i], subsystem) == 0 || (strncmp(nlist[i], prefix, strlen(prefix)) == 0
+ && strcmp(nlist[i]+strlen(prefix), subsystem) == 0));
+ if (find_sub) {
+ res = util_strdup_s(plist[i]);
+ break;
+ }
+ }
+
+ util_free_array(nlist);
+ util_free_array(plist);
+ return res;
+}
+
+char *common_get_init_cgroup(const char *subsystem)
+{
+ if (common_get_cgroup_version() != CGROUP_VERSION_1) {
+ ERROR("Not implemented for cgroup v2 hierarchy");
+ return NULL;
+ }
+
+ return common_get_cgroup_path("/proc/1/cgroup", subsystem);
+}
+
+char *common_get_own_cgroup(const char *subsystem)
+{
+ if (common_get_cgroup_version() != CGROUP_VERSION_1) {
+ ERROR("Not implemented for cgroup v2 hierarchy");
+ return NULL;
+ }
+
+ return common_get_cgroup_path("/proc/self/cgroup", subsystem);
+}
diff --git a/src/daemon/config/isulad_config.c b/src/daemon/config/isulad_config.c
index 51758adb..8179558e 100644
--- a/src/daemon/config/isulad_config.c
+++ b/src/daemon/config/isulad_config.c
@@ -1762,6 +1762,8 @@ int merge_json_confs_into_global(struct service_arguments *args)
args->json_confs->enable_cri_v1 = tmp_json_confs->enable_cri_v1;
#endif
+ args->json_confs->systemd_cgroup = tmp_json_confs->systemd_cgroup;
+
if (merge_cri_runtimes_into_global(args, tmp_json_confs)) {
ret = -1;
goto out;
@@ -1895,3 +1897,24 @@ isulad_daemon_constants *get_isulad_daemon_constants(void)
{
return g_isulad_daemon_constants;
}
+
+bool conf_get_systemd_cgroup()
+{
+ bool systemd_cgroup = false;
+ struct service_arguments *conf = NULL;
+
+ if (isulad_server_conf_rdlock() != 0) {
+ return false;
+ }
+
+ conf = conf_get_server_conf();
+ if (conf == NULL || conf->json_confs == NULL) {
+ goto out;
+ }
+
+ systemd_cgroup = conf->json_confs->systemd_cgroup;
+
+out:
+ (void)isulad_server_conf_unlock();
+ return systemd_cgroup;
+}
diff --git a/src/daemon/config/isulad_config.h b/src/daemon/config/isulad_config.h
index 459ea331..f29cd564 100644
--- a/src/daemon/config/isulad_config.h
+++ b/src/daemon/config/isulad_config.h
@@ -114,6 +114,8 @@ char *conf_get_isulad_monitor_fifo_path(void);
int init_isulad_daemon_constants(void);
isulad_daemon_constants *get_isulad_daemon_constants(void);
+bool conf_get_systemd_cgroup(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.cc b/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.cc
index ba9459f6..76e393f3 100644
--- a/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.cc
+++ b/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.cc
@@ -632,3 +632,28 @@ grpc::Status RuntimeV1RuntimeServiceImpl::Status(grpc::ServerContext *context,
return grpc::Status::OK;
}
+
+grpc::Status
+RuntimeV1RuntimeServiceImpl::RuntimeConfig(grpc::ServerContext *context,
+ const runtime::v1::RuntimeConfigRequest *request,
+ runtime::v1::RuntimeConfigResponse *reply)
+{
+ Errors error;
+
+ if (request == nullptr) {
+ ERROR("Invalid input arguments");
+ return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "Invalid input arguments");
+ }
+
+ EVENT("Event: {Object: CRI, Type: Runtime Config}");
+
+ m_rService->RuntimeConfig(reply, error);
+ if (!error.Empty()) {
+ ERROR("Object: CRI, Type: Failed to get runtime config:%s", error.GetMessage().c_str());
+ return grpc::Status(grpc::StatusCode::UNKNOWN, error.GetMessage());
+ }
+
+ EVENT("Event: {Object: CRI, Type: Runtime Config}");
+
+ return grpc::Status::OK;
+}
diff --git a/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.h b/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.h
index 09ebe68b..52cc6b99 100644
--- a/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.h
+++ b/src/daemon/entry/connect/grpc/cri/v1/cri_v1_runtime_runtime_service.h
@@ -101,6 +101,10 @@ public:
grpc::Status Status(grpc::ServerContext *context, const runtime::v1::StatusRequest *request,
runtime::v1::StatusResponse *reply) override;
+ grpc::Status RuntimeConfig(grpc::ServerContext *context,
+ const runtime::v1::RuntimeConfigRequest *request,
+ runtime::v1::RuntimeConfigResponse *reply) override;
+
private:
std::unique_ptr<CRIV1::CRIRuntimeService> m_rService;
};
diff --git a/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.cc b/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.cc
index 1afac3e2..de489aae 100644
--- a/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.cc
+++ b/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.cc
@@ -16,6 +16,7 @@
#include "isula_libutils/log.h"
#include "v1_cri_helpers.h"
#include "cri_helpers.h"
+#include "isulad_config.h"
namespace CRIV1 {
void RuntimeManagerService::UpdateRuntimeConfig(const runtime::v1::RuntimeConfig &config, Errors & /*error*/)
@@ -69,4 +70,15 @@ auto RuntimeManagerService::Status(Errors &error) -> std::unique_ptr<runtime::v1
return status;
}
+void RuntimeManagerService::RuntimeConfig(runtime::v1::RuntimeConfigResponse *reply, Errors &error)
+{
+ if (reply == nullptr) {
+ ERROR("Invaliad params");
+ error.SetError("Invalid params");
+ return;
+ }
+
+ reply->mutable_linux()->set_cgroup_driver(conf_get_systemd_cgroup() ? runtime::v1::SYSTEMD : runtime::v1::CGROUPFS);
+}
+
} // namespace CRI
diff --git a/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.h b/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.h
index 3800ec30..2160064e 100644
--- a/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.h
+++ b/src/daemon/entry/cri/v1/v1_cri_runtime_manager_service.h
@@ -39,6 +39,8 @@ public:
auto Status(Errors &error) -> std::unique_ptr<runtime::v1::RuntimeStatus>;
+ void RuntimeConfig(runtime::v1::RuntimeConfigResponse *reply, Errors &error);
+
private:
service_executor_t *m_cb;
std::shared_ptr<Network::PluginManager> m_pluginManager;
diff --git a/src/daemon/entry/cri/v1/v1_cri_runtime_service.h b/src/daemon/entry/cri/v1/v1_cri_runtime_service.h
index 87394173..839f6724 100644
--- a/src/daemon/entry/cri/v1/v1_cri_runtime_service.h
+++ b/src/daemon/entry/cri/v1/v1_cri_runtime_service.h
@@ -89,6 +89,8 @@ public:
virtual void UpdateRuntimeConfig(const runtime::v1::RuntimeConfig &config, Errors &error) = 0;
virtual auto Status(Errors &error) -> std::unique_ptr<runtime::v1::RuntimeStatus> = 0;
+
+ virtual void RuntimeConfig(runtime::v1::RuntimeConfigResponse *reply, Errors &error) = 0;
};
} // namespace CRIV1
#endif // DAEMON_ENTRY_CRI_V1_CRI_RUNTIME_SERVICE_INTERFACE_H
diff --git a/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.cc b/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.cc
index 67cda5ed..aa5ae516 100644
--- a/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.cc
+++ b/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.cc
@@ -161,4 +161,9 @@ auto CRIRuntimeServiceImpl::Status(Errors &error) -> std::unique_ptr<runtime::v1
return m_runtimeManager->Status(error);
}
+void CRIRuntimeServiceImpl::RuntimeConfig(runtime::v1::RuntimeConfigResponse *reply, Errors &error)
+{
+ m_runtimeManager->RuntimeConfig(reply, error);
+}
+
} // namespace CRIV1
diff --git a/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.h b/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.h
index 23866648..0a25749f 100644
--- a/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.h
+++ b/src/daemon/entry/cri/v1/v1_cri_runtime_service_impl.h
@@ -92,6 +92,8 @@ public:
auto Status(Errors &error) -> std::unique_ptr<runtime::v1::RuntimeStatus> override;
+ void RuntimeConfig(runtime::v1::RuntimeConfigResponse *reply, Errors &error) override;
+
protected:
std::unique_ptr<RuntimeVersionerService> m_runtimeVersioner;
std::unique_ptr<ContainerManagerService> m_containerManager;
diff --git a/src/daemon/executor/container_cb/execution.c b/src/daemon/executor/container_cb/execution.c
index 63d8143c..7ed8e837 100644
--- a/src/daemon/executor/container_cb/execution.c
+++ b/src/daemon/executor/container_cb/execution.c
@@ -427,6 +427,32 @@ static int cpurt_controller_init(const char *id, const host_config *host_spec)
return 0;
}
+ if (conf_get_systemd_cgroup()) {
+ // currently it is the same as docker, yet it is unclear that
+ // if systemd cgroup is used and cgroup parent is set to a slice rather than system.slice
+ // should iSulad set cpu.rt_runtime_us and cpu.rt_period_us for the parent path?
+ // in fact, even if system.slice is used,
+ // cpu.rt_runtime_us and cpu.rt_period_us might still needed to be set manually
+ __isula_auto_free char *init_cgroup = common_get_init_cgroup("cpu");
+ if (init_cgroup == NULL) {
+ ERROR("Failed to get init cgroup");
+ return -1;
+ }
+ // make sure that the own cgroup path for cpu existed
+ __isula_auto_free char *own_cgroup = common_get_own_cgroup("cpu");
+ if (own_cgroup == NULL) {
+ ERROR("Failed to get own cgroup");
+ return -1;
+ }
+ char *new_cgroups_path = util_path_join(init_cgroup, cgroups_path);
+ if (new_cgroups_path == NULL) {
+ ERROR("Failed to join path");
+ return -1;
+ }
+ free(cgroups_path);
+ cgroups_path = new_cgroups_path;
+ }
+
mnt_root = sysinfo_cgroup_controller_cpurt_mnt_path();
if (mnt_root == NULL) {
ERROR("Failed to get cpu rt controller mnt root path");
diff --git a/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c b/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c
index 8c3c5f1a..6b862958 100644
--- a/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c
+++ b/src/daemon/modules/runtime/engines/lcr/lcr_rt_ops.c
@@ -53,6 +53,13 @@ int rt_lcr_create(const char *name, const char *runtime, const rt_create_params_
char *runtime_root = NULL;
struct engine_operation *engine_ops = NULL;
+ if (conf_get_systemd_cgroup()) {
+ ERROR("Systemd cgroup not supported for lcr runtime");
+ isulad_set_error_message("Systemd cgroup not supported for lcr runtime");
+ ret = -1;
+ goto out;
+ }
+
runtime_root = conf_get_routine_rootdir(runtime);
if (runtime_root == NULL) {
ERROR("Root path is NULL");
diff --git a/src/daemon/modules/runtime/isula/isula_rt_ops.c b/src/daemon/modules/runtime/isula/isula_rt_ops.c
index 745154bb..b9aba3e3 100644
--- a/src/daemon/modules/runtime/isula/isula_rt_ops.c
+++ b/src/daemon/modules/runtime/isula/isula_rt_ops.c
@@ -1157,6 +1157,7 @@ int rt_isula_create(const char *id, const char *runtime, const rt_create_params_
p.runtime_args = (char **)runtime_args;
p.runtime_args_len = runtime_args_len;
p.attach_socket = attach_socket;
+ p.systemd_cgroup = conf_get_systemd_cgroup();
copy_process(&p, config->process);
copy_annotations(&p, config->annotations);
diff --git a/src/daemon/modules/runtime/shim/shim_rt_ops.c b/src/daemon/modules/runtime/shim/shim_rt_ops.c
index 81daf224..fc4d8e3a 100644
--- a/src/daemon/modules/runtime/shim/shim_rt_ops.c
+++ b/src/daemon/modules/runtime/shim/shim_rt_ops.c
@@ -35,6 +35,7 @@
#include "engine.h"
#include "shim_rt_monitor.h"
#include "supervisor.h"
+#include "isulad_config.h"
#define EXIT_SIGNAL_OFFSET_X 128
@@ -370,6 +371,11 @@ int rt_shim_create(const char *id, const char *runtime, const rt_create_params_t
return -1;
}
+ if (conf_get_systemd_cgroup()) {
+ ERROR("ShimV2 does not support systemd cgroup yet");
+ return -1;
+ }
+
exit_fifo_path = util_path_dir(params->exit_fifo);
if (exit_fifo_path == NULL) {
ERROR("%s: failed to get exit fifo dir from %s", id, params->exit_fifo);
diff --git a/src/daemon/modules/spec/specs.c b/src/daemon/modules/spec/specs.c
index 464b4fb4..b4d2b0f6 100644
--- a/src/daemon/modules/spec/specs.c
+++ b/src/daemon/modules/spec/specs.c
@@ -188,7 +188,10 @@ static char *do_get_container_cgroup_path(const host_config *host_spec)
}
if (path == NULL) {
- // third, all faild, just use default '/isulad'
+ // third, all faild, just use default '/isulad' for cgroupfs or "system.slice" for systemd
+ if (conf_get_systemd_cgroup()) {
+ return util_strdup_s("system.slice");
+ }
path = util_strdup_s("/isulad");
}
@@ -2288,6 +2291,23 @@ char *merge_container_cgroups_path(const char *id, const host_config *host_spec)
path = do_get_container_cgroup_path(host_spec);
+ if (conf_get_systemd_cgroup()) {
+ // systemd cgroup path has the form of [slice]:[prefix]:[name]
+#define SYSTEMD_CGROUP_PATH_LEN 3
+ if (!util_has_suffix(path, ".slice")) {
+ ERROR("Invalid cgroup path %s for systemd", path);
+ isulad_set_error_message("Invalid cgroup path %s for systemd", path);
+ return NULL;
+ }
+
+ // slice must not contain slashes
+ // convert test.slice/test-a.slice/test-a-b.slice to become test-a-b.slice
+ __isula_auto_free char *base = util_path_base(path);
+ const char *isulad_prefix = "isulad";
+ const char *parts[SYSTEMD_CGROUP_PATH_LEN] = {base, isulad_prefix, id};
+ return util_string_join(":", parts, SYSTEMD_CGROUP_PATH_LEN);
+ }
+
return util_path_join(path, id);
}
--
2.34.1
|