6ae9ed
From e40f868e4f974ea0bd7224f5d49e602cf2947570 Mon Sep 17 00:00:00 2001
6ae9ed
Message-Id: <e40f868e4f974ea0bd7224f5d49e602cf2947570@dist-git>
6ae9ed
From: John Ferlan <jferlan@redhat.com>
6ae9ed
Date: Tue, 6 Sep 2016 16:43:13 -0400
6ae9ed
Subject: [PATCH] conf: Add IOThread quota and period scheduler/cputune defs
6ae9ed
6ae9ed
https://bugzilla.redhat.com/show_bug.cgi?id=1356937
6ae9ed
6ae9ed
Add the definitions to allow for viewing/setting cgroup period and quota
6ae9ed
limits for IOThreads.
6ae9ed
6ae9ed
This is similar to the work done for emulator quota and period by
6ae9ed
commit ids 'b65dafa' and 'e051c482'.
6ae9ed
6ae9ed
Being able to view/set the IOThread specific values is related to more
6ae9ed
recent changes adding global period (commmit id '4d92d58f') and global
6ae9ed
quota (commit id '55ecdae') definitions and qemu support (commit id
6ae9ed
'4e17ff79' and 'fbcbd1b2'). With a global setting though, if somehow
6ae9ed
the IOThread value in the cgroup hierarchy was set "outside of libvirt"
6ae9ed
to a value that is incompatible with the global value.
6ae9ed
6ae9ed
Allowing control over IOThread specific values provides the capability
6ae9ed
to alter the IOThread values as necessary.
6ae9ed
6ae9ed
(cherry picked from commit 2197ea56d77ad3da2e838115eed71d2ad393a082)
6ae9ed
Signed-off-by: John Ferlan <jferlan@redhat.com>
6ae9ed
---
6ae9ed
 docs/formatdomain.html.in                          | 25 +++++++++++++
6ae9ed
 docs/schemas/domaincommon.rng                      | 10 ++++++
6ae9ed
 include/libvirt/libvirt-domain.h                   | 32 +++++++++++++++++
6ae9ed
 src/conf/domain_conf.c                             | 42 ++++++++++++++++++++++
6ae9ed
 src/conf/domain_conf.h                             |  2 ++
6ae9ed
 tests/qemuxml2argvdata/qemuxml2argv-cputune.xml    |  2 ++
6ae9ed
 .../qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml  |  2 ++
6ae9ed
 tools/virsh.pod                                    |  9 ++---
6ae9ed
 8 files changed, 120 insertions(+), 4 deletions(-)
6ae9ed
6ae9ed
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
6ae9ed
index c080bdf..5b4f83e 100644
6ae9ed
--- a/docs/formatdomain.html.in
6ae9ed
+++ b/docs/formatdomain.html.in
6ae9ed
@@ -665,6 +665,8 @@
6ae9ed
     <quota>-1</quota>
6ae9ed
     <emulator_period>1000000</emulator_period>
6ae9ed
     <emulator_quota>-1</emulator_quota>
6ae9ed
+    <iothread_period>1000000</iothread_period>
6ae9ed
+    <iothread_quota>-1</iothread_quota>
6ae9ed
     <vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
6ae9ed
     <iothreadsched iothreads='2' scheduler='batch'/>
6ae9ed
   </cputune>
6ae9ed
@@ -769,6 +771,29 @@
6ae9ed
         Only QEMU driver support since 0.10.0
6ae9ed
       
6ae9ed
 
6ae9ed
+      
iothread_period
6ae9ed
+      
6ae9ed
+        The optional iothread_period element specifies the
6ae9ed
+        enforcement interval(unit: microseconds) for IOThreads. Within
6ae9ed
+        iothread_period, each IOThread of the domain will
6ae9ed
+        not be allowed to consume more than iothread_quota
6ae9ed
+        worth of runtime. The value should be in range [1000, 1000000].
6ae9ed
+        An iothread_period with value 0 means no value.
6ae9ed
+        Only QEMU driver support since 2.1.0
6ae9ed
+      
6ae9ed
+      
iothread_quota
6ae9ed
+      
6ae9ed
+        The optional iothread_quota element specifies the maximum
6ae9ed
+        allowed bandwidth(unit: microseconds) for IOThreads. A domain with
6ae9ed
+        iothread_quota as any negative value indicates that the
6ae9ed
+        domain IOThreads have infinite bandwidth, which means that it is
6ae9ed
+        not bandwidth controlled. The value should be in range
6ae9ed
+        [1000, 18446744073709551] or less than 0. An iothread_quota
6ae9ed
+        with value 0 means no value. You can use this feature to ensure that
6ae9ed
+        all IOThreads run at the same speed.
6ae9ed
+        Only QEMU driver support since 2.1.0
6ae9ed
+      
6ae9ed
+
6ae9ed
       
vcpusched and iothreadsched
6ae9ed
       
6ae9ed
         The optional vcpusched elements specifies the scheduler
6ae9ed
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
6ae9ed
index bf4d795..44e39c8 100644
6ae9ed
--- a/docs/schemas/domaincommon.rng
6ae9ed
+++ b/docs/schemas/domaincommon.rng
6ae9ed
@@ -764,6 +764,16 @@
6ae9ed
             <ref name="cpuquota"/>
6ae9ed
           </element>
6ae9ed
         </optional>
6ae9ed
+        <optional>
6ae9ed
+          <element name="iothread_period">
6ae9ed
+            <ref name="cpuperiod"/>
6ae9ed
+          </element>
6ae9ed
+        </optional>
6ae9ed
+        <optional>
6ae9ed
+          <element name="iothread_quota">
6ae9ed
+            <ref name="cpuquota"/>
6ae9ed
+          </element>
6ae9ed
+        </optional>
6ae9ed
         <zeroOrMore>
6ae9ed
           <element name="vcpupin">
6ae9ed
             <attribute name="vcpu">
