info(" -b Ignore default systemd");
info("delegate hierarchy\n");
info(" -c, --scope Create a delegated systemd scope\n");
+ info(" -p, --pid=pid Task pid to use to create systemd ");
+ info("scope\n");
info(" -S, --setdefault Set this scope as the default scope ");
info("delegate hierarchy\n");
#endif
#ifdef WITH_SYSTEMD
static int create_systemd_scope(struct cgroup * const cg, const char * const prog_name,
- int set_default)
+ int set_default, pid_t pid)
{
struct cgroup_systemd_scope_opts opts;
char slice[FILENAME_MAX];
if (ret)
return ret;
+ opts.pid = pid;
+
ret = cgroup_create_scope2(cg, 0, &opts);
if (!ret && set_default) {
scope = strstr(cg->name, "/");
#ifdef WITH_SYSTEMD
{"scope", no_argument, NULL, 'c'},
{"setdefault", no_argument, NULL, 'S'},
+ {"pid", required_argument, NULL, 'p'},
#endif /* WITH_SYSTEMD */
{0, 0, 0, 0},
};
gid_t tgid = CGRULE_INVALID, agid = CGRULE_INVALID;
int ignore_default_systemd_delegate_slice = 0;
- int create_scope = 0;
int set_default_scope = 0;
+ int create_scope = 0;
+ pid_t scope_pid = -1;
struct cgroup_group_spec **cgroup_list;
struct cgroup_controller *cgc;
#ifdef WITH_SYSTEMD
/* parse arguments */
- while ((c = getopt_long(argc, argv, "a:t:g:hd:f:s:bcS", long_opts, NULL)) > 0) {
+ while ((c = getopt_long(argc, argv, "a:t:g:hd:f:s:bcp:S", long_opts, NULL)) > 0) {
switch (c) {
case 'b':
ignore_default_systemd_delegate_slice = 1;
case 'c':
create_scope = 1;
break;
+ case 'p':
+ scope_pid = atoi(optarg);
+ if (scope_pid <= 1) {
+ err("%s: Invalid pid %s\n", argv[0], optarg);
+ ret = EXIT_BADARGS;
+ goto err;
+ }
+ break;
case 'S':
set_default_scope = 1;
break;
ret = EXIT_BADARGS;
goto err;
}
+
+ if (!create_scope && scope_pid != -1) {
+ err("%s: \"-p\" requires \"-c\" to be provided\n", argv[0]);
+ ret = EXIT_BADARGS;
+ goto err;
+ }
#endif
/* no cgroup name */
cgroup_set_permissions(cgroup, dir_mode, file_mode, tasks_mode);
if (create_scope) {
- ret = create_systemd_scope(cgroup, argv[0], set_default_scope);
+ ret = create_systemd_scope(cgroup, argv[0], set_default_scope, scope_pid);
} else {
ret = cgroup_create_cgroup(cgroup, 0);
}