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 <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel