From: Tom Hromatka Date: Wed, 15 Dec 2021 19:30:30 +0000 (+0000) Subject: wrapper.c: Store the version in struct cgroup_controller X-Git-Tag: v3.0~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=251ca6c987b0cc1c88119dd74cec4d9858050ac7;p=thirdparty%2Flibcgroup.git wrapper.c: Store the version in struct cgroup_controller Store the cgroup version in struct cgroup_controller. Each controller can be mounted separately, and thus the cgroup version is applicable at the controller level. Note that this commit requires cgroup_init() to be called by cgconfigparser. Storing the version in the cgroup_controller struct requires the cg_mount_table[] to be populated. Signed-off-by: Tom Hromatka Reviewed-by: Kamalesh Babulal --- diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h index 160a189f..dd390cc7 100644 --- a/src/libcgroup-internal.h +++ b/src/libcgroup-internal.h @@ -101,6 +101,7 @@ struct cgroup_controller { struct control_value *values[CG_NV_MAX]; struct cgroup *cgroup; int index; + enum cg_version_t version; }; struct cgroup { diff --git a/src/tools/cgconfig.c b/src/tools/cgconfig.c index e8bb5a2e..b5058db4 100644 --- a/src/tools/cgconfig.c +++ b/src/tools/cgconfig.c @@ -94,6 +94,13 @@ int main(int argc, char *argv[]) return -1; } + ret = cgroup_init(); + if (ret) { + fprintf(stderr, "%s: libcgroup initialization failed: %s\n", + argv[0], cgroup_strerror(ret)); + goto err; + } + error = cgroup_string_list_init(&cfg_files, argc/2); if (error) goto err; diff --git a/src/tools/cgget.c b/src/tools/cgget.c index e9e29fd2..01fae3c8 100644 --- a/src/tools/cgget.c +++ b/src/tools/cgget.c @@ -113,7 +113,9 @@ static int parse_a_flag(struct cgroup **cg_list[], int * const cg_list_len) if (!cgc) { cgc = cgroup_add_controller(cg, controller.name); if (!cgc) { - ret = ECGCONTROLLERCREATEFAILED; + fprintf(stderr, "cgget: cannot find controller '%s'\n", + controller.name); + ret = ECGOTHER; goto out; } } @@ -163,7 +165,9 @@ static int parse_r_flag(struct cgroup **cg_list[], int * const cg_list_len, if (!cgc) { cgc = cgroup_add_controller(cg, cntl_value_controller); if (!cgc) { - ret = ECGCONTROLLERCREATEFAILED; + fprintf(stderr, "cgget: cannot find controller '%s'\n", + cntl_value_controller); + ret = ECGOTHER; goto out; } } @@ -204,7 +208,9 @@ static int parse_g_flag_no_colon(struct cgroup **cg_list[], if (!cgc) { cgc = cgroup_add_controller(cg, ctrl_str); if (!cgc) { - ret = ECGCONTROLLERCREATEFAILED; + fprintf(stderr, "cgget: cannot find controller '%s'\n", + ctrl_str); + ret = ECGOTHER; goto out; } } @@ -296,7 +302,9 @@ static int parse_g_flag_with_colon(struct cgroup **cg_list[], if (!cgc) { cgc = cgroup_add_controller(cg, controllers[i]); if (!cgc) { - ret = ECGCONTROLLERCREATEFAILED; + fprintf(stderr, "cgget: cannot find controller '%s'\n", + controllers[i]); + ret = ECGOTHER; goto out; } } diff --git a/src/wrapper.c b/src/wrapper.c index 98ebcc26..2b287656 100644 --- a/src/wrapper.c +++ b/src/wrapper.c @@ -56,7 +56,7 @@ struct cgroup *cgroup_new_cgroup(const char *name) struct cgroup_controller *cgroup_add_controller(struct cgroup *cgroup, const char *name) { - int i; + int i, ret; struct cgroup_controller *controller; if (!cgroup) @@ -86,6 +86,23 @@ struct cgroup_controller *cgroup_add_controller(struct cgroup *cgroup, controller->cgroup = cgroup; controller->index = 0; + if (strcmp(controller->name, CGROUP_FILE_PREFIX) == 0) { + /* + * Operating on the "cgroup" controller is only allowed on + * cgroup v2 systems + */ + controller->version = CGROUP_V2; + } else { + ret = cgroup_get_controller_version(controller->name, + &controller->version); + if (ret) { + cgroup_dbg("failed to get cgroup version for controller %s\n", + controller->name); + free(controller); + return NULL; + } + } + cgroup->controller[cgroup->index] = controller; cgroup->index++;