diff options
author | Ivana Varekova <varekova@redhat.com> | 2009-06-04 16:43:38 +0200 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2009-06-18 19:49:39 +0530 |
commit | 7ef477ab710ddeb3cc40544c394c4227059ac8f5 (patch) | |
tree | 1234613e4aeb7bf2f4ab5a2b78b98ee686563f2e | |
parent | d32491c49637e3c21f46048cc6c505eb41cbe3e0 (diff) | |
download | libcg-7ef477ab710ddeb3cc40544c394c4227059ac8f5.tar.gz libcg-7ef477ab710ddeb3cc40544c394c4227059ac8f5.tar.xz libcg-7ef477ab710ddeb3cc40544c394c4227059ac8f5.zip |
This patch adds cgset tool
This patch adds cgset tool, which sets parameters of controllers
for given cgroup based on input name-variable pairs
- the syntax is:
cgset -r <name=value> <relative path to cgroup>
-------------------------------------------------
EXAMPLES:
$ cgcreate -g cpuset:test1
$ cgset -r cpuset.cpus=1 test
$ cat ./test/cpuset.cpus
1
$ cgcreate -g cpuset:test1 -g cpuset:test2
$ cgset -r cpuset.cpus=0 test1 test2
$ cat /mnt/cgroups/cpuset/test1/cpuset.cpus
0
$ cat /mnt/cgroups/cpuset/test2/cpuset.cpus
0
Signed-off-by: Ivana Varekova <varekova@redhat.com>
Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
-rw-r--r-- | src/tools/Makefile.am | 2 | ||||
-rw-r--r-- | src/tools/cgset.c | 178 |
2 files changed, 179 insertions, 1 deletions
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am index 73f9130..2b4c9e7 100644 --- a/src/tools/Makefile.am +++ b/src/tools/Makefile.am @@ -3,7 +3,7 @@ LDADD = $(top_srcdir)/src/.libs/libcgroup.la if WITH_TOOLS -bin_PROGRAMS = cgexec cgclassify cgcreate +bin_PROGRAMS = cgexec cgclassify cgcreate cgset sbin_PROGRAMS = cgconfigparser diff --git a/src/tools/cgset.c b/src/tools/cgset.c new file mode 100644 index 0000000..be234be --- /dev/null +++ b/src/tools/cgset.c @@ -0,0 +1,178 @@ +#include <libcgroup.h> +#include <libcgroup-internal.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "tools-common.h" + +int main(int argc, char *argv[]) +{ + int ret = 0; + int i; + char c; + + char *buf; + char con[FILENAME_MAX]; + struct control_value *name_value = NULL; + int nv_number = 0; + int nv_max = 0; + + struct cgroup *cgroup; + struct cgroup_controller *cgc; + + /* no parametr on input */ + if (argc < 2) { + fprintf(stderr, "Usage is %s -r <name=value> " + "<relative path to cgroup>\n", argv[0]); + return -1; + } + + /* parse arguments */ + while ((c = getopt(argc, argv, "r:")) > 0) { + switch (c) { + case 'r': + /* add name-value pair to buffer + (= name_value variable) */ + if (nv_number >= nv_max) { + nv_max += CG_NV_MAX; + name_value = (struct control_value *) + realloc(name_value, + nv_max * sizeof(struct control_value)); + if (!name_value) { + fprintf(stderr, "cgset: " + "not enough memory\n"); + ret = -1; + goto err; + } + } + + /* parse optarg value */ + /* there is necessary to input the tuple n=v */ + buf = strtok(optarg, "="); + if (buf == NULL) { + fprintf(stderr, "%s: " + "wrong parameter of option -r: %s\n", + argv[0], optarg); + ret = -1; + goto err; + } + + strncpy(name_value[nv_number].name, buf, FILENAME_MAX); + name_value[nv_number].name[FILENAME_MAX-1] = '\0'; + + buf = strtok(NULL, "="); + if (buf == NULL) { + fprintf(stderr, "%s: " + "wrong parameter of option -r: %s\n", + argv[0], optarg); + ret = -1; + goto err; + } + + strncpy(name_value[nv_number].value, buf, CG_VALUE_MAX); + name_value[nv_number].value[CG_VALUE_MAX-1] = '\0'; + + nv_number++; + break; + default: + fprintf(stderr, "%s: invalid command line option\n", + argv[0]); + ret = -1; + goto err; + break; + } + } + + /* no cgroup name */ + if (!argv[optind]) { + fprintf(stderr, "%s: no cgroup specified\n", argv[0]); + ret = -1; + goto err; + } + + if (nv_number == 0) { + fprintf(stderr, "%s: no name-value pair was set\n", argv[0]); + ret = -1; + goto err; + } + + /* initialize libcgroup */ + ret = cgroup_init(); + if (ret) { + fprintf(stderr, "%s: libcgroup initialization failed: %s\n", + argv[0], cgroup_strerror(ret)); + goto err; + } + + while (optind < argc) { + + /* create new cgroup */ + cgroup = cgroup_new_cgroup(argv[optind]); + if (!cgroup) { + ret = ECGFAIL; + fprintf(stderr, "%s: can't add new cgroup: %s\n", + argv[0], cgroup_strerror(ret)); + ret = -1; + goto err; + } + + /* add pairs name-value to + relevant controllers of this cgroup */ + for (i = 0; i < nv_number; i++) { + + if ((strchr(name_value[i].name, '.')) == NULL) { + fprintf(stderr, "%s: " + "wrong -r parameter (%s=%s)\n", + argv[0], name_value[i].name, + name_value[i].value); + ret = -1; + goto cgroup_free_err; + } + + strncpy(con, name_value[i].name, FILENAME_MAX); + strtok(con, "."); + + /* add relevant controller */ + cgc = cgroup_add_controller(cgroup, con); + if (!cgc) { + fprintf(stderr, "%s: " + "controller %s can't be add\n", + argv[0], con); + goto cgroup_free_err; + } + + /* add name-value pair to this controller */ + ret = cgroup_add_value_string(cgc, + name_value[i].name, name_value[i].value); + if (ret) { + fprintf(stderr, "%s: " + "name-value pair %s=%s " + "can't be set\n", + argv[0], name_value[i].name, + name_value[i].value); + goto cgroup_free_err; + } + } + + /* modify cgroup */ + ret = cgroup_modify_cgroup(cgroup); + if (ret) { + fprintf(stderr, "%s: " + "the group can't be modified\n", + argv[0]); + goto cgroup_free_err; + } + + optind++; + cgroup_free(&cgroup); + } +cgroup_free_err: + if (ret) + cgroup_free(&cgroup); +err: + free(name_value); + return ret; +} |