6ae9ed
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
6ae9ed
index 7ea93aa..af3ecae 100644
6ae9ed
--- a/include/libvirt/libvirt-domain.h
6ae9ed
+++ b/include/libvirt/libvirt-domain.h
6ae9ed
@@ -365,6 +365,22 @@ typedef enum {
6ae9ed
 # define VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA "emulator_quota"
6ae9ed
 
6ae9ed
 /**
6ae9ed
+ * VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD:
6ae9ed
+ *
6ae9ed
+ * Macro represents the enforcement period for a quota, in microseconds,
6ae9ed
+ * for IOThreads only, when using the posix scheduler, as a ullong.
6ae9ed
+ */
6ae9ed
+# define VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD "iothread_period"
6ae9ed
+
6ae9ed
+/**
6ae9ed
+ * VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA:
6ae9ed
+ *
6ae9ed
+ * Macro represents the maximum bandwidth to be used within a period for
6ae9ed
+ * IOThreads only, when using the posix scheduler, as an llong.
6ae9ed
+ */
6ae9ed
+# define VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA "iothread_quota"
6ae9ed
+
6ae9ed
+/**
6ae9ed
  * VIR_DOMAIN_SCHEDULER_WEIGHT:
6ae9ed
  *
6ae9ed
  * Macro represents the relative weight,  when using the credit
6ae9ed
@@ -3604,6 +3620,22 @@ typedef void (*virConnectDomainEventJobCompletedCallback)(virConnectPtr conn,
6ae9ed
 # define VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA "cputune.emulator_quota"
6ae9ed
 
6ae9ed
 /**
6ae9ed
+ * VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD:
6ae9ed
+ *
6ae9ed
+ * Macro represents the enforcement period for a quota, in microseconds, for
6ae9ed
+ * iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG.
6ae9ed
+ */
6ae9ed
+# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD "cputune.iothread_period"
6ae9ed
+
6ae9ed
+/**
6ae9ed
+ * VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA:
6ae9ed
+ *
6ae9ed
+ * Macro represents the maximum bandwidth to be used within a period for
6ae9ed
+ * iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_LLONG.
6ae9ed
+ */
6ae9ed
+# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA "cputune.iothread_quota"
6ae9ed
+
6ae9ed
+/**
6ae9ed
  * VIR_DOMAIN_TUNABLE_BLKDEV_DISK:
6ae9ed
  *
6ae9ed
  * Macro represents the name of guest disk for which the values are updated,
6ae9ed
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
6ae9ed
index 261684e..67c7971 100644
6ae9ed
--- a/src/conf/domain_conf.c
6ae9ed
+++ b/src/conf/domain_conf.c
6ae9ed
@@ -16343,6 +16343,38 @@ virDomainDefParseXML(xmlDocPtr xml,
6ae9ed
         goto error;
6ae9ed
     }
6ae9ed
 
6ae9ed
+    if (virXPathULongLong("string(./cputune/iothread_period[1])", ctxt,
6ae9ed
+                          &def->cputune.iothread_period) < -1) {
6ae9ed
+        virReportError(VIR_ERR_XML_ERROR, "%s",
6ae9ed
+                       _("can't parse cputune iothread period value"));
6ae9ed
+        goto error;
6ae9ed
+    }
6ae9ed
+
6ae9ed
+    if (def->cputune.iothread_period > 0 &&
6ae9ed
+        (def->cputune.iothread_period < 1000 ||
6ae9ed
+         def->cputune.iothread_period > 1000000)) {
6ae9ed
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
6ae9ed
+                       _("Value of cputune iothread_period must be in range "
6ae9ed
+                         "[1000, 1000000]"));
6ae9ed
+        goto error;
6ae9ed
+    }
6ae9ed
+
6ae9ed
+    if (virXPathLongLong("string(./cputune/iothread_quota[1])", ctxt,
6ae9ed
+                         &def->cputune.iothread_quota) < -1) {
6ae9ed
+        virReportError(VIR_ERR_XML_ERROR, "%s",
6ae9ed
+                       _("can't parse cputune iothread quota value"));
6ae9ed
+        goto error;
6ae9ed
+    }
6ae9ed
+
6ae9ed
+    if (def->cputune.iothread_quota > 0 &&
6ae9ed
+        (def->cputune.iothread_quota < 1000 ||
6ae9ed
+         def->cputune.iothread_quota > 18446744073709551LL)) {
6ae9ed
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
6ae9ed
+                       _("Value of cputune iothread_quota must be in range "
6ae9ed
+                         "[1000, 18446744073709551]"));
6ae9ed
+        goto error;
6ae9ed
+    }
6ae9ed
+
6ae9ed
     if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0)
6ae9ed
         goto error;
6ae9ed
 
6ae9ed
@@ -22975,6 +23007,16 @@ virDomainCputuneDefFormat(virBufferPtr buf,
6ae9ed
                           "</emulator_quota>\n",
6ae9ed
                           def->cputune.emulator_quota);
6ae9ed
 
6ae9ed
+    if (def->cputune.iothread_period)
6ae9ed
+        virBufferAsprintf(&childrenBuf, "<iothread_period>%llu"
6ae9ed
+                          "</iothread_period>\n",
6ae9ed
+                          def->cputune.iothread_period);
6ae9ed
+
6ae9ed
+    if (def->cputune.iothread_quota)
6ae9ed
+        virBufferAsprintf(&childrenBuf, "<iothread_quota>%lld"
6ae9ed
+                          "</iothread_quota>\n",
6ae9ed
+                          def->cputune.iothread_quota);
6ae9ed
+
6ae9ed
     for (i = 0; i < def->maxvcpus; i++) {
6ae9ed
         char *cpumask;
6ae9ed
         virDomainVcpuDefPtr vcpu = def->vcpus[i];
6ae9ed
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
6ae9ed
index 34da54c..61ca8bd 100644
6ae9ed
--- a/src/conf/domain_conf.h
6ae9ed
+++ b/src/conf/domain_conf.h
6ae9ed
@@ -2031,6 +2031,8 @@ struct _virDomainCputune {
6ae9ed
     long long global_quota;
6ae9ed
     unsigned long long emulator_period;
6ae9ed
     long long emulator_quota;
6ae9ed
+    unsigned long long iothread_period;
6ae9ed
+    long long iothread_quota;
6ae9ed
     virBitmapPtr emulatorpin;
6ae9ed
 };
6ae9ed
 
6ae9ed
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
6ae9ed
index 9595903..e6ef51d 100644
6ae9ed
--- a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
6ae9ed
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
6ae9ed
@@ -10,6 +10,8 @@
6ae9ed
     <quota>-1</quota>
6ae9ed
     <global_period>1000000</global_period>
6ae9ed
     <global_quota>-1</global_quota>
6ae9ed
+    <iothread_period>1000000</iothread_period>
6ae9ed
+    <iothread_quota>-1</iothread_quota>
6ae9ed
     <vcpupin vcpu='0' cpuset='0'/>
6ae9ed
     <vcpupin vcpu='1' cpuset='1'/>
6ae9ed
     <emulatorpin cpuset='1'/>
6ae9ed
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
6ae9ed
index baf1779..7a1f50d 100644
6ae9ed
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
6ae9ed
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
6ae9ed
@@ -10,6 +10,8 @@
6ae9ed
     <quota>-1</quota>
6ae9ed
     <global_period>1000000</global_period>
6ae9ed
     <global_quota>-1</global_quota>
6ae9ed
+    <iothread_period>1000000</iothread_period>
6ae9ed
+    <iothread_quota>-1</iothread_quota>
6ae9ed
     <vcpupin vcpu='0' cpuset='0'/>
6ae9ed
     <vcpupin vcpu='1' cpuset='1'/>
6ae9ed
     <emulatorpin cpuset='1'/>
6ae9ed
diff --git a/tools/virsh.pod b/tools/virsh.pod
6ae9ed
index 601cb44..5fef86b 100644
6ae9ed
--- a/tools/virsh.pod
6ae9ed
+++ b/tools/virsh.pod
6ae9ed
@@ -1906,7 +1906,7 @@ available for each hypervisor are:
6ae9ed
 LXC (posix scheduler) : cpu_shares, vcpu_period, vcpu_quota
6ae9ed
 
6ae9ed
 QEMU/KVM (posix scheduler): cpu_shares, vcpu_period, vcpu_quota,
6ae9ed
-emulator_period, emulator_quota
6ae9ed
+emulator_period, emulator_quota, iothread_quota, iothread_period
6ae9ed
 
6ae9ed
 Xen (credit scheduler): weight, cap
6ae9ed
 
6ae9ed
@@ -1924,9 +1924,10 @@ values 0 and 1 are automatically converted to a minimal value of 2.
6ae9ed
 B<Note>: The weight and cap parameters are defined only for the
6ae9ed
 XEN_CREDIT scheduler and are now I<DEPRECATED>.
6ae9ed
 
6ae9ed
-B<Note>: The vcpu_period/emulator_period parameters have a valid value range
6ae9ed
-of 1000-1000000 or 0, and the vcpu_quota/emulator_quota parameters have a
6ae9ed
-valid value range of 1000-18446744073709551 or less than 0. The value 0 for
6ae9ed
+B<Note>: The vcpu_period, emulator_period, and iothread_period parameters
6ae9ed
+have a valid value range of 1000-1000000 or 0, and the vcpu_quota,
6ae9ed
+emulator_quota, and iothread_quota parameters have a valid value range of
6ae9ed
+1000-18446744073709551 or less than 0. The value 0 for
6ae9ed
 either parameter is the same as not specifying that parameter.
6ae9ed
 
6ae9ed
 =item B<screenshot> I<domain> [I<imagefilepath>] [I<--screen> B<screenID>]
6ae9ed
-- 
6ae9ed
2.10.0
6ae9ed