From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dario Faggioli Subject: [PATCH v2 14/16] xl: enable setting soft affinity Date: Wed, 13 Nov 2013 20:13:07 +0100 Message-ID: <20131113191307.18086.70669.stgit@Solace> References: <20131113190852.18086.5437.stgit@Solace> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20131113190852.18086.5437.stgit@Solace> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Marcus Granado , Keir Fraser , Ian Campbell , Li Yechen , George Dunlap , Andrew Cooper , Juergen Gross , Ian Jackson , Jan Beulich , Justin Weaver , Matt Wilson , Elena Ufimtseva List-Id: xen-devel@lists.xenproject.org Also by adding a '-s'/'--soft' switch to `xl vcpu-pin'. Signed-off-by: Dario Faggioli --- docs/man/xl.pod.1 | 24 ++++++++++++++++- tools/libxl/xl_cmdimpl.c | 65 +++++++++++++++++++++++++++------------------ tools/libxl/xl_cmdtable.c | 3 +- 3 files changed, 64 insertions(+), 28 deletions(-) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index c41d98f..e16c331 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -629,7 +629,7 @@ Print the CPU soft affinity of each VCPU too. =back -=item B I I I +=item B [I] I I I Pins the VCPU to only run on the specific CPUs. The keyword B can be used to apply the I list to all VCPUs in the @@ -640,6 +640,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 + +=over 4 + +=item B<-s>, B<--soft> + +The same as above, but affect I rather than pinning +(also called I). + +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). Soft affinity offer a mean to specify one or more +I CPUs. Basically, among the ones where it can run, the +VCPU the VCPU will greately 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 Prints information about guests. This list excludes information about diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 543d19d..5a66d63 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -4583,17 +4583,33 @@ int main_vcpulist(int argc, char **argv) return rc; } -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; + uint32_t vcpuid, domid; + const char *vcpu; + char *endptr, *cpu; int i = 0, 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")) { @@ -4632,22 +4648,30 @@ static int vcpupin(uint32_t domid, const char *vcpu, char *cpu) } if (vcpuid != -1) { - if (libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap) == -1) { + int ret; + + if (soft_affinity) + ret = libxl_set_vcpuaffinity_soft(ctx, domid, vcpuid, &cpumap); + else + ret = libxl_set_vcpuaffinity(ctx, domid, vcpuid, &cpumap); + if (ret) fprintf(stderr, "Could not set affinity for vcpu `%u'.\n", vcpuid); - } - } - else { + } else { + int ret; + if (!(vcpuinfo = libxl_list_vcpu(ctx, domid, &nb_vcpu, &i))) { 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) == -1) { - fprintf(stderr, "libxl_set_vcpuaffinity failed" - " on vcpu `%u'.\n", vcpuinfo[i].vcpuid); - } - } + + if (soft_affinity) + ret = libxl_set_vcpuaffinity_all_soft(ctx, domid, nb_vcpu, + &cpumap); + else + ret = libxl_set_vcpuaffinity_all(ctx, domid, nb_vcpu, &cpumap); + if (ret) + fprintf(stderr, "libxl_set_vcpuaffinity failed on vcpu `%u'.\n", + vcpuinfo[i].vcpuid); libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu); } @@ -4657,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 4f651e2..c6c7590 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -214,7 +214,8 @@ struct cmd_spec cmd_table[] = { { "vcpu-pin", &main_vcpupin, 1, 1, "Set which CPUs a VCPU can use", - " ", + "[option] ", + "-s, --soft Deal with soft affinity", }, { "vcpu-set", &main_vcpuset, 0, 1,