[PATCH v6 4/4] qemu: support dirty ring feature

huangy81@chinatelecom.cn posted 4 patches 4 years, 2 months ago
There is a newer version of this series
[PATCH v6 4/4] qemu: support dirty ring feature
Posted by huangy81@chinatelecom.cn 4 years, 2 months ago
From: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>

dirty ring feature was introduced in qemu-6.1, this patch add
corresponding feature named 'dirty-ring', which enable
dirty ring feature when starting vm.

to enable the feature, libvirt add "-accel dirty-ring-size=xxx"
to QEMU command line, the following XML needs to be added to
the guest's domain description:

<features>
   <kvm>
     <dirty-ring state='on' size='xxx'>
   </kvm>
</features>

if property "state=on" but property "size" not be configured, set
default ring size with 4096.

since dirty ring can only be enabled by specifying "-accel" option
and do not support the legacy style, it seems that there's no
other way to work around this, so we use "-accel" option to specify
accelerator instead of "-machine" when building qemu commandline.

details about the qemu "-accel" option:
https://lore.kernel.org/qemu-devel/3aa73987-40e8-3619-0723-9f17f73850bd@redhat.com/

Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
---
 docs/formatdomain.rst         | 18 ++++++++++--------
 docs/schemas/domaincommon.rng | 10 ++++++++++
 src/qemu/qemu_command.c       |  6 ++++++
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index eb8c973cf1..ea69b61c70 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -1843,6 +1843,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
        <hint-dedicated state='on'/>
        <poll-control state='on'/>
        <pv-ipi state='off'/>
+       <dirty-ring state='on' size='4096'/>
      </kvm>
      <xen>
        <e820_host state='on'/>
@@ -1925,14 +1926,15 @@ are:
 ``kvm``
    Various features to change the behavior of the KVM hypervisor.
 
-   ============== ============================================================================ ======= ============================
-   Feature        Description                                                                  Value   Since
-   ============== ============================================================================ ======= ============================
-   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off :since:`1.2.8 (QEMU 2.1.0)`
-   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off :since:`5.7.0 (QEMU 2.12.0)`
-   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off :since:`6.10.0 (QEMU 4.2)`
-   pv-ipi         Paravirtualized send IPIs                                                    on, off :since:`7.10.0 (QEMU 3.1)`
-   ============== ============================================================================ ======= ============================
+   ============== ============================================================================ ====================================================== ============================
+   Feature        Description                                                                  Value                                                  Since
+   ============== ============================================================================ ====================================================== ============================
+   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off                                                :since:`1.2.8 (QEMU 2.1.0)`
+   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off                                                :since:`5.7.0 (QEMU 2.12.0)`
+   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off                                                :since:`6.10.0 (QEMU 4.2)`
+   pv-ipi         Paravirtualized send IPIs                                                    on, off                                                :since:`7.10.0 (QEMU 3.1)`
+   dirty-ring     Enable dirty ring feature                                                    on, off; size - must be power of 2, range [1024,65536] :since:`7.10.0 (QEMU 6.1)`
+   ============== ============================================================================ ====================================================== ============================
 
 ``xen``
    Various features to change the behavior of the Xen hypervisor.
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index f01b7a6470..5f9fe3cc58 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -7212,6 +7212,16 @@
             <ref name="featurestate"/>
           </element>
         </optional>
+        <optional>
+          <element name="dirty-ring">
+            <ref name="featurestate"/>
+            <optional>
+              <attribute name="size">
+                <data type="unsignedInt"/>
+              </attribute>
+            </optional>
+          </element>
+        </optional>
       </interleave>
     </element>
   </define>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 145596d11a..863876bfae 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7043,6 +7043,12 @@ qemuBuildAccelCommandLineKvmOptions(virCommand *cmd,
         g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
         virCommandAddArg(cmd, "-accel");
         virBufferAddLit(&buf, "kvm");
+
+        if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON &&
+            def->kvm_features[VIR_DOMAIN_KVM_DIRTY_RING] == VIR_TRISTATE_SWITCH_ON) {
+            virBufferAsprintf(&buf, ",dirty-ring-size=%d", def->dirty_ring_size);
+        }
+
         virCommandAddArgBuffer(cmd, &buf);
     }
 }
-- 
2.27.0


