]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/cgroups/cgroup.c
2e9670e3b190b015a6b33c727f38a3fc7acf61ff
1 /* SPDX-License-Identifier: LGPL-2.1+ */
12 #include "cgroup2_devices.h"
15 #include "initutils.h"
19 lxc_log_define(cgroup
, lxc
);
21 extern struct cgroup_ops
*cgfsng_ops_init(struct lxc_conf
*conf
);
23 struct cgroup_ops
*cgroup_init(struct lxc_conf
*conf
)
25 struct cgroup_ops
*cgroup_ops
;
28 return log_error_errno(NULL
, EINVAL
, "No valid conf given");
30 cgroup_ops
= cgfsng_ops_init(conf
);
32 return log_error_errno(NULL
, errno
, "Failed to initialize cgroup driver");
34 if (cgroup_ops
->data_init(cgroup_ops
)) {
35 cgroup_exit(cgroup_ops
);
36 return log_error_errno(NULL
, errno
,
37 "Failed to initialize cgroup data");
40 TRACE("Initialized cgroup driver %s", cgroup_ops
->driver
);
42 if (cgroup_ops
->cgroup_layout
== CGROUP_LAYOUT_LEGACY
)
43 TRACE("Running with legacy cgroup layout");
44 else if (cgroup_ops
->cgroup_layout
== CGROUP_LAYOUT_HYBRID
)
45 TRACE("Running with hybrid cgroup layout");
46 else if (cgroup_ops
->cgroup_layout
== CGROUP_LAYOUT_UNIFIED
)
47 TRACE("Running with unified cgroup layout");
49 WARN("Running with unknown cgroup layout");
54 void cgroup_exit(struct cgroup_ops
*ops
)
57 struct hierarchy
**it
;
62 for (cur
= ops
->cgroup_use
; cur
&& *cur
; cur
++)
65 free(ops
->cgroup_pattern
);
66 free(ops
->container_cgroup
);
67 free(ops
->monitor_cgroup
);
69 if (ops
->cgroup2_devices
)
70 bpf_program_free(ops
->cgroup2_devices
);
72 for (it
= ops
->hierarchies
; it
&& *it
; it
++) {
75 for (p
= (*it
)->controllers
; p
&& *p
; p
++)
77 free((*it
)->controllers
);
79 for (p
= (*it
)->cgroup2_chown
; p
&& *p
; p
++)
81 free((*it
)->cgroup2_chown
);
83 free((*it
)->mountpoint
);
84 free((*it
)->container_base_path
);
85 free((*it
)->container_full_path
);
86 free((*it
)->monitor_full_path
);
87 if ((*it
)->cgfd_mon
>= 0)
88 close((*it
)->cgfd_con
);
89 if ((*it
)->cgfd_mon
>= 0)
90 close((*it
)->cgfd_mon
);
93 free(ops
->hierarchies
);
100 #define INIT_SCOPE "/init.scope"
101 void prune_init_scope(char *cg
)
108 point
= cg
+ strlen(cg
) - strlen(INIT_SCOPE
);
112 if (strcmp(point
, INIT_SCOPE
) == 0) {