[PATCH v3 9/9] virsh: Allow setting of the iothread pin

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

 



https://bugzilla.redhat.com/show_bug.cgi?id=1135491

$ virsh iothreads --help
  NAME
    iothreads - view domain IOThreads

  SYNOPSIS
    iothreads <domain> [--iothread_id <number>] [--cpulist <string>] [--config] [--live] [--current]

  DESCRIPTION
    Returns basic information about the domain IOThreads.

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    --iothread_id <number>  iothread_id number
    --cpulist <string>  host cpu number(s) to set affinity
    --config         affect next boot
    --live           affect running domain
    --current        affect current domain

The changes will now also allow viewing just one iothread if so
desired, such as:

$ virsh iothreads f18iothr 2
 IOThread ID     CPU Affinity    Resource(s)
 -----------------------------------------------------------------
  2               3              /home/vm-images/iothr-vol1

In order to change the IOThread pinning, the following would be used:

$ virsh iothreads f18iothr 2 0,1

Then to view the change:

$ virsh iothreads f18iothr 2
 IOThread ID     CPU Affinity    Resource(s)
 -----------------------------------------------------------------
  2               0-1            /home/vm-images/iothr-vol1

$

If an invalid value is supplied, an error will be displayed

$ virsh iothreads f18iothr 4 3
error: invalid argument: iothread value out of range 4 > 3

$

Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx>
---
 tools/virsh-domain.c | 99 ++++++++++++++++++++++++++++++++++++++++------------
 tools/virsh.pod      | 24 ++++++++-----
 2 files changed, 92 insertions(+), 31 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index ffb0392..66757eb 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6814,6 +6814,15 @@ static const vshCmdOptDef opts_iothreads[] = {
      .flags = VSH_OFLAG_REQ,
      .help = N_("domain name, id or uuid")
     },
