[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 19/29] xl: split out vcpu related code
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/xl/Makefile | 2 +- tools/xl/xl_cmdimpl.c | 306 --------------------------------------------- tools/xl/xl_vcpu.c | 337 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 338 insertions(+), 307 deletions(-) create mode 100644 tools/xl/xl_vcpu.c diff --git a/tools/xl/Makefile b/tools/xl/Makefile index 0af1e92b65..e6e8cef710 100644 --- a/tools/xl/Makefile +++ b/tools/xl/Makefile @@ -18,7 +18,7 @@ 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_cpupool.o xl_flask.o XL_OBJS += xl_vtpm.o xl_block.o xl_nic.o xl_usb.o -XL_OBJS += xl_sched.o xl_pci.o +XL_OBJS += xl_sched.o xl_pci.o xl_vcpu.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 b32233e95e..faeac675ad 100644 --- a/tools/xl/xl_cmdimpl.c +++ b/tools/xl/xl_cmdimpl.c @@ -2885,312 +2885,6 @@ int main_button_press(int argc, char **argv) return 0; } -static void print_vcpuinfo(uint32_t tdomid, - const libxl_vcpuinfo *vcpuinfo, - uint32_t nr_cpus) -{ - char *domname; - - /* NAME ID VCPU */ - domname = libxl_domid_to_name(ctx, tdomid); - printf("%-32s %5u %5u", - domname, tdomid, vcpuinfo->vcpuid); - free(domname); - if (!vcpuinfo->online) { - /* CPU STA */ - printf("%5c %3c%cp ", '-', '-', '-'); - } else { - /* CPU STA */ - printf("%5u %3c%c- ", vcpuinfo->cpu, - vcpuinfo->running ? 'r' : '-', - vcpuinfo->blocked ? 'b' : '-'); - } - /* TIM */ - printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9)); - /* CPU HARD AND SOFT AFFINITY */ - print_bitmap(vcpuinfo->cpumap.map, nr_cpus, stdout); - printf(" / "); - print_bitmap(vcpuinfo->cpumap_soft.map, nr_cpus, stdout); - printf("\n"); -} - -static void print_domain_vcpuinfo(uint32_t domid, uint32_t nr_cpus) -{ - libxl_vcpuinfo *vcpuinfo; - int i, nb_vcpu, nrcpus; - - vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nrcpus); - - if (!vcpuinfo) - return; - - for (i = 0; i < nb_vcpu; i++) { - print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus); - } - - libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); -} - -static void vcpulist(int argc, char **argv) -{ - libxl_dominfo *dominfo; - libxl_physinfo physinfo; - int i, nb_domain; - - if (libxl_get_physinfo(ctx, &physinfo) != 0) { - fprintf(stderr, "libxl_physinfo failed.\n"); - goto vcpulist_out; - } - - printf("%-32s %5s %5s %5s %5s %9s %s\n", - "Name", "ID", "VCPU", "CPU", "State", "Time(s)", - "Affinity (Hard / Soft)"); - if (!argc) { - if (!(dominfo = libxl_list_domain(ctx, &nb_domain))) { - fprintf(stderr, "libxl_list_domain failed.\n"); - goto vcpulist_out; - } - - for (i = 0; i<nb_domain; i++) - print_domain_vcpuinfo(dominfo[i].domid, physinfo.nr_cpus); - - libxl_dominfo_list_free(dominfo, nb_domain); - } else { - for (; argc > 0; ++argv, --argc) { - uint32_t domid = xfind_domain(*argv); - print_domain_vcpuinfo(domid, physinfo.nr_cpus); - } - } - vcpulist_out: - libxl_physinfo_dispose(&physinfo); -} - -int main_vcpulist(int argc, char **argv) -{ - int opt; - - SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-list", 0) { - /* No options */ - } - - vcpulist(argc - optind, argv + optind); - return EXIT_SUCCESS; -} - -int main_vcpupin(int argc, char **argv) -{ - static struct option opts[] = { - {"force", 0, 0, 'f'}, - COMMON_LONG_OPTS - }; - libxl_vcpuinfo *vcpuinfo; - libxl_bitmap cpumap_hard, cpumap_soft;; - libxl_bitmap *soft = &cpumap_soft, *hard = &cpumap_hard; - uint32_t domid; - /* - * int would be enough for vcpuid, but we don't want to - * mess aroung range checking the return value of strtol(). - */ - long vcpuid; - const char *vcpu, *hard_str, *soft_str; - char *endptr; - int opt, nb_cpu, nb_vcpu, rc = EXIT_FAILURE; - bool force = false; - - libxl_bitmap_init(&cpumap_hard); - libxl_bitmap_init(&cpumap_soft); - - SWITCH_FOREACH_OPT(opt, "f", opts, "vcpu-pin", 3) { - case 'f': - force = true; - break; - default: - break; - } - - domid = xfind_domain(argv[optind]); - vcpu = argv[optind+1]; - hard_str = argv[optind+2]; - soft_str = (argc > optind+3) ? argv[optind+3] : NULL; - - /* Figure out with which vCPU we are dealing with */ - vcpuid = strtol(vcpu, &endptr, 10); - if (vcpu == endptr || vcpuid < 0) { - if (strcmp(vcpu, "all")) { - fprintf(stderr, "Error: Invalid argument %s as VCPU.\n", vcpu); - goto out; - } - if (force) { - fprintf(stderr, "Error: --force and 'all' as VCPU not allowed.\n"); - goto out; - } - vcpuid = -1; - } - - if (libxl_cpu_bitmap_alloc(ctx, &cpumap_hard, 0) || - libxl_cpu_bitmap_alloc(ctx, &cpumap_soft, 0)) - goto out; - - /* - * Syntax is: xl vcpu-pin <domid> <vcpu> <hard> <soft> - * We want to handle all the following cases ('-' means - * "leave it alone"): - * xl vcpu-pin 0 3 3,4 - * xl vcpu-pin 0 3 3,4 - - * xl vcpu-pin 0 3 - 6-9 - * xl vcpu-pin 0 3 3,4 6-9 - */ - - /* - * Hard affinity is always present. However, if it's "-", all we need - * is passing a NULL pointer to the libxl_set_vcpuaffinity() call below. - */ - if (!strcmp(hard_str, "-")) - hard = NULL; - else if (parse_cpurange(hard_str, hard)) - goto out; - /* - * Soft affinity is handled similarly. Only difference: we also want - * to pass NULL to libxl_set_vcpuaffinity() if it is not specified. - */ - if (argc <= optind+3 || !strcmp(soft_str, "-")) - soft = NULL; - else if (parse_cpurange(soft_str, soft)) - goto out; - - if (dryrun_only) { - nb_cpu = libxl_get_online_cpus(ctx); - if (nb_cpu < 0) { - fprintf(stderr, "libxl_get_online_cpus failed.\n"); - goto out; - } - - fprintf(stdout, "cpumap: "); - if (hard) - print_bitmap(hard->map, nb_cpu, stdout); - else - fprintf(stdout, "-"); - if (soft) { - fprintf(stdout, " "); - print_bitmap(soft->map, nb_cpu, stdout); - } - fprintf(stdout, "\n"); - - if (ferror(stdout) || fflush(stdout)) { - perror("stdout"); - exit(EXIT_FAILURE); - } - - rc = EXIT_SUCCESS; - goto out; - } - - if (force) { - if (libxl_set_vcpuaffinity_force(ctx, domid, vcpuid, hard, soft)) { - fprintf(stderr, "Could not set affinity for vcpu `%ld'.\n", - vcpuid); - goto out; - } - } - else if (vcpuid != -1) { - if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, hard, soft)) { - fprintf(stderr, "Could not set affinity for vcpu `%ld'.\n", - vcpuid); - goto out; - } - } else { - if (!(vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nb_cpu))) { - fprintf(stderr, "libxl_list_vcpu failed.\n"); - goto out; - } - if (libxl_set_vcpuaffinity_all(ctx, domid, nb_vcpu, hard, soft)) - fprintf(stderr, "Could not set affinity.\n"); - libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); - } - - rc = EXIT_SUCCESS; - out: - libxl_bitmap_dispose(&cpumap_soft); - libxl_bitmap_dispose(&cpumap_hard); - return rc; -} - -static int vcpuset(uint32_t domid, const char* nr_vcpus, int check_host) -{ - char *endptr; - unsigned int max_vcpus, i; - libxl_bitmap cpumap; - int rc; - - libxl_bitmap_init(&cpumap); - max_vcpus = strtoul(nr_vcpus, &endptr, 10); - if (nr_vcpus == endptr) { - fprintf(stderr, "Error: Invalid argument.\n"); - return 1; - } - - /* - * Maximum amount of vCPUS the guest is allowed to set is limited - * by the host's amount of pCPUs. - */ - if (check_host) { - unsigned int online_vcpus, host_cpu = libxl_get_max_cpus(ctx); - libxl_dominfo dominfo; - - if (libxl_domain_info(ctx, &dominfo, domid)) - return 1; - - online_vcpus = dominfo.vcpu_online; - libxl_dominfo_dispose(&dominfo); - - if (max_vcpus > online_vcpus && max_vcpus > host_cpu) { - fprintf(stderr, "You are overcommmitting! You have %d physical" \ - " CPUs and want %d vCPUs! Aborting, use --ignore-host to" \ - " continue\n", host_cpu, max_vcpus); - return 1; - } - } - rc = libxl_cpu_bitmap_alloc(ctx, &cpumap, max_vcpus); - if (rc) { - fprintf(stderr, "libxl_cpu_bitmap_alloc failed, rc: %d\n", rc); - return 1; - } - for (i = 0; i < max_vcpus; i++) - libxl_bitmap_set(&cpumap, i); - - rc = libxl_set_vcpuonline(ctx, domid, &cpumap); - if (rc == ERROR_DOMAIN_NOTFOUND) - fprintf(stderr, "Domain %u does not exist.\n", domid); - else if (rc) - fprintf(stderr, "libxl_set_vcpuonline failed domid=%u max_vcpus=%d," \ - " rc: %d\n", domid, max_vcpus, rc); - - libxl_bitmap_dispose(&cpumap); - return rc ? 1 : 0; -} - -int main_vcpuset(int argc, char **argv) -{ - static struct option opts[] = { - {"ignore-host", 0, 0, 'i'}, - COMMON_LONG_OPTS - }; - int opt, check_host = 1; - - SWITCH_FOREACH_OPT(opt, "i", opts, "vcpu-set", 2) { - case 'i': - check_host = 0; - break; - default: - break; - } - - if (vcpuset(xfind_domain(argv[optind]), argv[optind + 1], check_host)) - return EXIT_FAILURE; - - return EXIT_SUCCESS; -} - /* Possibly select a specific piece of `xl info` to print. */ static const char *info_name; static int maybe_printf(const char *fmt, ...) __attribute__((format(printf,1,2))); diff --git a/tools/xl/xl_vcpu.c b/tools/xl/xl_vcpu.c new file mode 100644 index 0000000000..4db96e7933 --- /dev/null +++ b/tools/xl/xl_vcpu.c @@ -0,0 +1,337 @@ +/* + * 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 <stdlib.h> + +#include <libxl.h> +#include <libxl_utils.h> +#include <libxlutil.h> + +#include "xl.h" +#include "xl_utils.h" +#include "xl_parse.h" + +static void print_vcpuinfo(uint32_t tdomid, + const libxl_vcpuinfo *vcpuinfo, + uint32_t nr_cpus) +{ + char *domname; + + /* NAME ID VCPU */ + domname = libxl_domid_to_name(ctx, tdomid); + printf("%-32s %5u %5u", + domname, tdomid, vcpuinfo->vcpuid); + free(domname); + if (!vcpuinfo->online) { + /* CPU STA */ + printf("%5c %3c%cp ", '-', '-', '-'); + } else { + /* CPU STA */ + printf("%5u %3c%c- ", vcpuinfo->cpu, + vcpuinfo->running ? 'r' : '-', + vcpuinfo->blocked ? 'b' : '-'); + } + /* TIM */ + printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9)); + /* CPU HARD AND SOFT AFFINITY */ + print_bitmap(vcpuinfo->cpumap.map, nr_cpus, stdout); + printf(" / "); + print_bitmap(vcpuinfo->cpumap_soft.map, nr_cpus, stdout); + printf("\n"); +} + +static void print_domain_vcpuinfo(uint32_t domid, uint32_t nr_cpus) +{ + libxl_vcpuinfo *vcpuinfo; + int i, nb_vcpu, nrcpus; + + vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nrcpus); + + if (!vcpuinfo) + return; + + for (i = 0; i < nb_vcpu; i++) { + print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus); + } + + libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); +} + +static void vcpulist(int argc, char **argv) +{ + libxl_dominfo *dominfo; + libxl_physinfo physinfo; + int i, nb_domain; + + if (libxl_get_physinfo(ctx, &physinfo) != 0) { + fprintf(stderr, "libxl_physinfo failed.\n"); + goto vcpulist_out; + } + + printf("%-32s %5s %5s %5s %5s %9s %s\n", + "Name", "ID", "VCPU", "CPU", "State", "Time(s)", + "Affinity (Hard / Soft)"); + if (!argc) { + if (!(dominfo = libxl_list_domain(ctx, &nb_domain))) { + fprintf(stderr, "libxl_list_domain failed.\n"); + goto vcpulist_out; + } + + for (i = 0; i<nb_domain; i++) + print_domain_vcpuinfo(dominfo[i].domid, physinfo.nr_cpus); + + libxl_dominfo_list_free(dominfo, nb_domain); + } else { + for (; argc > 0; ++argv, --argc) { + uint32_t domid = xfind_domain(*argv); + print_domain_vcpuinfo(domid, physinfo.nr_cpus); + } + } + vcpulist_out: + libxl_physinfo_dispose(&physinfo); +} + +int main_vcpulist(int argc, char **argv) +{ + int opt; + + SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-list", 0) { + /* No options */ + } + + vcpulist(argc - optind, argv + optind); + return EXIT_SUCCESS; +} + +int main_vcpupin(int argc, char **argv) +{ + static struct option opts[] = { + {"force", 0, 0, 'f'}, + COMMON_LONG_OPTS + }; + libxl_vcpuinfo *vcpuinfo; + libxl_bitmap cpumap_hard, cpumap_soft;; + libxl_bitmap *soft = &cpumap_soft, *hard = &cpumap_hard; + uint32_t domid; + /* + * int would be enough for vcpuid, but we don't want to + * mess aroung range checking the return value of strtol(). + */ + long vcpuid; + const char *vcpu, *hard_str, *soft_str; + char *endptr; + int opt, nb_cpu, nb_vcpu, rc = EXIT_FAILURE; + bool force = false; + + libxl_bitmap_init(&cpumap_hard); + libxl_bitmap_init(&cpumap_soft); + + SWITCH_FOREACH_OPT(opt, "f", opts, "vcpu-pin", 3) { + case 'f': + force = true; + break; + default: + break; + } + + domid = xfind_domain(argv[optind]); + vcpu = argv[optind+1]; + hard_str = argv[optind+2]; + soft_str = (argc > optind+3) ? argv[optind+3] : NULL; + + /* Figure out with which vCPU we are dealing with */ + vcpuid = strtol(vcpu, &endptr, 10); + if (vcpu == endptr || vcpuid < 0) { + if (strcmp(vcpu, "all")) { + fprintf(stderr, "Error: Invalid argument %s as VCPU.\n", vcpu); + goto out; + } + if (force) { + fprintf(stderr, "Error: --force and 'all' as VCPU not allowed.\n"); + goto out; + } + vcpuid = -1; + } + + if (libxl_cpu_bitmap_alloc(ctx, &cpumap_hard, 0) || + libxl_cpu_bitmap_alloc(ctx, &cpumap_soft, 0)) + goto out; + + /* + * Syntax is: xl vcpu-pin <domid> <vcpu> <hard> <soft> + * We want to handle all the following cases ('-' means + * "leave it alone"): + * xl vcpu-pin 0 3 3,4 + * xl vcpu-pin 0 3 3,4 - + * xl vcpu-pin 0 3 - 6-9 + * xl vcpu-pin 0 3 3,4 6-9 + */ + + /* + * Hard affinity is always present. However, if it's "-", all we need + * is passing a NULL pointer to the libxl_set_vcpuaffinity() call below. + */ + if (!strcmp(hard_str, "-")) + hard = NULL; + else if (parse_cpurange(hard_str, hard)) + goto out; + /* + * Soft affinity is handled similarly. Only difference: we also want + * to pass NULL to libxl_set_vcpuaffinity() if it is not specified. + */ + if (argc <= optind+3 || !strcmp(soft_str, "-")) + soft = NULL; + else if (parse_cpurange(soft_str, soft)) + goto out; + + if (dryrun_only) { + nb_cpu = libxl_get_online_cpus(ctx); + if (nb_cpu < 0) { + fprintf(stderr, "libxl_get_online_cpus failed.\n"); + goto out; + } + + fprintf(stdout, "cpumap: "); + if (hard) + print_bitmap(hard->map, nb_cpu, stdout); + else + fprintf(stdout, "-"); + if (soft) { + fprintf(stdout, " "); + print_bitmap(soft->map, nb_cpu, stdout); + } + fprintf(stdout, "\n"); + + if (ferror(stdout) || fflush(stdout)) { + perror("stdout"); + exit(EXIT_FAILURE); + } + + rc = EXIT_SUCCESS; + goto out; + } + + if (force) { + if (libxl_set_vcpuaffinity_force(ctx, domid, vcpuid, hard, soft)) { + fprintf(stderr, "Could not set affinity for vcpu `%ld'.\n", + vcpuid); + goto out; + } + } + else if (vcpuid != -1) { + if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, hard, soft)) { + fprintf(stderr, "Could not set affinity for vcpu `%ld'.\n", + vcpuid); + goto out; + } + } else { + if (!(vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nb_cpu))) { + fprintf(stderr, "libxl_list_vcpu failed.\n"); + goto out; + } + if (libxl_set_vcpuaffinity_all(ctx, domid, nb_vcpu, hard, soft)) + fprintf(stderr, "Could not set affinity.\n"); + libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); + } + + rc = EXIT_SUCCESS; + out: + libxl_bitmap_dispose(&cpumap_soft); + libxl_bitmap_dispose(&cpumap_hard); + return rc; +} + +static int vcpuset(uint32_t domid, const char* nr_vcpus, int check_host) +{ + char *endptr; + unsigned int max_vcpus, i; + libxl_bitmap cpumap; + int rc; + + libxl_bitmap_init(&cpumap); + max_vcpus = strtoul(nr_vcpus, &endptr, 10); + if (nr_vcpus == endptr) { + fprintf(stderr, "Error: Invalid argument.\n"); + return 1; + } + + /* + * Maximum amount of vCPUS the guest is allowed to set is limited + * by the host's amount of pCPUs. + */ + if (check_host) { + unsigned int online_vcpus, host_cpu = libxl_get_max_cpus(ctx); + libxl_dominfo dominfo; + + if (libxl_domain_info(ctx, &dominfo, domid)) + return 1; + + online_vcpus = dominfo.vcpu_online; + libxl_dominfo_dispose(&dominfo); + + if (max_vcpus > online_vcpus && max_vcpus > host_cpu) { + fprintf(stderr, "You are overcommmitting! You have %d physical" \ + " CPUs and want %d vCPUs! Aborting, use --ignore-host to" \ + " continue\n", host_cpu, max_vcpus); + return 1; + } + } + rc = libxl_cpu_bitmap_alloc(ctx, &cpumap, max_vcpus); + if (rc) { + fprintf(stderr, "libxl_cpu_bitmap_alloc failed, rc: %d\n", rc); + return 1; + } + for (i = 0; i < max_vcpus; i++) + libxl_bitmap_set(&cpumap, i); + + rc = libxl_set_vcpuonline(ctx, domid, &cpumap); + if (rc == ERROR_DOMAIN_NOTFOUND) + fprintf(stderr, "Domain %u does not exist.\n", domid); + else if (rc) + fprintf(stderr, "libxl_set_vcpuonline failed domid=%u max_vcpus=%d," \ + " rc: %d\n", domid, max_vcpus, rc); + + libxl_bitmap_dispose(&cpumap); + return rc ? 1 : 0; +} + +int main_vcpuset(int argc, char **argv) +{ + static struct option opts[] = { + {"ignore-host", 0, 0, 'i'}, + COMMON_LONG_OPTS + }; + int opt, check_host = 1; + + SWITCH_FOREACH_OPT(opt, "i", opts, "vcpu-set", 2) { + case 'i': + check_host = 0; + break; + default: + break; + } + + if (vcpuset(xfind_domain(argv[optind]), argv[optind + 1], check_host)) + return EXIT_FAILURE; + + return EXIT_SUCCESS; +} + +/* + * 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |