xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Dario Faggioli <dario.faggioli@citrix.com>
To: xen-devel@lists.xen.org
Cc: Marcus Granado <Marcus.Granado@eu.citrix.com>,
	Keir Fraser <keir@xen.org>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Li Yechen <lccycc123@gmail.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Andrew Cooper <Andrew.Cooper3@citrix.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>,
	Justin Weaver <jtweaver@hawaii.edu>, Matt Wilson <msw@amazon.com>,
	Elena Ufimtseva <ufimtseva@gmail.com>
Subject: [PATCH v4 13/15] xl: enable getting and setting soft
Date: Fri, 22 Nov 2013 19:58:24 +0100	[thread overview]
Message-ID: <20131122185824.11200.88571.stgit@Solace> (raw)
In-Reply-To: <20131122183332.11200.20231.stgit@Solace>

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@citrix.com>
---
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,

  parent reply	other threads:[~2013-11-22 18:58 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-22 18:56 [PATCH v4 00/15] Implement vcpu soft affinity for credit1 Dario Faggioli
2013-11-22 18:56 ` [PATCH v4 01/15] xl: match output of vcpu-list with pinning syntax Dario Faggioli
2013-11-22 18:56 ` [PATCH v4 02/15] libxl: sanitize error handling in libxl_get_max_{cpus, nodes} Dario Faggioli
2013-11-25 17:26   ` George Dunlap
2013-11-27 13:45   ` Ian Campbell
2013-12-02 18:21     ` Dario Faggioli
2013-12-03  9:41       ` Ian Campbell
2013-12-03 11:40         ` Dario Faggioli
2013-12-03 11:45           ` Ian Campbell
2013-12-03 12:06             ` Dario Faggioli
2013-12-03 17:40               ` Ian Jackson
2013-11-22 18:56 ` [PATCH v4 03/15] libxl: introduce libxl_get_nr_cpus() Dario Faggioli
2013-11-27 13:49   ` Ian Campbell
2013-12-03 17:48   ` Ian Jackson
2013-12-03 17:52     ` Dario Faggioli
2013-12-03 17:54       ` Ian Jackson
2013-12-03 18:09         ` George Dunlap
2013-12-03 18:17           ` Konrad Rzeszutek Wilk
2013-12-03 18:22             ` George Dunlap
2013-12-03 18:26             ` Dario Faggioli
2013-12-03 18:19           ` Dario Faggioli
2013-12-03 18:15         ` Dario Faggioli
2013-12-03 18:16           ` Ian Jackson
2013-11-22 18:57 ` [PATCH v4 04/15] xl: allow for node-wise specification of vcpu pinning Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 05/15] xl: implement and enable dryrun mode for `xl vcpu-pin' Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 06/15] xl: test script for the cpumap parser (for vCPU pinning) Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 07/15] xen: sched: rename v->cpu_affinity into v->cpu_hard_affinity Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 08/15] xen: sched: introduce soft-affinity and use it instead d->node-affinity Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 09/15] xen: derive NUMA node affinity from hard and soft CPU affinity Dario Faggioli
2013-11-22 18:57 ` [PATCH v4 10/15] xen: sched: DOMCTL_*vcpuaffinity works with hard and soft affinity Dario Faggioli
2013-11-27 13:11   ` Jan Beulich
2013-11-27 14:17     ` George Dunlap
2013-11-27 14:31       ` Dario Faggioli
2013-11-22 18:58 ` [PATCH v4 11/15] libxc: get and set soft and hard affinity Dario Faggioli
2013-11-22 18:58 ` [PATCH v4 12/15] libxl: get and set soft affinity Dario Faggioli
2013-11-25 17:52   ` George Dunlap
2013-11-27 14:45   ` Ian Campbell
2013-12-02 18:17     ` Dario Faggioli
2013-12-03  9:35       ` Ian Campbell
2013-11-22 18:58 ` Dario Faggioli [this message]
2013-11-27 14:57   ` [PATCH v4 13/15] xl: enable getting and setting soft Ian Campbell
2013-12-02 18:10     ` Dario Faggioli
2013-12-03  9:32       ` Ian Campbell
2013-12-03 10:27         ` Dario Faggioli
2013-12-03 10:59           ` Ian Campbell
2013-12-03 11:14             ` Dario Faggioli
2013-12-03 11:18               ` Ian Campbell
2013-11-22 18:58 ` [PATCH v4 14/15] xl: enable for specifying node-affinity in the config file Dario Faggioli
2013-11-27 15:53   ` Ian Campbell
2013-12-02 18:22     ` Dario Faggioli
2013-11-22 18:58 ` [PATCH v4 15/15] libxl: automatic NUMA placement affects soft affinity Dario Faggioli
2013-11-27 15:55   ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20131122185824.11200.88571.stgit@Solace \
    --to=dario.faggioli@citrix.com \
    --cc=Andrew.Cooper3@citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=Marcus.Granado@eu.citrix.com \
    --cc=george.dunlap@eu.citrix.com \
    --cc=jtweaver@hawaii.edu \
    --cc=juergen.gross@ts.fujitsu.com \
    --cc=keir@xen.org \
    --cc=lccycc123@gmail.com \
    --cc=msw@amazon.com \
    --cc=ufimtseva@gmail.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).