Re: [PATCH v6 4/4] qemu: support dirty ring feature
Posted by Peter Krempa 4 years, 2 months ago
On Sat, Nov 20, 2021 at 03:20:48 -0500, huangy81@chinatelecom.cn wrote:
> From: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
> 
> dirty ring feature was introduced in qemu-6.1, this patch add
> corresponding feature named 'dirty-ring', which enable
> dirty ring feature when starting vm.
> 
> to enable the feature, libvirt add "-accel dirty-ring-size=xxx"
> to QEMU command line, the following XML needs to be added to
> the guest's domain description:
> 
> <features>
>    <kvm>
>      <dirty-ring state='on' size='xxx'>
>    </kvm>
> </features>
> 
> if property "state=on" but property "size" not be configured, set
> default ring size with 4096.
> 
> since dirty ring can only be enabled by specifying "-accel" option
> and do not support the legacy style, it seems that there's no
> other way to work around this, so we use "-accel" option to specify
> accelerator instead of "-machine" when building qemu commandline.
> 
> details about the qemu "-accel" option:
> https://lore.kernel.org/qemu-devel/3aa73987-40e8-3619-0723-9f17f73850bd@redhat.com/
> 
> Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
> ---
>  docs/formatdomain.rst         | 18 ++++++++++--------
>  docs/schemas/domaincommon.rng | 10 ++++++++++
>  src/qemu/qemu_command.c       |  6 ++++++
>  3 files changed, 26 insertions(+), 8 deletions(-)
> 
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index eb8c973cf1..ea69b61c70 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -1843,6 +1843,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
>         <hint-dedicated state='on'/>
>         <poll-control state='on'/>
>         <pv-ipi state='off'/>
> +       <dirty-ring state='on' size='4096'/>
>       </kvm>
>       <xen>
>         <e820_host state='on'/>
> @@ -1925,14 +1926,15 @@ are:
>  ``kvm``
>     Various features to change the behavior of the KVM hypervisor.
>  
> -   ============== ============================================================================ ======= ============================
> -   Feature        Description                                                                  Value   Since
> -   ============== ============================================================================ ======= ============================
> -   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off :since:`1.2.8 (QEMU 2.1.0)`
> -   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off :since:`5.7.0 (QEMU 2.12.0)`
> -   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off :since:`6.10.0 (QEMU 4.2)`
> -   pv-ipi         Paravirtualized send IPIs                                                    on, off :since:`7.10.0 (QEMU 3.1)`
> -   ============== ============================================================================ ======= ============================
> +   ============== ============================================================================ ====================================================== ============================
> +   Feature        Description                                                                  Value                                                  Since
> +   ============== ============================================================================ ====================================================== ============================
> +   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off                                                :since:`1.2.8 (QEMU 2.1.0)`
> +   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off                                                :since:`5.7.0 (QEMU 2.12.0)`
> +   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off                                                :since:`6.10.0 (QEMU 4.2)`
> +   pv-ipi         Paravirtualized send IPIs                                                    on, off                                                :since:`7.10.0 (QEMU 3.1)`
> +   dirty-ring     Enable dirty ring feature                                                    on, off; size - must be power of 2, range [1024,65536] :since:`7.10.0 (QEMU 6.1)`
> +   ============== ============================================================================ ====================================================== ============================
>  
>  ``xen``
>     Various features to change the behavior of the Xen hypervisor.

Okay, so both hunks belong actually to the previous commit.

> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index f01b7a6470..5f9fe3cc58 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -7212,6 +7212,16 @@
>              <ref name="featurestate"/>
>            </element>
>          </optional>
> +        <optional>
> +          <element name="dirty-ring">
> +            <ref name="featurestate"/>
> +            <optional>
> +              <attribute name="size">
> +                <data type="unsignedInt"/>
> +              </attribute>
> +            </optional>
> +          </element>
> +        </optional>
>        </interleave>
>      </element>
>    </define>

And this one too.

> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 145596d11a..863876bfae 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7043,6 +7043,12 @@ qemuBuildAccelCommandLineKvmOptions(virCommand *cmd,
>          g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
>          virCommandAddArg(cmd, "-accel");
>          virBufferAddLit(&buf, "kvm");
> +
> +        if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON &&
> +            def->kvm_features[VIR_DOMAIN_KVM_DIRTY_RING] == VIR_TRISTATE_SWITCH_ON) {
> +            virBufferAsprintf(&buf, ",dirty-ring-size=%d", def->dirty_ring_size);
> +        }
> +
>          virCommandAddArgBuffer(cmd, &buf);
>      }
>  }

A test case is needed both for qemuxml2argvtest and qemuxml2xmltest.

Re: [PATCH v6 4/4] qemu: support dirty ring feature
Posted by Hyman 4 years, 2 months ago

