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

[Xen-devel] [PATCH v2 14/16] xl: enable setting soft affinity



Also by adding a '-s'/'--soft' switch to `xl vcpu-pin'.

Signed-off-by: Dario Faggioli <dario.faggioli@xxxxxxxxxx>
---
 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<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
@@ -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<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 offer a mean to specify one or more
+I<preferred> 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<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 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",
-      "<Domain> <VCPU|all> <CPUs|all>",
+      "[option] <Domain> <VCPU|all> <CPUs|all>",
+      "-s, --soft         Deal with soft affinity",
     },
     { "vcpu-set",
       &main_vcpuset, 0, 1,


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


 


Rackspace

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