[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 13/15] xl: enable getting and setting soft
Getting happens via `xl vcpu-list', which now looks like this: # xl vcpu-list -s Name ID VCPU CPU State Time(s) Affinity (Hard / Soft) Domain-0 0 0 11 -b- 5.4 8-15 / all Domain-0 0 1 11 -b- 1.0 8-15 / all Domain-0 0 14 13 -b- 1.4 8-15 / all Domain-0 0 15 8 -b- 1.6 8-15 / all vm-test 3 0 4 -b- 2.5 0-12 / 0-7 vm-test 3 1 0 -b- 3.2 0-12 / 0-7 Setting happens by adding a '-s'/'--soft' switch to `xl vcpu-pin'. xl manual page is updated accordingly. Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx> --- Changes from v3: * fix typos in doc, rephrased the help message and changed the title of the column for hard/soft affinity, as suggested during review. Changes from v2: * this patch folds what in v2 were patches 13 and 14; * `xl vcpu-pin' always shows both had and soft affinity, without the need of passing '-s'. --- docs/man/xl.pod.1 | 24 +++++++++++++++ tools/libxl/xl_cmdimpl.c | 70 +++++++++++++++++++++++++++------------------ tools/libxl/xl_cmdtable.c | 3 +- 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index e7b9de2..b738ca2 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -619,7 +619,7 @@ after B<vcpu-set>, go to B<SEE ALSO> section for information. Lists VCPU information for a specific domain. If no domain is specified, VCPU information for all domains will be provided. -=item B<vcpu-pin> I<domain-id> I<vcpu> I<cpus> +=item B<vcpu-pin> [I<OPTIONS>] I<domain-id> I<vcpu> I<cpus> Pins the VCPU to only run on the specific CPUs. The keyword B<all> can be used to apply the I<cpus> list to all VCPUs in the @@ -630,6 +630,28 @@ different run state is appropriate. Pinning can be used to restrict this, by ensuring certain VCPUs can only run on certain physical CPUs. +B<OPTIONS> + +=over 4 + +=item B<-s>, B<--soft> + +The same as above, but affect I<soft affinity> rather than pinning +(also called I<hard affinity>). + +Normally, VCPUs just wander among the CPUs where it is allowed to +run (either all the CPUs or the ones to which it is pinned, as said +for B<vcpu-list>). Soft affinity offers a means to specify one or +more I<preferred> CPUs. Basically, among the ones where it can run, +the VCPU the VCPU will greatly prefer to execute on one of these +CPUs, whenever that is possible. + +Notice that, in order for soft affinity to actually work, it needs +special support in the scheduler. Right now, only credit1 provides +that. + +=back + =item B<vm-list> Prints information about guests. This list excludes information about diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 17fffdd..d6fda26 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -4514,8 +4514,10 @@ static void print_vcpuinfo(uint32_t tdomid, } /* TIM */ printf("%9.1f ", ((float)vcpuinfo->vcpu_time / 1e9)); - /* CPU AFFINITY */ + /* 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"); } @@ -4550,7 +4552,8 @@ static void vcpulist(int argc, char **argv) } printf("%-32s %5s %5s %5s %5s %9s %s\n", - "Name", "ID", "VCPU", "CPU", "State", "Time(s)", "CPU Affinity"); + "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"); @@ -4583,17 +4586,33 @@ int main_vcpulist(int argc, char **argv) return 0; } -static int vcpupin(uint32_t domid, const char *vcpu, char *cpu) +int main_vcpupin(int argc, char **argv) { libxl_vcpuinfo *vcpuinfo; libxl_bitmap cpumap; - - uint32_t vcpuid; - char *endptr; - int i, nb_cpu, nb_vcpu, rc = -1; + uint32_t vcpuid, domid; + const char *vcpu; + char *endptr, *cpu; + int nb_cpu, nb_vcpu, rc = -1; + int opt, soft_affinity = 0; + static struct option opts[] = { + {"soft", 0, 0, 's'}, + COMMON_LONG_OPTS, + {0, 0, 0, 0} + }; libxl_bitmap_init(&cpumap); + SWITCH_FOREACH_OPT(opt, "s", opts, "vcpu-pin", 3) { + case 's': + soft_affinity = 1; + break; + } + + domid = find_domain(argv[optind]); + vcpu = argv[optind+1]; + cpu = argv[optind+2]; + vcpuid = strtoul(vcpu, &endptr, 10); if (vcpu == endptr) { if (strcmp(vcpu, "all")) { @@ -4630,23 +4649,29 @@ static int vcpupin(uint32_t domid, const char *vcpu, char *cpu) } if (vcpuid != -1) { - if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap, NULL)) { - fprintf(stderr, "Could not set affinity for vcpu `%u'.\n", vcpuid); + if (!soft_affinity && + libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap, NULL)) { + fprintf(stderr, "Could not set hard affinity for vcpu `%u'.\n", + vcpuid); + goto out; + } else if (soft_affinity && + libxl_set_vcpuaffinity(ctx, domid, vcpuid, NULL, &cpumap)) { + fprintf(stderr, "Could not set soft affinity for vcpu `%u'.\n", + vcpuid); goto out; } } else { - if (!(vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &i))) { + if (!(vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &nb_cpu))) { fprintf(stderr, "libxl_list_vcpu failed.\n"); goto out; } - for (i = 0; i < nb_vcpu; i++) { - if (libxl_set_vcpuaffinity(ctx, domid, vcpuinfo[i].vcpuid, - &cpumap, NULL)) { - fprintf(stderr, "libxl_set_vcpuaffinity failed" - " on vcpu `%u'.\n", vcpuinfo[i].vcpuid); - } - } + if (!soft_affinity && + libxl_set_vcpuaffinity_all(ctx, domid, nb_vcpu, &cpumap, NULL)) + fprintf(stderr, "Could not set hard affinity.\n"); + else if (soft_affinity && + libxl_set_vcpuaffinity_all(ctx, domid, nb_vcpu, NULL, &cpumap)) + fprintf(stderr, "Could not set soft affinity.\n"); libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); } @@ -4656,17 +4681,6 @@ static int vcpupin(uint32_t domid, const char *vcpu, char *cpu) return rc; } -int main_vcpupin(int argc, char **argv) -{ - int opt; - - SWITCH_FOREACH_OPT(opt, "", NULL, "vcpu-pin", 3) { - /* No options */ - } - - return vcpupin(find_domain(argv[optind]), argv[optind+1] , argv[optind+2]); -} - static void vcpuset(uint32_t domid, const char* nr_vcpus, int check_host) { char *endptr; diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index ebe0220..8aee343 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -213,7 +213,8 @@ struct cmd_spec cmd_table[] = { { "vcpu-pin", &main_vcpupin, 1, 1, "Set which CPUs a VCPU can use", - "<Domain> <VCPU|all> <CPUs|all>", + "[option] <Domain> <VCPU|all> <CPUs|all>", + "-s, --soft Set soft affinity", }, { "vcpu-set", &main_vcpuset, 0, 1, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |