[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 11/29] xl: split out cpupool related code



Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 tools/xl/Makefile     |   2 +-
 tools/xl/xl_cmdimpl.c | 592 -----------------------------------------------
 tools/xl/xl_cpupool.c | 624 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 625 insertions(+), 593 deletions(-)
 create mode 100644 tools/xl/xl_cpupool.c

diff --git a/tools/xl/Makefile b/tools/xl/Makefile
index d7f7f01549..0ff7ef9bfe 100644
--- a/tools/xl/Makefile
+++ b/tools/xl/Makefile
@@ -16,7 +16,7 @@ CFLAGS_XL += $(CFLAGS_libxenlight)
 CFLAGS_XL += -Wshadow
 
 XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o xl_utils.o
-XL_OBJS += xl_tmem.o xl_parse.o
+XL_OBJS += xl_tmem.o xl_parse.o xl_cpupool.o
 
 $(XL_OBJS): CFLAGS += $(CFLAGS_libxentoollog)
 $(XL_OBJS): CFLAGS += $(CFLAGS_XL)
diff --git a/tools/xl/xl_cmdimpl.c b/tools/xl/xl_cmdimpl.c
index 812f570d0d..82b30bb094 100644
--- a/tools/xl/xl_cmdimpl.c
+++ b/tools/xl/xl_cmdimpl.c
@@ -5611,598 +5611,6 @@ int main_uptime(int argc, char **argv)
     return 0;
 }
 
