Enhance the cgexec tool to support default systemd delegation
slice/scope, if set in the cgconfig.conf's systemd setting. Parse the
configuration file and read the systemd::delegate setting, if any, and
set it as the default systemd slice/scope in
systemd_default_cgroup. Setting it appends the slice/scope
name to the constructed default cgroup mount path.
When the user passes the relative cgroup name, its appends to the
sub-tree (delegated slice/scope) by default and if the user wishes to
create a cgroup in another subtree or cgroup root hierarchy, they need
to use the absolute path. For example:
cgroup_root
/ \
/ \
systemd.slice* cgrp1
|
systemd.scope
|
cgrp-d1
* default system delegation slice/scope - read from cgconfig.conf
$ sudo cgexec -g cpu:cgrp-d1 sleep 10
will create the cgroup under the cpu controller hirearchy
cgroup_root:systemd_default_cgroup:cgrp-d1
and for creating a cgroup cgrp1, the user can use:
$ sudo cgexec -g cpu:/cgrp1 sleep 10
or use the newly introduced -b switch to ignore the systemd slice/scope:
$ sudo cgexec -b -g cpu:cgrp1 sleep 10
Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
(cherry picked from commit
bad8137c6d7741ecd5ff48cfd7ede2ceabde93ea)
info(" -h, --help Display this help\n");
info(" --sticky cgred daemon does not ");
info("change pidlist and children tasks\n");
+#ifdef WITH_SYSTEMD
+ info(" -b Ignore default systemd delegate hierarchy\n");
+#endif
}
int main(int argc, char *argv[])
{
struct cgroup_group_spec *cgroup_list[CG_HIER_MAX];
+ int ignore_default_systemd_delegate_slice = 0;
int cg_specified = 0;
int flag_child = 0;
int i, ret = 0;
int c;
memset(cgroup_list, 0, sizeof(cgroup_list));
-
+#ifdef WITH_SYSTEMD
+ while ((c = getopt_long(argc, argv, "+g:shb", longopts, NULL)) > 0) {
+ switch (c) {
+ case 'b':
+ ignore_default_systemd_delegate_slice = 1;
+ break;
+#else
while ((c = getopt_long(argc, argv, "+g:sh", longopts, NULL)) > 0) {
switch (c) {
+#endif
case 'g':
ret = parse_cgroup_spec(cgroup_list, optarg, CG_HIER_MAX);
if (ret) {
return ret;
}
+ /* this is false always for disable-systemd */
+ if (!ignore_default_systemd_delegate_slice)
+ cgroup_set_default_systemd_cgroup();
+
/* Just for debugging purposes. */
uid = geteuid();
gid = getegid();