Add a new libcgroup tool - cgxset. cgxset is based upon cgset, but it supports converting from cgroup version to another.
For example, a request like the following will work on a system running the cgroup v1 cpu controller or the cgroup v2 cpu controller. $ cgxset -2 cpu.weight=42 MyCgroup Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com> --- src/tools/Makefile.am | 6 +++++- src/tools/cgset.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index bb00520be48b..54b548f77ed6 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -5,7 +5,7 @@ LDADD = $(top_builddir)/src/libcgroup.la -lpthread if WITH_TOOLS -bin_PROGRAMS = cgexec cgclassify cgcreate cgset cgget cgxget cgdelete \ +bin_PROGRAMS = cgexec cgclassify cgcreate cgset cgxset cgget cgxget cgdelete \ lssubsys lscgroup cgsnapshot sbin_PROGRAMS = cgconfigparser @@ -32,6 +32,10 @@ cgset_SOURCES = cgset.c tools-common.c tools-common.h cgset_LIBS = $(CODE_COVERAGE_LIBS) cgset_CFLAGS = $(CODE_COVERAGE_CFLAGS) -DSTATIC=static +cgxset_SOURCES = cgset.c tools-common.c tools-common.h +cgxset_LIBS = $(CODE_COVERAGE_LIBS) +cgxset_CFLAGS = $(CODE_COVERAGE_CFLAGS) -DCGXSET -DSTATIC=static + cgget_SOURCES = cgget.c tools-common.c tools-common.h cgget_LIBS = $(CODE_COVERAGE_LIBS) cgget_CFLAGS = $(CODE_COVERAGE_CFLAGS) diff --git a/src/tools/cgset.c b/src/tools/cgset.c index fca08d83f453..b537e2a9bfc9 100644 --- a/src/tools/cgset.c +++ b/src/tools/cgset.c @@ -9,6 +9,10 @@ #include "tools-common.h" +#ifdef CGXSET +#include "abstraction-common.h" +#endif + #define FL_RULES 1 #define FL_COPY 2 @@ -18,6 +22,10 @@ enum { static struct option const long_options[] = { +#ifdef CGXSET + {"v1", no_argument, NULL, '1'}, + {"v2", no_argument, NULL, '2'}, +#endif {"rule", required_argument, NULL, 'r'}, {"help", no_argument, NULL, 'h'}, {"copy-from", required_argument, NULL, COPY_FROM_OPTION}, @@ -67,6 +75,12 @@ static void usage(int status, const char *program_name) " or: %s --copy-from <source_cgroup_path> "\ "<cgroup_path> ...\n", program_name, program_name); printf("Set the parameters of given cgroup(s)\n"); +#ifdef CGXSET + printf(" -1, --v1 Provided parameters are in " + "v1 format\n"); + printf(" -2, --v2 Provided parameters are in " + "v2 format\n"); +#endif printf(" -r, --variable <name> Define parameter "\ "to set\n"); printf(" --copy-from <source_cgroup_path> Control group whose "\ @@ -136,6 +150,10 @@ int main(int argc, char *argv[]) char src_cg_path[FILENAME_MAX]; struct cgroup *src_cgroup; struct cgroup *cgroup; +#ifdef CGXSET + struct cgroup *converted_src_cgroup; + enum cg_version_t src_version = CGROUP_UNK; +#endif /* no parametr on input */ if (argc < 2) { @@ -145,8 +163,13 @@ int main(int argc, char *argv[]) } /* parse arguments */ +#ifdef CGXSET + while ((c = getopt_long (argc, argv, + "r:h12", long_options, NULL)) != -1) { +#else while ((c = getopt_long (argc, argv, "r:h", long_options, NULL)) != -1) { +#endif switch (c) { case 'h': usage(0, argv[0]); @@ -195,6 +218,14 @@ int main(int argc, char *argv[]) strncpy(src_cg_path, optarg, FILENAME_MAX); src_cg_path[FILENAME_MAX-1] = '\0'; break; +#ifdef CGXSET + case '1': + src_version = CGROUP_V1; + break; + case '2': + src_version = CGROUP_V2; + break; +#endif default: usage(1, argv[0]); ret = -1; @@ -239,6 +270,22 @@ int main(int argc, char *argv[]) goto err; } +#ifdef CGXSET + converted_src_cgroup = cgroup_new_cgroup(src_cgroup->name); + if (converted_src_cgroup == NULL) { + ret = ECGCONTROLLERCREATEFAILED; + goto err; + } + + ret = cgroup_convert_cgroup(converted_src_cgroup, CGROUP_DISK, + src_cgroup, src_version); + if (ret) + goto err; + + cgroup_free(&src_cgroup); + src_cgroup = converted_src_cgroup; +#endif + while (optind < argc) { /* create new cgroup */ cgroup = cgroup_new_cgroup(argv[optind]); -- 2.25.1 _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel