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]