1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-30 18:50:18 +03:00

schema: Add new domain elements to support multiple throttle groups

Introduce schema for defining '<throttlegroups>' element which
configures throttling groups which can be configured for multiple
disks.

* Refactor "diskIoTune" to extract common schema "iotune"
* Add new elements '<throttlegroups>'
* <ThrottleGroups> contains <ThrottleGroup> defintion, which references
  "iotune"

Signed-off-by: Chun Feng Wu <danielwuwy@163.com>
Signed-off-by: Harikumar Rajkumar <harirajkumar230@gmail.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Chun Feng Wu 2025-02-19 22:27:05 +05:30 committed by Peter Krempa
parent 65eeaf12d0
commit 2463533aad
2 changed files with 174 additions and 126 deletions

View File

@ -2000,6 +2000,32 @@ advertisements to the guest OS. (NB: Only qemu driver support)
the guest OS itself can choose to circumvent the unavailability of the sleep
states (e.g. S4 by turning off completely).
Disk Throttle Group Management
------------------------------
:since:`Since 11.2.0` it is possible to create multiple named throttle groups
and then reference them within ``throttlefilters``(sub-element of ``disk`` element)
to form filter chain in QEMU for specific disk. The limits(throttlegroups) are
shared within domain, hence the same group can be referenced by different filters.
::
<domain>
...
<throttlegroups>
<throttlegroup>
<group_name>limit0</group_name>
<total_bytes_sec>10000000</total_bytes_sec>
<read_iops_sec>400000</read_iops_sec>
<write_iops_sec>100000</write_iops_sec>
</throttlegroup>
</throttlegroups>
...
</domain>
``throttlegroup``
It has the same sub-elements as ``iotune`` (See `Hard drives, floppy disks, CDROMs`_),
The difference is that <group_name> is required.
Hypervisor features
-------------------

View File

@ -71,6 +71,7 @@
</zeroOrMore>
<ref name="os"/>
<ref name="clock"/>
<ref name="throttlegroups"/>
<ref name="resources"/>
<ref name="features"/>
<ref name="events"/>
@ -6870,6 +6871,23 @@
</interleave>
</element>
</define>
<define name="throttlegroup">
<element name="throttlegroup">
<ref name="iotune"/>
</element>
</define>
<!--
A set of optional throttlegroups
-->
<define name="throttlegroups">
<optional>
<element name="throttlegroups">
<zeroOrMore>
<ref name="throttlegroup"/>
</zeroOrMore>
</element>
</optional>
</define>
<!--
A set of optional features: PAE, APIC, ACPI, GIC, TCG,
HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support
@ -7857,134 +7875,138 @@
</element>
</define>
<define name="iotune">
<interleave>
<choice>
<element name="total_bytes_sec">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_bytes_sec_max">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec_max">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<optional>
<element name="size_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="group_name">
<text/>
</element>
</optional>
<choice>
<element name="total_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
</interleave>
</define>
<define name="diskIoTune">
<element name="iotune">
<interleave>
<choice>
<element name="total_bytes_sec">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_bytes_sec_max">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec_max">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec_max">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<optional>
<element name="size_iops_sec">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="group_name">
<text/>
</element>
</optional>
<choice>
<element name="total_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_bytes_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
<choice>
<element name="total_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
<group>
<interleave>
<optional>
<element name="read_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
<optional>
<element name="write_iops_sec_max_length">
<data type="unsignedLong"/>
</element>
</optional>
</interleave>
</group>
</choice>
</interleave>
<ref name="iotune"/>
</element>
</define>