在 2021/11/22 16:55, Peter Krempa 写道:
> On Sat, Nov 20, 2021 at 03:20:48 -0500, huangy81@chinatelecom.cn wrote:
>> From: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
>>
>> dirty ring feature was introduced in qemu-6.1, this patch add
>> corresponding feature named 'dirty-ring', which enable
>> dirty ring feature when starting vm.
>>
>> to enable the feature, libvirt add "-accel dirty-ring-size=xxx"
>> to QEMU command line, the following XML needs to be added to
>> the guest's domain description:
>>
>> <features>
>>     <kvm>
>>       <dirty-ring state='on' size='xxx'>
>>     </kvm>
>> </features>
>>
>> if property "state=on" but property "size" not be configured, set
>> default ring size with 4096.
>>
>> since dirty ring can only be enabled by specifying "-accel" option
>> and do not support the legacy style, it seems that there's no
>> other way to work around this, so we use "-accel" option to specify
>> accelerator instead of "-machine" when building qemu commandline.
>>
>> details about the qemu "-accel" option:
>> https://lore.kernel.org/qemu-devel/3aa73987-40e8-3619-0723-9f17f73850bd@redhat.com/
>>
>> Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
>> ---
>>   docs/formatdomain.rst         | 18 ++++++++++--------
>>   docs/schemas/domaincommon.rng | 10 ++++++++++
>>   src/qemu/qemu_command.c       |  6 ++++++
>>   3 files changed, 26 insertions(+), 8 deletions(-)
>>
>> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
>> index eb8c973cf1..ea69b61c70 100644
>> --- a/docs/formatdomain.rst
>> +++ b/docs/formatdomain.rst
>> @@ -1843,6 +1843,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
>>          <hint-dedicated state='on'/>
>>          <poll-control state='on'/>
>>          <pv-ipi state='off'/>
>> +       <dirty-ring state='on' size='4096'/>
>>        </kvm>
>>        <xen>
>>          <e820_host state='on'/>
>> @@ -1925,14 +1926,15 @@ are:
>>   ``kvm``
>>      Various features to change the behavior of the KVM hypervisor.
>>   
>> -   ============== ============================================================================ ======= ============================
>> -   Feature        Description                                                                  Value   Since
>> -   ============== ============================================================================ ======= ============================
>> -   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off :since:`1.2.8 (QEMU 2.1.0)`
>> -   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off :since:`5.7.0 (QEMU 2.12.0)`
>> -   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off :since:`6.10.0 (QEMU 4.2)`
>> -   pv-ipi         Paravirtualized send IPIs                                                    on, off :since:`7.10.0 (QEMU 3.1)`
>> -   ============== ============================================================================ ======= ============================
>> +   ============== ============================================================================ ====================================================== ============================
>> +   Feature        Description                                                                  Value                                                  Since
>> +   ============== ============================================================================ ====================================================== ============================
>> +   hidden         Hide the KVM hypervisor from standard MSR based discovery                    on, off                                                :since:`1.2.8 (QEMU 2.1.0)`
>> +   hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs       on, off                                                :since:`5.7.0 (QEMU 2.12.0)`
>> +   poll-control   Decrease IO completion latency by introducing a grace period of busy waiting on, off                                                :since:`6.10.0 (QEMU 4.2)`
>> +   pv-ipi         Paravirtualized send IPIs                                                    on, off                                                :since:`7.10.0 (QEMU 3.1)`
>> +   dirty-ring     Enable dirty ring feature                                                    on, off; size - must be power of 2, range [1024,65536] :since:`7.10.0 (QEMU 6.1)`
>> +   ============== ============================================================================ ====================================================== ============================
>>   
>>   ``xen``
>>      Various features to change the behavior of the Xen hypervisor.
> 
> Okay, so both hunks belong actually to the previous commit.
> 
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index f01b7a6470..5f9fe3cc58 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -7212,6 +7212,16 @@
>>               <ref name="featurestate"/>
>>             </element>
>>           </optional>
>> +        <optional>
>> +          <element name="dirty-ring">
>> +            <ref name="featurestate"/>
>> +            <optional>
>> +              <attribute name="size">
>> +                <data type="unsignedInt"/>
>> +              </attribute>
>> +            </optional>
>> +          </element>
>> +        </optional>
>>         </interleave>
>>       </element>
>>     </define>
> 
> And this one too.
> 
Ok, i'll squash into the previous commit
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 145596d11a..863876bfae 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -7043,6 +7043,12 @@ qemuBuildAccelCommandLineKvmOptions(virCommand *cmd,
>>           g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
>>           virCommandAddArg(cmd, "-accel");
>>           virBufferAddLit(&buf, "kvm");
>> +
>> +        if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON &&
>> +            def->kvm_features[VIR_DOMAIN_KVM_DIRTY_RING] == VIR_TRISTATE_SWITCH_ON) {
>> +            virBufferAsprintf(&buf, ",dirty-ring-size=%d", def->dirty_ring_size);
>> +        }
>> +
>>           virCommandAddArgBuffer(cmd, &buf);
>>       }
>>   }
> 
> A test case is needed both for qemuxml2argvtest and qemuxml2xmltest.
> 
Ok, i'll add a commit for test case implementation