+    {.name = "iothread_id",
+     .type = VSH_OT_INT,
+     .help = N_("iothread_id number")
+    },
+    {.name = "cpulist",
+     .type = VSH_OT_STRING,
+     .flags = VSH_OFLAG_EMPTY_OK,
+     .help = N_("host cpu number(s) to set affinity")
+    },
     {.name = "config",
      .type = VSH_OT_BOOL,
      .help = N_("affect next boot")
@@ -6840,6 +6849,13 @@ cmdIOThreadsInfo(vshControl *ctl, const vshCmd *cmd)
     virDomainIOThreadsInfoPtr *info;
     size_t i, j;
     int maxcpu;
+    bool ret = false;
+    bool query = false; /* Query mode if no cpulist */
+    unsigned int iothread_val = 0;
+    int got_iothread;
+    unsigned char *cpumap = NULL;
+    size_t cpumaplen;
+    const char *cpulist = NULL;
     unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
 
     VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
@@ -6850,45 +6866,82 @@ cmdIOThreadsInfo(vshControl *ctl, const vshCmd *cmd)
     if (live)
         flags |= VIR_DOMAIN_AFFECT_LIVE;
 
+    if (vshCommandOptStringReq(ctl, cmd, "cpulist", &cpulist) < 0)
+        return false;
+
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return false;
 
-    if ((maxcpu = vshNodeGetCPUCount(ctl->conn)) < 0)
-        goto cleanup;
+    query = !cpulist;
 
-    if ((niothreads = virDomainGetIOThreadsInfo(dom, &info, flags)) < 0) {
-        vshError(ctl, _("Unable to get domain IOThreads information"));
+    if ((got_iothread = vshCommandOptUInt(cmd, "iothread_id",
+                                          &iothread_val)) < 0) {
+        vshError(ctl, "%s", _("iothreads: Invalid IOThread number."));
         goto cleanup;
     }
 
-    if (niothreads == 0) {
-        vshError(ctl, _("No IOThreads found for the domain"));
+    /* In set mode, "iothread_val" is necessary */
+    if (!query && got_iothread == 0) {
+        vshError(ctl, "%s", _("iothreads: set missing IOThreads number."));
         goto cleanup;
     }
 
-    vshPrintExtra(ctl, " %-15s %-15s %-15s\n",
-                  _("IOThread ID"), _("CPU Affinity"), _("Resource(s)"));
-    vshPrintExtra(ctl, "-----------------------------------------------------------------\n");
-    for (i = 0; i < niothreads; i++) {
+    if ((maxcpu = vshNodeGetCPUCount(ctl->conn)) < 0)
+        goto cleanup;
 
-        vshPrintExtra(ctl, " %-15u ", info[i]->iothread_id);
-        ignore_value(vshPrintPinInfo(info[i]->cpumap, info[i]->cpumaplen,
-                                     maxcpu, 0));
-        for (j = 0; j < info[i]->nresources; j++) {
-            if (j == 0)
-                vshPrintExtra(ctl, "\t\t %s", info[i]->resources[j]);
-            else
-                vshPrintExtra(ctl, "\n %-15s %s\t\t %s",
-                              " ", " ", info[i]->resources[j]);
+    /* Query mode: show CPU affinity information then exit.*/
+    if (query) {
+        if ((niothreads = virDomainGetIOThreadsInfo(dom, &info, flags)) < 0) {
+            vshError(ctl, _("Unable to get domain IOThreads information"));
+            goto cleanup;
         }
-        vshPrint(ctl, "\n");
-        virDomainIOThreadsInfoFree(info[i]);
+
+        if (niothreads == 0) {
+            vshError(ctl, _("No IOThreads found for the domain"));
+            ret = true;
+            goto cleanup;
+        }
+
+        vshPrintExtra(ctl, " %-15s %-15s %-15s\n",
+                      _("IOThread ID"), _("CPU Affinity"), _("Resource(s)"));
+        vshPrintExtra(ctl, "-----------------------------------------------------------------\n");
+        for (i = 0; i < niothreads; i++) {
+
+            if (iothread_val && (i + 1) != iothread_val)
+                continue;
+            vshPrintExtra(ctl, " %-15u ", info[i]->iothread_id);
+            ignore_value(vshPrintPinInfo(info[i]->cpumap, info[i]->cpumaplen,
+                                         maxcpu, 0));
+            for (j = 0; j < info[i]->nresources; j++) {
+                if (j == 0)
+                    vshPrintExtra(ctl, "\t\t %s", info[i]->resources[j]);
+                else
+                    vshPrintExtra(ctl, "\n %-15s %s\t\t %s",
+                                  " ", " ", info[i]->resources[j]);
+            }
+            vshPrint(ctl, "\n");
+            virDomainIOThreadsInfoFree(info[i]);
+        }
+        VIR_FREE(info);
+        ret = true;
+        goto cleanup;
     }
-    VIR_FREE(info);
+
+    /* We are pinning specified iothread_val to specified physical cpus */
+    cpumaplen = VIR_CPU_MAPLEN(maxcpu);
+    if (!(cpumap = vshParseCPUList(ctl, cpulist, maxcpu, cpumaplen)))
+        goto cleanup;
+
+    flags |= VIR_DOMAIN_IOTHREADS_PIN;
+    if (virDomainSetIOThreads(dom, iothread_val,
+                              cpumap, cpumaplen, flags) < 0)
+        goto cleanup;
+
+    ret = true;
 
  cleanup:
     virDomainFree(dom);
-    return niothreads >= 0;
+    return ret;
 }
 
 /*
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 22e988b..8b75476 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1360,17 +1360,25 @@ If I<--timeout> is specified, the command gives up waiting for events
 after I<seconds> have elapsed.   With I<--loop>, the command prints all
 events until a timeout or interrupt key.
 
-=item B<iothreads> I<domain> [[I<--live>] [I<--config>] | [I<--current>]]
+=item B<iothreads> I<domain> [I<iothread_id>] [I<cpulist>]
+[[I<--live>] [I<--config>] | [I<--current>]]
 
-Display basic domain IOThreads information including the IOThread ID,
-the CPU Affinity, and Resources assigned to each IOThread.
+Query or change the IOThreads information for the domain. To display the
+basic IOThread information including the IOThread ID, CPU Affinity, and
+Resources associated with each IOThread omit both the I<iothread_id> and
+I<cpulist>.
 
-If I<--live> is specified, get the IOThreads data from the running guest. If
-the guest is not running, an error is returned.
-If I<--config> is specified, get the IOThreads data from the next boot of
-a persistent guest.
+The I<iothread_id> may be used to query a specific IOThread ID or it can
+be omitted to list all the IOThreads for the domain. It must be used in
+order to set the I<cpulist> for a specific IOThread ID.
+See B<vcpupin> for I<cpulist>.
+If I<--live> is specified, affect a running guest. If the guest is not running,
+an error is returned.
+If I<--config> is specified, affect the next boot of a persistent guest.
 If I<--current> is specified or I<--live> and I<--config> are not specified,
-then get the IOThread data based on the current guest state.
+affect the current guest state.
+Both I<--live> and I<--config> flags may be given if I<cpulist> is present,
+but I<--current> is exclusive.
 
 =item B<managedsave> I<domain> [I<--bypass-cache>]
 [{I<--running> | I<--paused>}] [I<--verbose>]
-- 
2.1.0

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]