diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index c4198360b4..fa88839ec5 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -616,6 +616,8 @@
<quota>-1</quota>
<emulator_period>1000000</emulator_period>
<emulator_quota>-1</emulator_quota>
+ <iothread_period>1000000</iothread_period>
+ <iothread_quota>-1</iothread_quota>
<vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/>
<iothreadsched iothreads='2' scheduler='batch'/>
</cputune>
@@ -720,6 +722,29 @@
Only QEMU driver support since 0.10.0
+
iothread_period
+
+ The optional iothread_period
element specifies the
+ enforcement interval(unit: microseconds) for IOThreads. Within
+ iothread_period
, each IOThread of the domain will
+ not be allowed to consume more than iothread_quota
+ worth of runtime. The value should be in range [1000, 1000000].
+ An iothread_period with value 0 means no value.
+ Only QEMU driver support since 2.1.0
+
+ iothread_quota
+
+ The optional iothread_quota
element specifies the maximum
+ allowed bandwidth(unit: microseconds) for IOThreads. A domain with
+ iothread_quota
as any negative value indicates that the
+ domain IOThreads have infinite bandwidth, which means that it is
+ not bandwidth controlled. The value should be in range
+ [1000, 18446744073709551] or less than 0. An iothread_quota
+ with value 0 means no value. You can use this feature to ensure that
+ all IOThreads run at the same speed.
+ Only QEMU driver support since 2.1.0
+
+
vcpusched
and iothreadsched
The optional vcpusched
elements specifies the scheduler
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 727014014e..cb9f1349f3 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -731,6 +731,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 7300f3a749..42a2beaa14 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -364,6 +364,22 @@ typedef enum {
*/
# define VIR_DOMAIN_SCHEDULER_EMULATOR_QUOTA "emulator_quota"
+/**
+ * VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD:
+ *
+ * Macro represents the enforcement period for a quota, in microseconds,
+ * for IOThreads only, when using the posix scheduler, as a ullong.
+ */
+# define VIR_DOMAIN_SCHEDULER_IOTHREAD_PERIOD "iothread_period"
+
+/**
+ * VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA:
+ *
+ * Macro represents the maximum bandwidth to be used within a period for
+ * IOThreads only, when using the posix scheduler, as an llong.
+ */
+# define VIR_DOMAIN_SCHEDULER_IOTHREAD_QUOTA "iothread_quota"
+
/**
* VIR_DOMAIN_SCHEDULER_WEIGHT:
*
@@ -3612,6 +3628,22 @@ typedef void (*virConnectDomainEventJobCompletedCallback)(virConnectPtr conn,
*/
# define VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA "cputune.emulator_quota"
+/**
+ * VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD:
+ *
+ * Macro represents the enforcement period for a quota, in microseconds, for
+ * iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG.
+ */
+# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_PERIOD "cputune.iothread_period"
+
+/**
+ * VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA:
+ *
+ * Macro represents the maximum bandwidth to be used within a period for
+ * iothreads only, when using the posix scheduler, as VIR_TYPED_PARAM_LLONG.
+ */
+# define VIR_DOMAIN_TUNABLE_CPU_IOTHREAD_QUOTA "cputune.iothread_quota"
+
/**
* VIR_DOMAIN_TUNABLE_BLKDEV_DISK:
*
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0d6a154177..e58046be89 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16131,6 +16131,38 @@ virDomainDefParseXML(xmlDocPtr xml,
goto error;
}
+ if (virXPathULongLong("string(./cputune/iothread_period[1])", ctxt,
+ &def->cputune.iothread_period) < -1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("can't parse cputune iothread period value"));
+ goto error;
+ }
+
+ if (def->cputune.iothread_period > 0 &&
+ (def->cputune.iothread_period < 1000 ||
+ def->cputune.iothread_period > 1000000)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Value of cputune iothread_period must be in range "
+ "[1000, 1000000]"));
+ goto error;
+ }
+
+ if (virXPathLongLong("string(./cputune/iothread_quota[1])", ctxt,
+ &def->cputune.iothread_quota) < -1) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("can't parse cputune iothread quota value"));
+ goto error;
+ }
+
+ if (def->cputune.iothread_quota > 0 &&
+ (def->cputune.iothread_quota < 1000 ||
+ def->cputune.iothread_quota > 18446744073709551LL)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Value of cputune iothread_quota must be in range "
+ "[1000, 18446744073709551]"));
+ goto error;
+ }
+
if ((n = virXPathNodeSet("./cputune/vcpupin", ctxt, &nodes)) < 0)
goto error;
@@ -22812,6 +22844,16 @@ virDomainCputuneDefFormat(virBufferPtr buf,
"\n",
def->cputune.emulator_quota);
+ if (def->cputune.iothread_period)
+ virBufferAsprintf(&childrenBuf, "%llu"
+ "\n",
+ def->cputune.iothread_period);
+
+ if (def->cputune.iothread_quota)
+ virBufferAsprintf(&childrenBuf, "%lld"
+ "\n",
+ def->cputune.iothread_quota);
+
for (i = 0; i < def->maxvcpus; i++) {
char *cpumask;
virDomainVcpuDefPtr vcpu = def->vcpus[i];
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index da61ee09aa..b2e905dd94 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2033,6 +2033,8 @@ struct _virDomainCputune {
long long global_quota;
unsigned long long emulator_period;
long long emulator_quota;
+ unsigned long long iothread_period;
+ long long iothread_quota;
virBitmapPtr emulatorpin;
};
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
index 9595903cd5..e6ef51dc27 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cputune.xml
@@ -10,6 +10,8 @@
-1
1000000
-1
+ 1000000
+ -1
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
index baf17797b6..7a1f50dfcf 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune.xml
@@ -10,6 +10,8 @@
-1
1000000
-1
+ 1000000
+ -1
diff --git a/tools/virsh.pod b/tools/virsh.pod
index fc6a680b53..97d16c5165 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1937,7 +1937,7 @@ available for each hypervisor are:
LXC (posix scheduler) : cpu_shares, vcpu_period, vcpu_quota
QEMU/KVM (posix scheduler): cpu_shares, vcpu_period, vcpu_quota,
-emulator_period, emulator_quota
+emulator_period, emulator_quota, iothread_quota, iothread_period
Xen (credit scheduler): weight, cap
@@ -1955,9 +1955,10 @@ values 0 and 1 are automatically converted to a minimal value of 2.
B: The weight and cap parameters are defined only for the
XEN_CREDIT scheduler and are now I.
-B: The vcpu_period/emulator_period parameters have a valid value range
-of 1000-1000000 or 0, and the vcpu_quota/emulator_quota parameters have a
-valid value range of 1000-18446744073709551 or less than 0. The value 0 for
+B: The vcpu_period, emulator_period, and iothread_period parameters
+have a valid value range of 1000-1000000 or 0, and the vcpu_quota,
+emulator_quota, and iothread_quota parameters have a valid value range of
+1000-18446744073709551 or less than 0. The value 0 for
either parameter is the same as not specifying that parameter.
=item B I [I] [I<--screen> B]