return ret;
}
-static int cgroup_attach_task_tid(struct cgroup *cgroup, pid_t tid)
+static int cgroup_v1_build_procs_path(const char * const ctrl_name, char *path)
+{
+ enum cg_version_t version;
+ size_t len;
+ int ret;
+
+ ret = cgroup_get_controller_version(ctrl_name, &version);
+ if (ret)
+ return ret;
+
+ if (version != CGROUP_V1)
+ return ret;
+
+ /* replace tasks with cgroup.procs file name in the path */
+ len = strlen(path) - 5;
+ path[len] = '\0';
+
+ strncat(path, "cgroup.procs", FILENAME_MAX - (len + 1));
+ path[FILENAME_MAX - 1] = '\0';
+
+ return ret;
+}
+
+static int cgroup_attach_task_tid(struct cgroup *cgroup, pid_t tid, bool move_tids)
{
char path[FILENAME_MAX] = {0};
- char *controller_name;
+ char *controller_name = NULL;
int empty_cgroup = 0;
int i, ret = 0;
if (ret)
return ret;
+ if (move_tids) {
+ ret = cgroup_v1_build_procs_path(controller_name, path);
+ if (ret)
+ return ret;
+ }
+
ret = __cgroup_attach_task_pid(path, tid);
if (ret) {
pthread_rwlock_unlock(&cg_mount_table_lock);
if (ret)
return ret;
+ if (move_tids) {
+ ret = cgroup_v1_build_procs_path(controller_name, path);
+ if (ret)
+ return ret;
+ }
+
ret = __cgroup_attach_task_pid(path, tid);
if (ret)
return ret;
*/
int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
{
- return cgroup_attach_task_tid(cgroup, tid);
+ return cgroup_attach_task_tid(cgroup, tid, 0);
}
/**
{
pid_t tid = cg_gettid();
- return cgroup_attach_task_tid(cgroup, tid);
+ return cgroup_attach_task_tid(cgroup, tid, 0);
}
/**