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

Reply via email to