-
-int main_cpupoolcreate(int argc, char **argv)
-{
-    const char *filename = NULL, *config_src=NULL;
-    const char *p;
-    char *extra_config = NULL;
-    int opt;
-    static struct option opts[] = {
-        {"defconfig", 1, 0, 'f'},
-        {"dryrun", 0, 0, 'n'},
-        COMMON_LONG_OPTS
-    };
-    int ret;
-    char *config_data = 0;
-    int config_len = 0;
-    XLU_Config *config;
-    const char *buf;
-    char *name = NULL;
-    uint32_t poolid;
-    libxl_scheduler sched = 0;
-    XLU_ConfigList *cpus;
-    XLU_ConfigList *nodes;
-    int n_cpus, n_nodes, i, n;
-    libxl_bitmap freemap;
-    libxl_bitmap cpumap;
-    libxl_uuid uuid;
-    libxl_cputopology *topology;
-    int rc = EXIT_FAILURE;
-
-    SWITCH_FOREACH_OPT(opt, "nf:", opts, "cpupool-create", 0) {
-    case 'f':
-        filename = optarg;
-        break;
-    case 'n':
-        dryrun_only = 1;
-        break;
-    }
-
-    libxl_bitmap_init(&freemap);
-    libxl_bitmap_init(&cpumap);
-
-    while (optind < argc) {
-        if ((p = strchr(argv[optind], '='))) {
-            xstring_realloc_append(&extra_config, "\n");
-            xstring_realloc_append(&extra_config, argv[optind]);
-        } else if (!filename) {
-            filename = argv[optind];
-        } else {
-            help("cpupool-create");
-            goto out;
-        }
-        optind++;
-    }
-
-    if (filename)
-    {
-        if (libxl_read_file_contents(ctx, filename, (void **)&config_data,
-                                     &config_len)) {
-            fprintf(stderr, "Failed to read config file: %s: %s\n",
-                    filename, strerror(errno));
-            goto out;
-        }
-        config_src=filename;
-    }
-    else
-        config_src="command line";
-
-    if (extra_config && strlen(extra_config)) {
-        if (config_len > INT_MAX - (strlen(extra_config) + 2)) {
-            fprintf(stderr, "Failed to attach extra configuration\n");
-            goto out;
-        }
-        config_data = xrealloc(config_data,
-                               config_len + strlen(extra_config) + 2);
-        if (!config_data) {
-            fprintf(stderr, "Failed to realloc config_data\n");
-            goto out;
-        }
-        config_data[config_len] = 0;
-        strcat(config_data, extra_config);
-        strcat(config_data, "\n");
-        config_len += strlen(extra_config) + 1;
-    }
-
-    config = xlu_cfg_init(stderr, config_src);
-    if (!config) {
-        fprintf(stderr, "Failed to allocate for configuration\n");
-        goto out;
-    }
-
-    ret = xlu_cfg_readdata(config, config_data, config_len);
-    if (ret) {
-        fprintf(stderr, "Failed to parse config file: %s\n", strerror(ret));
-        goto out_cfg;
-    }
-
-    if (!xlu_cfg_get_string (config, "name", &buf, 0))
-        name = strdup(buf);
-    else if (filename)
-        name = libxl_basename(filename);
-    else {
-        fprintf(stderr, "Missing cpupool name!\n");
-        goto out_cfg;
-    }
-    if (!libxl_name_to_cpupoolid(ctx, name, &poolid)) {
-        fprintf(stderr, "Pool name \"%s\" already exists\n", name);
-        goto out_cfg;
-    }
-
-    if (!xlu_cfg_get_string (config, "sched", &buf, 0)) {
-        if ((libxl_scheduler_from_string(buf, &sched)) < 0) {
-            fprintf(stderr, "Unknown scheduler\n");
-            goto out_cfg;
-        }
-    } else {
-        rc = libxl_get_scheduler(ctx);
-        if (rc < 0) {
-            fprintf(stderr, "get_scheduler sysctl failed.\n");
-            goto out_cfg;
-        }
-        sched = rc;
-    }
-
-    if (libxl_get_freecpus(ctx, &freemap)) {
-        fprintf(stderr, "libxl_get_freecpus failed\n");
-        goto out_cfg;
-    }
-    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
-        fprintf(stderr, "Failed to allocate cpumap\n");
-        goto out_cfg;
-    }
-    if (!xlu_cfg_get_list(config, "nodes", &nodes, 0, 0)) {
-        int nr;
-        n_cpus = 0;
-        n_nodes = 0;
-        topology = libxl_get_cpu_topology(ctx, &nr);
-        if (topology == NULL) {
-            fprintf(stderr, "libxl_get_topologyinfo failed\n");
-            goto out_cfg;
-        }
-        while ((buf = xlu_cfg_get_listitem(nodes, n_nodes)) != NULL) {
-            n = atoi(buf);
-            for (i = 0; i < nr; i++) {
-                if ((topology[i].node == n) &&
-                    libxl_bitmap_test(&freemap, i)) {
-                    libxl_bitmap_set(&cpumap, i);
-                    n_cpus++;
-                }
-            }
-            n_nodes++;
-        }
-
-        libxl_cputopology_list_free(topology, nr);
-
-        if (n_cpus == 0) {
-            fprintf(stderr, "no free cpu found\n");
-            goto out_cfg;
-        }
-    } else if (!xlu_cfg_get_list(config, "cpus", &cpus, 0, 1)) {
-        n_cpus = 0;
-        while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) {
-            i = atoi(buf);
-            if ((i < 0) || !libxl_bitmap_test(&freemap, i)) {
-                fprintf(stderr, "cpu %d illegal or not free\n", i);
-                goto out_cfg;
-            }
-            libxl_bitmap_set(&cpumap, i);
-            n_cpus++;
-        }
-    } else if (!xlu_cfg_get_string(config, "cpus", &buf, 0)) {
-        if (parse_cpurange(buf, &cpumap))
-            goto out_cfg;
-
-        n_cpus = 0;
-        libxl_for_each_set_bit(i, cpumap) {
-            if (!libxl_bitmap_test(&freemap, i)) {
-                fprintf(stderr, "cpu %d illegal or not free\n", i);
-                goto out_cfg;
-            }
-            n_cpus++;
-        }
-    } else
-        n_cpus = 0;
-
-    libxl_uuid_generate(&uuid);
-
-    printf("Using config file \"%s\"\n", config_src);
-    printf("cpupool name:   %s\n", name);
-    printf("scheduler:      %s\n", libxl_scheduler_to_string(sched));
-    printf("number of cpus: %d\n", n_cpus);
-
-    if (!dryrun_only) {
-        poolid = LIBXL_CPUPOOL_POOLID_ANY;
-        if (libxl_cpupool_create(ctx, name, sched, cpumap, &uuid, &poolid)) {
-            fprintf(stderr, "error on creating cpupool\n");
-            goto out_cfg;
-        }
-    }
-    /* We made it! */
-    rc = EXIT_SUCCESS;
-
-out_cfg:
-    xlu_cfg_destroy(config);
-out:
-    libxl_bitmap_dispose(&freemap);
-    libxl_bitmap_dispose(&cpumap);
-    free(name);
-    free(config_data);
-    free(extra_config);
-    return rc;
-}
-
-int main_cpupoollist(int argc, char **argv)
-{
-    int opt;
-    static struct option opts[] = {
-        {"cpus", 0, 0, 'c'},
-        COMMON_LONG_OPTS
-    };
-    int opt_cpus = 0;
-    const char *pool = NULL;
-    libxl_cpupoolinfo *poolinfo;
-    int n_pools, p, c, n;
-    uint32_t poolid;
-    char *name;
-
-    SWITCH_FOREACH_OPT(opt, "c", opts, "cpupool-list", 0) {
-    case 'c':
-        opt_cpus = 1;
-        break;
-    }
-
-    if (optind < argc) {
-        pool = argv[optind];
-        if (libxl_name_to_cpupoolid(ctx, pool, &poolid)) {
-            fprintf(stderr, "Pool \'%s\' does not exist\n", pool);
-            return EXIT_FAILURE;
-        }
-    }
-
-    poolinfo = libxl_list_cpupool(ctx, &n_pools);
-    if (!poolinfo) {
-        fprintf(stderr, "error getting cpupool info\n");
-        return EXIT_FAILURE;
-    }
-
-    printf("%-19s", "Name");
-    if (opt_cpus)
-        printf("CPU list\n");
-    else
-        printf("CPUs   Sched     Active   Domain count\n");
-
-    for (p = 0; p < n_pools; p++) {
-        if (!pool || (poolinfo[p].poolid == poolid)) {
-            name = poolinfo[p].pool_name;
-            printf("%-19s", name);
-            n = 0;
-            libxl_for_each_bit(c, poolinfo[p].cpumap)
-                if (libxl_bitmap_test(&poolinfo[p].cpumap, c)) {
-                    if (n && opt_cpus) printf(",");
-                    if (opt_cpus) printf("%d", c);
-                    n++;
-                }
-            if (!opt_cpus) {
-                printf("%3d %9s       y       %4d", n,
-                       libxl_scheduler_to_string(poolinfo[p].sched),
-                       poolinfo[p].n_dom);
-            }
-            printf("\n");
-        }
-    }
-
-    libxl_cpupoolinfo_list_free(poolinfo, n_pools);
-
-    return EXIT_SUCCESS;
-}
-
-int main_cpupooldestroy(int argc, char **argv)
-{
-    int opt;
-    const char *pool;
-    uint32_t poolid;
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-destroy", 1) {
-        /* No options */
-    }
-
-    pool = argv[optind];
-
-    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
-        !libxl_cpupoolid_is_valid(ctx, poolid)) {
-        fprintf(stderr, "unknown cpupool '%s'\n", pool);
-        return EXIT_FAILURE;
-    }
-
-    if (libxl_cpupool_destroy(ctx, poolid)) {
-        fprintf(stderr, "Can't destroy cpupool '%s'\n", pool);
-        return EXIT_FAILURE;
-    }
-
-    return EXIT_SUCCESS;
-}
-
-int main_cpupoolrename(int argc, char **argv)
-{
-    int opt;
-    const char *pool;
-    const char *new_name;
-    uint32_t poolid;
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-rename", 2) {
-        /* No options */
-    }
-
-    pool = argv[optind++];
-
-    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
-        !libxl_cpupoolid_is_valid(ctx, poolid)) {
-        fprintf(stderr, "unknown cpupool '%s'\n", pool);
-        return EXIT_FAILURE;
-    }
-
-    new_name = argv[optind];
-
-    if (libxl_cpupool_rename(ctx, new_name, poolid)) {
-        fprintf(stderr, "Can't rename cpupool '%s'\n", pool);
-        return EXIT_FAILURE;
-    }
-
-    return EXIT_SUCCESS;
-}
-
-int main_cpupoolcpuadd(int argc, char **argv)
-{
-    int opt;
-    const char *pool;
-    uint32_t poolid;
-    libxl_bitmap cpumap;
-    int rc = EXIT_FAILURE;
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-add", 2) {
-        /* No options */
-    }
-
-    libxl_bitmap_init(&cpumap);
-    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
-        fprintf(stderr, "Unable to allocate cpumap");
-        return EXIT_FAILURE;
-    }
-
-    pool = argv[optind++];
-    if (parse_cpurange(argv[optind], &cpumap))
-        goto out;
-
-    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
-        !libxl_cpupoolid_is_valid(ctx, poolid)) {
-        fprintf(stderr, "unknown cpupool \'%s\'\n", pool);
-        goto out;
-    }
-
-    if (libxl_cpupool_cpuadd_cpumap(ctx, poolid, &cpumap))
-        fprintf(stderr, "some cpus may not have been added to %s\n", pool);
-
-    rc = EXIT_SUCCESS;
-
-out:
-    libxl_bitmap_dispose(&cpumap);
-    return rc;
-}
-
-int main_cpupoolcpuremove(int argc, char **argv)
-{
-    int opt;
-    const char *pool;
-    uint32_t poolid;
-    libxl_bitmap cpumap;
-    int rc = EXIT_FAILURE;
-
-    libxl_bitmap_init(&cpumap);
-    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
-        fprintf(stderr, "Unable to allocate cpumap");
-        return EXIT_FAILURE;
-    }
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-remove", 2) {
-        /* No options */
-    }
-
-    pool = argv[optind++];
-    if (parse_cpurange(argv[optind], &cpumap))
-        goto out;
-
-    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
-        !libxl_cpupoolid_is_valid(ctx, poolid)) {
-        fprintf(stderr, "unknown cpupool \'%s\'\n", pool);
-        goto out;
-    }
-
-    if (libxl_cpupool_cpuremove_cpumap(ctx, poolid, &cpumap)) {
-        fprintf(stderr, "Some cpus may have not or only partially been removed 
from '%s'.\n", pool);
-        fprintf(stderr, "If a cpu can't be added to another cpupool, add it to 
'%s' again and retry.\n", pool);
-    }
-
-    rc = EXIT_SUCCESS;
-
-out:
-    libxl_bitmap_dispose(&cpumap);
-    return rc;
-}
-
-int main_cpupoolmigrate(int argc, char **argv)
-{
-    int opt;
-    const char *pool;
-    uint32_t poolid;
-    const char *dom;
-    uint32_t domid;
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-migrate", 2) {
-        /* No options */
-    }
-
-    dom = argv[optind++];
-    pool = argv[optind];
-
-    if (libxl_domain_qualifier_to_domid(ctx, dom, &domid) ||
-        !libxl_domid_to_name(ctx, domid)) {
-        fprintf(stderr, "unknown domain '%s'\n", dom);
-        return EXIT_FAILURE;
-    }
-
-    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
-        !libxl_cpupoolid_is_valid(ctx, poolid)) {
-        fprintf(stderr, "unknown cpupool '%s'\n", pool);
-        return EXIT_FAILURE;
-    }
-
-    if (libxl_cpupool_movedomain(ctx, poolid, domid))
-        return EXIT_FAILURE;
-
-    return EXIT_SUCCESS;
-}
-
-int main_cpupoolnumasplit(int argc, char **argv)
-{
-    int rc;
-    int opt;
-    int p;
-    int c;
-    int n;
-    uint32_t poolid;
-    libxl_scheduler sched;
-    int n_pools;
-    int node;
-    int n_cpus;
-    char *name = NULL;
-    libxl_uuid uuid;
-    libxl_bitmap cpumap;
-    libxl_cpupoolinfo *poolinfo;
-    libxl_cputopology *topology;
-    libxl_dominfo info;
-
-    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-numa-split", 0) {
-        /* No options */
-    }
-
-    libxl_dominfo_init(&info);
-
-    rc = EXIT_FAILURE;
-
-    libxl_bitmap_init(&cpumap);
-    poolinfo = libxl_list_cpupool(ctx, &n_pools);
-    if (!poolinfo) {
-        fprintf(stderr, "error getting cpupool info\n");
-        return EXIT_FAILURE;
-    }
-    poolid = poolinfo[0].poolid;
-    sched = poolinfo[0].sched;
-    libxl_cpupoolinfo_list_free(poolinfo, n_pools);
-
-    if (n_pools > 1) {
-        fprintf(stderr, "splitting not possible, already cpupools in use\n");
-        return EXIT_FAILURE;
-    }
-
-    topology = libxl_get_cpu_topology(ctx, &n_cpus);
-    if (topology == NULL) {
-        fprintf(stderr, "libxl_get_topologyinfo failed\n");
-        return EXIT_FAILURE;
-    }
-
-    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
-        fprintf(stderr, "Failed to allocate cpumap\n");
-        goto out;
-    }
-
-    /* Reset Pool-0 to 1st node: first add cpus, then remove cpus to avoid
-       a cpupool without cpus in between */
-
-    node = topology[0].node;
-    if (libxl_cpupool_cpuadd_node(ctx, 0, node, &n)) {
-        fprintf(stderr, "error on adding cpu to Pool 0\n");
-        goto out;
-    }
-
-    xasprintf(&name, "Pool-node%d", node);
-    if (libxl_cpupool_rename(ctx, name, 0)) {
-        fprintf(stderr, "error on renaming Pool 0\n");
-        goto out;
-    }
-
-    n = 0;
-    for (c = 0; c < n_cpus; c++) {
-        if (topology[c].node == node) {
-            topology[c].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY;
-            libxl_bitmap_set(&cpumap, n);
-            n++;
-        }
-    }
-    if (libxl_domain_info(ctx, &info, 0)) {
-        fprintf(stderr, "error on getting info for Domain-0\n");
-        goto out;
-    }
-    if (info.vcpu_online > n && libxl_set_vcpuonline(ctx, 0, &cpumap)) {
-        fprintf(stderr, "error on removing vcpus for Domain-0\n");
-        goto out;
-    }
-    for (c = 0; c < 10; c++) {
-        /* We've called libxl_dominfo_init before the loop and will
-         * call libxl_dominfo_dispose after the loop when we're done
-         * with info.
-         */
-        libxl_dominfo_dispose(&info);
-        libxl_dominfo_init(&info);
-        if (libxl_domain_info(ctx, &info, 0)) {
-            fprintf(stderr, "error on getting info for Domain-0\n");
-            goto out;
-        }
-        if (info.vcpu_online <= n) {
-            break;
-        }
-        sleep(1);
-    }
-    if (info.vcpu_online > n) {
-        fprintf(stderr, "failed to offline vcpus\n");
-        goto out;
-    }
-    libxl_bitmap_set_none(&cpumap);
-
-    for (c = 0; c < n_cpus; c++) {
-        if (topology[c].node == LIBXL_CPUTOPOLOGY_INVALID_ENTRY) {
-            continue;
-        }
-
-        node = topology[c].node;
-        if (libxl_cpupool_cpuremove_node(ctx, 0, node, &n)) {
-            fprintf(stderr, "error on removing cpu from Pool 0\n");
-            goto out;
-        }
-
-        free(name);
-        xasprintf(&name, "Pool-node%d", node);
-        libxl_uuid_generate(&uuid);
-        poolid = 0;
-        if (libxl_cpupool_create(ctx, name, sched, cpumap, &uuid, &poolid)) {
-            fprintf(stderr, "error on creating cpupool\n");
-            goto out;
-        }
-
-        if (libxl_cpupool_cpuadd_node(ctx, poolid, node, &n)) {
-            fprintf(stderr, "error on adding cpus to cpupool\n");
-            goto out;
-        }
-
-        for (p = c; p < n_cpus; p++) {
-            if (topology[p].node == node) {
-                topology[p].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY;
-            }
-        }
-    }
-
-    rc = EXIT_SUCCESS;
-
-out:
-    libxl_cputopology_list_free(topology, n_cpus);
-    libxl_bitmap_dispose(&cpumap);
-    libxl_dominfo_dispose(&info);
-    free(name);
-
-    return rc;
-}
-
 int main_getenforce(int argc, char **argv)
 {
     int ret;
diff --git a/tools/xl/xl_cpupool.c b/tools/xl/xl_cpupool.c
new file mode 100644
index 0000000000..b0194644e9
--- /dev/null
+++ b/tools/xl/xl_cpupool.c
@@ -0,0 +1,624 @@
+/*
+ * Copyright 2009-2017 Citrix Ltd and other contributors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <libxl.h>
+#include <libxl_utils.h>
+#include <libxlutil.h>
+
+#include "xl.h"
+#include "xl_utils.h"
+#include "xl_parse.h"
+
+int main_cpupoolcreate(int argc, char **argv)
+{
+    const char *filename = NULL, *config_src=NULL;
+    const char *p;
+    char *extra_config = NULL;
+    int opt;
+    static struct option opts[] = {
+        {"defconfig", 1, 0, 'f'},
+        {"dryrun", 0, 0, 'n'},
+        COMMON_LONG_OPTS
+    };
+    int ret;
+    char *config_data = 0;
+    int config_len = 0;
+    XLU_Config *config;
+    const char *buf;
+    char *name = NULL;
+    uint32_t poolid;
+    libxl_scheduler sched = 0;
+    XLU_ConfigList *cpus;
+    XLU_ConfigList *nodes;
+    int n_cpus, n_nodes, i, n;
+    libxl_bitmap freemap;
+    libxl_bitmap cpumap;
+    libxl_uuid uuid;
+    libxl_cputopology *topology;
+    int rc = EXIT_FAILURE;
+
+    SWITCH_FOREACH_OPT(opt, "nf:", opts, "cpupool-create", 0) {
+    case 'f':
+        filename = optarg;
+        break;
+    case 'n':
+        dryrun_only = 1;
+        break;
+    }
+
+    libxl_bitmap_init(&freemap);
+    libxl_bitmap_init(&cpumap);
+
+    while (optind < argc) {
+        if ((p = strchr(argv[optind], '='))) {
+            xstring_realloc_append(&extra_config, "\n");
+            xstring_realloc_append(&extra_config, argv[optind]);
+        } else if (!filename) {
+            filename = argv[optind];
+        } else {
+            help("cpupool-create");
+            goto out;
+        }
+        optind++;
+    }
+
+    if (filename)
+    {
+        if (libxl_read_file_contents(ctx, filename, (void **)&config_data,
+                                     &config_len)) {
+            fprintf(stderr, "Failed to read config file: %s: %s\n",
+                    filename, strerror(errno));
+            goto out;
+        }
+        config_src=filename;
+    }
+    else
+        config_src="command line";
+
+    if (extra_config && strlen(extra_config)) {
+        if (config_len > INT_MAX - (strlen(extra_config) + 2)) {
+            fprintf(stderr, "Failed to attach extra configuration\n");
+            goto out;
+        }
+        config_data = xrealloc(config_data,
+                               config_len + strlen(extra_config) + 2);
+        if (!config_data) {
+            fprintf(stderr, "Failed to realloc config_data\n");
+            goto out;
+        }
+        config_data[config_len] = 0;
+        strcat(config_data, extra_config);
+        strcat(config_data, "\n");
+        config_len += strlen(extra_config) + 1;
+    }
+
+    config = xlu_cfg_init(stderr, config_src);
+    if (!config) {
+        fprintf(stderr, "Failed to allocate for configuration\n");
+        goto out;
+    }
+
+    ret = xlu_cfg_readdata(config, config_data, config_len);
+    if (ret) {
+        fprintf(stderr, "Failed to parse config file: %s\n", strerror(ret));
+        goto out_cfg;
+    }
+
+    if (!xlu_cfg_get_string (config, "name", &buf, 0))
+        name = strdup(buf);
+    else if (filename)
+        name = libxl_basename(filename);
+    else {
+        fprintf(stderr, "Missing cpupool name!\n");
+        goto out_cfg;
+    }
+    if (!libxl_name_to_cpupoolid(ctx, name, &poolid)) {
+        fprintf(stderr, "Pool name \"%s\" already exists\n", name);
+        goto out_cfg;
+    }
+
+    if (!xlu_cfg_get_string (config, "sched", &buf, 0)) {
+        if ((libxl_scheduler_from_string(buf, &sched)) < 0) {
+            fprintf(stderr, "Unknown scheduler\n");
+            goto out_cfg;
+        }
+    } else {
+        rc = libxl_get_scheduler(ctx);
+        if (rc < 0) {
+            fprintf(stderr, "get_scheduler sysctl failed.\n");
+            goto out_cfg;
+        }
+        sched = rc;
+    }
+
+    if (libxl_get_freecpus(ctx, &freemap)) {
+        fprintf(stderr, "libxl_get_freecpus failed\n");
+        goto out_cfg;
+    }
+    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
+        fprintf(stderr, "Failed to allocate cpumap\n");
+        goto out_cfg;
+    }
+    if (!xlu_cfg_get_list(config, "nodes", &nodes, 0, 0)) {
+        int nr;
+        n_cpus = 0;
+        n_nodes = 0;
+        topology = libxl_get_cpu_topology(ctx, &nr);
+        if (topology == NULL) {
+            fprintf(stderr, "libxl_get_topologyinfo failed\n");
+            goto out_cfg;
+        }
+        while ((buf = xlu_cfg_get_listitem(nodes, n_nodes)) != NULL) {
+            n = atoi(buf);
+            for (i = 0; i < nr; i++) {
+                if ((topology[i].node == n) &&
+                    libxl_bitmap_test(&freemap, i)) {
+                    libxl_bitmap_set(&cpumap, i);
+                    n_cpus++;
+                }
+            }
+            n_nodes++;
+        }
+
+        libxl_cputopology_list_free(topology, nr);
+
+        if (n_cpus == 0) {
+            fprintf(stderr, "no free cpu found\n");
+            goto out_cfg;
+        }
+    } else if (!xlu_cfg_get_list(config, "cpus", &cpus, 0, 1)) {
+        n_cpus = 0;
+        while ((buf = xlu_cfg_get_listitem(cpus, n_cpus)) != NULL) {
+            i = atoi(buf);
+            if ((i < 0) || !libxl_bitmap_test(&freemap, i)) {
+                fprintf(stderr, "cpu %d illegal or not free\n", i);
+                goto out_cfg;
+            }
+            libxl_bitmap_set(&cpumap, i);
+            n_cpus++;
+        }
+    } else if (!xlu_cfg_get_string(config, "cpus", &buf, 0)) {
+        if (parse_cpurange(buf, &cpumap))
+            goto out_cfg;
+
+        n_cpus = 0;
+        libxl_for_each_set_bit(i, cpumap) {
+            if (!libxl_bitmap_test(&freemap, i)) {
+                fprintf(stderr, "cpu %d illegal or not free\n", i);
+                goto out_cfg;
+            }
+            n_cpus++;
+        }
+    } else
+        n_cpus = 0;
+
+    libxl_uuid_generate(&uuid);
+
+    printf("Using config file \"%s\"\n", config_src);
+    printf("cpupool name:   %s\n", name);
+    printf("scheduler:      %s\n", libxl_scheduler_to_string(sched));
+    printf("number of cpus: %d\n", n_cpus);
+
+    if (!dryrun_only) {
+        poolid = LIBXL_CPUPOOL_POOLID_ANY;
+        if (libxl_cpupool_create(ctx, name, sched, cpumap, &uuid, &poolid)) {
+            fprintf(stderr, "error on creating cpupool\n");
+            goto out_cfg;
+        }
+    }
+    /* We made it! */
+    rc = EXIT_SUCCESS;
+
+out_cfg:
+    xlu_cfg_destroy(config);
+out:
+    libxl_bitmap_dispose(&freemap);
+    libxl_bitmap_dispose(&cpumap);
+    free(name);
+    free(config_data);
+    free(extra_config);
+    return rc;
+}
+
+int main_cpupoollist(int argc, char **argv)
+{
+    int opt;
+    static struct option opts[] = {
+        {"cpus", 0, 0, 'c'},
+        COMMON_LONG_OPTS
+    };
+    int opt_cpus = 0;
+    const char *pool = NULL;
+    libxl_cpupoolinfo *poolinfo;
+    int n_pools, p, c, n;
+    uint32_t poolid;
+    char *name;
+
+    SWITCH_FOREACH_OPT(opt, "c", opts, "cpupool-list", 0) {
+    case 'c':
+        opt_cpus = 1;
+        break;
+    }
+
+    if (optind < argc) {
+        pool = argv[optind];
+        if (libxl_name_to_cpupoolid(ctx, pool, &poolid)) {
+            fprintf(stderr, "Pool \'%s\' does not exist\n", pool);
+            return EXIT_FAILURE;
+        }
+    }
+
+    poolinfo = libxl_list_cpupool(ctx, &n_pools);
+    if (!poolinfo) {
+        fprintf(stderr, "error getting cpupool info\n");
+        return EXIT_FAILURE;
+    }
+
+    printf("%-19s", "Name");
+    if (opt_cpus)
+        printf("CPU list\n");
+    else
+        printf("CPUs   Sched     Active   Domain count\n");
+
+    for (p = 0; p < n_pools; p++) {
+        if (!pool || (poolinfo[p].poolid == poolid)) {
+            name = poolinfo[p].pool_name;
+            printf("%-19s", name);
+            n = 0;
+            libxl_for_each_bit(c, poolinfo[p].cpumap)
+                if (libxl_bitmap_test(&poolinfo[p].cpumap, c)) {
+                    if (n && opt_cpus) printf(",");
+                    if (opt_cpus) printf("%d", c);
+                    n++;
+                }
+            if (!opt_cpus) {
+                printf("%3d %9s       y       %4d", n,
+                       libxl_scheduler_to_string(poolinfo[p].sched),
+                       poolinfo[p].n_dom);
+            }
+            printf("\n");
+        }
+    }
+
+    libxl_cpupoolinfo_list_free(poolinfo, n_pools);
+
+    return EXIT_SUCCESS;
+}
+
+int main_cpupooldestroy(int argc, char **argv)
+{
+    int opt;
+    const char *pool;
+    uint32_t poolid;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-destroy", 1) {
+        /* No options */
+    }
+
+    pool = argv[optind];
+
+    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
+        !libxl_cpupoolid_is_valid(ctx, poolid)) {
+        fprintf(stderr, "unknown cpupool '%s'\n", pool);
+        return EXIT_FAILURE;
+    }
+
+    if (libxl_cpupool_destroy(ctx, poolid)) {
+        fprintf(stderr, "Can't destroy cpupool '%s'\n", pool);
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
+
+int main_cpupoolrename(int argc, char **argv)
+{
+    int opt;
+    const char *pool;
+    const char *new_name;
+    uint32_t poolid;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-rename", 2) {
+        /* No options */
+    }
+
+    pool = argv[optind++];
+
+    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
+        !libxl_cpupoolid_is_valid(ctx, poolid)) {
+        fprintf(stderr, "unknown cpupool '%s'\n", pool);
+        return EXIT_FAILURE;
+    }
+
+    new_name = argv[optind];
+
+    if (libxl_cpupool_rename(ctx, new_name, poolid)) {
+        fprintf(stderr, "Can't rename cpupool '%s'\n", pool);
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
+
+int main_cpupoolcpuadd(int argc, char **argv)
+{
+    int opt;
+    const char *pool;
+    uint32_t poolid;
+    libxl_bitmap cpumap;
+    int rc = EXIT_FAILURE;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-add", 2) {
+        /* No options */
+    }
+
+    libxl_bitmap_init(&cpumap);
+    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
+        fprintf(stderr, "Unable to allocate cpumap");
+        return EXIT_FAILURE;
+    }
+
+    pool = argv[optind++];
+    if (parse_cpurange(argv[optind], &cpumap))
+        goto out;
+
+    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
+        !libxl_cpupoolid_is_valid(ctx, poolid)) {
+        fprintf(stderr, "unknown cpupool \'%s\'\n", pool);
+        goto out;
+    }
+
+    if (libxl_cpupool_cpuadd_cpumap(ctx, poolid, &cpumap))
+        fprintf(stderr, "some cpus may not have been added to %s\n", pool);
+
+    rc = EXIT_SUCCESS;
+
+out:
+    libxl_bitmap_dispose(&cpumap);
+    return rc;
+}
+
+int main_cpupoolcpuremove(int argc, char **argv)
+{
+    int opt;
+    const char *pool;
+    uint32_t poolid;
+    libxl_bitmap cpumap;
+    int rc = EXIT_FAILURE;
+
+    libxl_bitmap_init(&cpumap);
+    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
+        fprintf(stderr, "Unable to allocate cpumap");
+        return EXIT_FAILURE;
+    }
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-cpu-remove", 2) {
+        /* No options */
+    }
+
+    pool = argv[optind++];
+    if (parse_cpurange(argv[optind], &cpumap))
+        goto out;
+
+    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
+        !libxl_cpupoolid_is_valid(ctx, poolid)) {
+        fprintf(stderr, "unknown cpupool \'%s\'\n", pool);
+        goto out;
+    }
+
+    if (libxl_cpupool_cpuremove_cpumap(ctx, poolid, &cpumap)) {
+        fprintf(stderr, "Some cpus may have not or only partially been removed 
from '%s'.\n", pool);
+        fprintf(stderr, "If a cpu can't be added to another cpupool, add it to 
'%s' again and retry.\n", pool);
+    }
+
+    rc = EXIT_SUCCESS;
+
+out:
+    libxl_bitmap_dispose(&cpumap);
+    return rc;
+}
+
+int main_cpupoolmigrate(int argc, char **argv)
+{
+    int opt;
+    const char *pool;
+    uint32_t poolid;
+    const char *dom;
+    uint32_t domid;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-migrate", 2) {
+        /* No options */
+    }
+
+    dom = argv[optind++];
+    pool = argv[optind];
+
+    if (libxl_domain_qualifier_to_domid(ctx, dom, &domid) ||
+        !libxl_domid_to_name(ctx, domid)) {
+        fprintf(stderr, "unknown domain '%s'\n", dom);
+        return EXIT_FAILURE;
+    }
+
+    if (libxl_cpupool_qualifier_to_cpupoolid(ctx, pool, &poolid, NULL) ||
+        !libxl_cpupoolid_is_valid(ctx, poolid)) {
+        fprintf(stderr, "unknown cpupool '%s'\n", pool);
+        return EXIT_FAILURE;
+    }
+
+    if (libxl_cpupool_movedomain(ctx, poolid, domid))
+        return EXIT_FAILURE;
+
+    return EXIT_SUCCESS;
+}
+
+int main_cpupoolnumasplit(int argc, char **argv)
+{
+    int rc;
+    int opt;
+    int p;
+    int c;
+    int n;
+    uint32_t poolid;
+    libxl_scheduler sched;
+    int n_pools;
+    int node;
+    int n_cpus;
+    char *name = NULL;
+    libxl_uuid uuid;
+    libxl_bitmap cpumap;
+    libxl_cpupoolinfo *poolinfo;
+    libxl_cputopology *topology;
+    libxl_dominfo info;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "cpupool-numa-split", 0) {
+        /* No options */
+    }
+
+    libxl_dominfo_init(&info);
+
+    rc = EXIT_FAILURE;
+
+    libxl_bitmap_init(&cpumap);
+    poolinfo = libxl_list_cpupool(ctx, &n_pools);
+    if (!poolinfo) {
+        fprintf(stderr, "error getting cpupool info\n");
+        return EXIT_FAILURE;
+    }
+    poolid = poolinfo[0].poolid;
+    sched = poolinfo[0].sched;
+    libxl_cpupoolinfo_list_free(poolinfo, n_pools);
+
+    if (n_pools > 1) {
+        fprintf(stderr, "splitting not possible, already cpupools in use\n");
+        return EXIT_FAILURE;
+    }
+
+    topology = libxl_get_cpu_topology(ctx, &n_cpus);
+    if (topology == NULL) {
+        fprintf(stderr, "libxl_get_topologyinfo failed\n");
+        return EXIT_FAILURE;
+    }
+
+    if (libxl_cpu_bitmap_alloc(ctx, &cpumap, 0)) {
+        fprintf(stderr, "Failed to allocate cpumap\n");
+        goto out;
+    }
+
+    /* Reset Pool-0 to 1st node: first add cpus, then remove cpus to avoid
+       a cpupool without cpus in between */
+
+    node = topology[0].node;
+    if (libxl_cpupool_cpuadd_node(ctx, 0, node, &n)) {
+        fprintf(stderr, "error on adding cpu to Pool 0\n");
+        goto out;
+    }
+
+    xasprintf(&name, "Pool-node%d", node);
+    if (libxl_cpupool_rename(ctx, name, 0)) {
+        fprintf(stderr, "error on renaming Pool 0\n");
+        goto out;
+    }
+
+    n = 0;
+    for (c = 0; c < n_cpus; c++) {
+        if (topology[c].node == node) {
+            topology[c].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY;
+            libxl_bitmap_set(&cpumap, n);
+            n++;
+        }
+    }
+    if (libxl_domain_info(ctx, &info, 0)) {
+        fprintf(stderr, "error on getting info for Domain-0\n");
+        goto out;
+    }
+    if (info.vcpu_online > n && libxl_set_vcpuonline(ctx, 0, &cpumap)) {
+        fprintf(stderr, "error on removing vcpus for Domain-0\n");
+        goto out;
+    }
+    for (c = 0; c < 10; c++) {
+        /* We've called libxl_dominfo_init before the loop and will
+         * call libxl_dominfo_dispose after the loop when we're done
+         * with info.
+         */
+        libxl_dominfo_dispose(&info);
+        libxl_dominfo_init(&info);
+        if (libxl_domain_info(ctx, &info, 0)) {
+            fprintf(stderr, "error on getting info for Domain-0\n");
+            goto out;
+        }
+        if (info.vcpu_online <= n) {
+            break;
+        }
+        sleep(1);
+    }
+    if (info.vcpu_online > n) {
+        fprintf(stderr, "failed to offline vcpus\n");
+        goto out;
+    }
+    libxl_bitmap_set_none(&cpumap);
+
+    for (c = 0; c < n_cpus; c++) {
+        if (topology[c].node == LIBXL_CPUTOPOLOGY_INVALID_ENTRY) {
+            continue;
+        }
+
+        node = topology[c].node;
+        if (libxl_cpupool_cpuremove_node(ctx, 0, node, &n)) {
+            fprintf(stderr, "error on removing cpu from Pool 0\n");
+            goto out;
+        }
+
+        free(name);
+        xasprintf(&name, "Pool-node%d", node);
+        libxl_uuid_generate(&uuid);
+        poolid = 0;
+        if (libxl_cpupool_create(ctx, name, sched, cpumap, &uuid, &poolid)) {
+            fprintf(stderr, "error on creating cpupool\n");
+            goto out;
+        }
+
+        if (libxl_cpupool_cpuadd_node(ctx, poolid, node, &n)) {
+            fprintf(stderr, "error on adding cpus to cpupool\n");
+            goto out;
+        }
+
+        for (p = c; p < n_cpus; p++) {
+            if (topology[p].node == node) {
+                topology[p].node = LIBXL_CPUTOPOLOGY_INVALID_ENTRY;
+            }
+        }
+    }
+
+    rc = EXIT_SUCCESS;
+
+out:
+    libxl_cputopology_list_free(topology, n_cpus);
+    libxl_bitmap_dispose(&cpumap);
+    libxl_dominfo_dispose(&info);
+    free(name);
+
+    return rc;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.