<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p><br>
</p>
<div class="moz-cite-prefix">在 2021/1/13 21:32, Han Han 写道:<br>
</div>
<blockquote type="cite"
cite="mid:CAHjf+S83Xm8dMcAf=ZmvzqD4owinR0svbkUTFqxvRCYavm6Bog@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div dir="ltr"><br>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Jan 13, 2021 at 1:09
AM <<a href="mailto:huangy81@chinatelecom.cn"
moz-do-not-send="true">huangy81@chinatelecom.cn</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">From: Hyman <<a
href="mailto:huangy81@chinatelecom.cn" target="_blank"
moz-do-not-send="true">huangy81@chinatelecom.cn</a>><br>
<br>
QEMU introduced a dirty ring feature, this patch add a new<br>
KVM feature 'dirty-ring' to set this feature for kvm guests.<br>
<br>
To enable the feature, libvirt add "-accel
dirty-gfn-count=xxx"<br>
to QEMU command line, the following XML needs to be added to<br>
the guest's domain description:<br>
<br>
<features><br>
<kvm><br>
<dirty-ring state='on' size='xxx'><br>
</kvm><br>
</features><br>
<br>
Signed-off-by: Hyman <<a
href="mailto:huangy81@chinatelecom.cn" target="_blank"
moz-do-not-send="true">huangy81@chinatelecom.cn</a>><br>
---<br>
docs/formatdomain.rst | 16 +++++++++-------<br>
docs/schemas/domaincommon.rng | 10 ++++++++++<br>
src/conf/domain_conf.c | 34
++++++++++++++++++++++++++++++++++<br>
src/conf/domain_conf.h | 4 ++++<br>
src/qemu/qemu_command.c | 13 ++++++++++---<br>
5 files changed, 67 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst<br>
index 6100b88..5bf8517 100644<br>
--- a/docs/formatdomain.rst<br>
+++ b/docs/formatdomain.rst<br>
@@ -1767,6 +1767,7 @@ Hypervisors may allow certain CPU /
machine features to be toggled on/off.<br>
<hidden state='on'/><br>
<hint-dedicated state='on'/><br>
<poll-control='on'/><br>
+ <dirty-ring state='on' size='4096'/><br>
</kvm><br>
<xen><br>
<e820_host state='on'/><br>
@@ -1849,13 +1850,14 @@ are:<br>
``kvm``<br>
Various features to change the behavior of the KVM
hypervisor.<br>
<br>
- ==============
============================================================================
======= ============================<br>
- Feature Description
Value Since<br>
- ==============
============================================================================
======= ============================<br>
- hidden Hide the KVM hypervisor from standard MSR
based discovery on, off :since:`1.2.8
(QEMU 2.1.0)`<br>
- hint-dedicated Allows a guest to enable optimizations
when running on dedicated vCPUs on, off :since:`5.7.0
(QEMU 2.12.0)`<br>
- poll-control Decrease IO completion latency by
introducing a grace period of busy waiting on, off
:since:`6.10.0 (QEMU 4.2)`<br>
- ==============
============================================================================
======= ============================<br>
+ ==============
============================================================================
==================================
============================<br>
+ Feature Description
Value
Since<br>
+ ==============
============================================================================
==================================
============================<br>
+ hidden Hide the KVM hypervisor from standard MSR
based discovery on, off
:since:`1.2.8 (QEMU 2.1.0)`<br>
+ hint-dedicated Allows a guest to enable optimizations
when running on dedicated vCPUs on, off
:since:`5.7.0 (QEMU 2.12.0)`<br>
+ poll-control Decrease IO completion latency by
introducing a grace period of busy waiting on, off
:since:`6.10.0 (QEMU 4.2)`<br>
+ dirty-ring Enable dirty ring feature
on, off; size - must be
power of 2 :since:`7.0.0 (QEMU 5.2.1)`<br>
</blockquote>
<div>Are you sure it will be added in QEMU 5.2.1 ?</div>
<div>I find it has been not merged in qemu yet<br>
</div>
</div>
</div>
</blockquote>
<p>indeed, it hasn't been merged. This patchset base on the
following works: <br>
</p>
<p><a class="moz-txt-link-freetext" href="https://lore.kernel.org/qemu-devel/20210108164601.406146-1-peterx@redhat.com/">https://lore.kernel.org/qemu-devel/20210108164601.406146-1-peterx@redhat.com/</a></p>
<p>Maybe the review is under way. I post this patchset for review in
advance. Once the qemu patchset is merged, i'll ping the
libvir-list and apply for merging. <br>
</p>
<blockquote type="cite"
cite="mid:CAHjf+S83Xm8dMcAf=ZmvzqD4owinR0svbkUTFqxvRCYavm6Bog@mail.gmail.com">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
+ ==============
============================================================================
==================================
============================<br>
<br>
``xen``<br>
Various features to change the behavior of the Xen
hypervisor.<br>
diff --git a/docs/schemas/domaincommon.rng
b/docs/schemas/domaincommon.rng<br>
index 7dc419b..5af4bbe 100644<br>
--- a/docs/schemas/domaincommon.rng<br>
+++ b/docs/schemas/domaincommon.rng<br>
@@ -6569,6 +6569,16 @@<br>
<ref name="featurestate"/><br>
</element><br>
</optional><br>
+ <optional><br>
+ <element name="dirty-ring"><br>
+ <ref name="featurestate"/><br>
+ <optional><br>
+ <attribute name="size"><br>
+ <data type="unsignedInt"/><br>
+ </attribute><br>
+ </optional><br>
+ </element><br>
+ </optional><br>
</interleave><br>
</element><br>
</define><br>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c<br>
index 349fc28..e617b95 100644<br>
--- a/src/conf/domain_conf.c<br>
+++ b/src/conf/domain_conf.c<br>
@@ -186,6 +186,7 @@ VIR_ENUM_IMPL(virDomainKVM,<br>
"hidden",<br>
"hint-dedicated",<br>
"poll-control",<br>
+ "dirty-ring",<br>
);<br>
<br>
VIR_ENUM_IMPL(virDomainXen,<br>
@@ -18379,6 +18380,7 @@
virDomainFeaturesDefParse(virDomainDefPtr def,<br>
if (def->features[VIR_DOMAIN_FEATURE_KVM] ==
VIR_TRISTATE_SWITCH_ON) {<br>
int feature;<br>
int value;<br>
+ node = ctxt->node;<br>
if ((n = virXPathNodeSet("./features/kvm/*", ctxt,
&nodes)) < 0)<br>
return -1;<br>
<br>
@@ -18395,6 +18397,7 @@
virDomainFeaturesDefParse(virDomainDefPtr def,<br>
case VIR_DOMAIN_KVM_HIDDEN:<br>
case VIR_DOMAIN_KVM_DEDICATED:<br>
case VIR_DOMAIN_KVM_POLLCONTROL:<br>
+ case VIR_DOMAIN_KVM_DIRTY_RING:<br>
if (!(tmp = virXMLPropString(nodes[i],
"state"))) {<br>
virReportError(VIR_ERR_XML_ERROR,<br>
_("missing 'state'
attribute for "<br>
@@ -18413,6 +18416,26 @@
virDomainFeaturesDefParse(virDomainDefPtr def,<br>
<br>
VIR_FREE(tmp);<br>
def->kvm_features[feature] = value;<br>
+<br>
+ /* only for dirty ring case */<br>
+ if (((virDomainKVM) feature) ==
VIR_DOMAIN_KVM_DIRTY_RING &&<br>
+ value == VIR_TRISTATE_SWITCH_ON)
{<br>
+ ctxt->node = nodes[i];<br>
+ if (virXPathUInt("string(./@size)",
ctxt,<br>
+
&def->dirty_gfn_count) < 0) {<br>
+
virReportError(VIR_ERR_XML_ERROR, "%s",<br>
+ _("invalid
number of dirty GFNs"));<br>
+ return -1;<br>
+ }<br>
+<br>
+ if ((def->dirty_gfn_count &
(def->dirty_gfn_count - 1)) ||<br>
+ def->dirty_gfn_count >
65536) {<br>
+
virReportError(VIR_ERR_XML_ERROR, "%s",<br>
+ _("max number of
dirty GFNs is 65536 "<br>
+ "and must be
power of 2"));<br>
+ return -1;<br>
+ }<br>
+ }<br>
break;<br>
<br>
/* coverity[dead_error_begin] */<br>
@@ -18421,6 +18444,7 @@
virDomainFeaturesDefParse(virDomainDefPtr def,<br>
}<br>
}<br>
VIR_FREE(nodes);<br>
+ ctxt->node = node;<br>
}<br>
<br>
if (def->features[VIR_DOMAIN_FEATURE_XEN] ==
VIR_TRISTATE_SWITCH_ON) {<br>
@@ -22521,6 +22545,7 @@
virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,<br>
case VIR_DOMAIN_KVM_HIDDEN:<br>
case VIR_DOMAIN_KVM_DEDICATED:<br>
case VIR_DOMAIN_KVM_POLLCONTROL:<br>
+ case VIR_DOMAIN_KVM_DIRTY_RING:<br>
if (src->kvm_features[i] !=
dst->kvm_features[i]) {<br>
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
_("State of KVM feature
'%s' differs: "<br>
@@ -28271,6 +28296,15 @@
virDomainDefFormatFeatures(virBufferPtr buf,<br>
def->kvm_features[j]));<br>
break;<br>
<br>
+ case VIR_DOMAIN_KVM_DIRTY_RING:<br>
+ if (def->kvm_features[j])<br>
+ virBufferAsprintf(&childBuf,
"<%s state='%s' size='%d'/>\n",<br>
+
virDomainKVMTypeToString(j),<br>
+
virTristateSwitchTypeToString(<br>
+
def->kvm_features[j]),<br>
+
def->dirty_gfn_count);<br>
+ break;<br>
+<br>
/* coverity[dead_error_begin] */<br>
case VIR_DOMAIN_KVM_LAST:<br>
break;<br>
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h<br>
index ec43bbe..120d490 100644<br>
--- a/src/conf/domain_conf.h<br>
+++ b/src/conf/domain_conf.h<br>
@@ -1917,6 +1917,7 @@ typedef enum {<br>
VIR_DOMAIN_KVM_HIDDEN = 0,<br>
VIR_DOMAIN_KVM_DEDICATED,<br>
VIR_DOMAIN_KVM_POLLCONTROL,<br>
+ VIR_DOMAIN_KVM_DIRTY_RING,<br>
<br>
VIR_DOMAIN_KVM_LAST<br>
} virDomainKVM;<br>
@@ -2728,6 +2729,9 @@ struct _virDomainDef {<br>
callbacks failed for a
non-critical reason<br>
(was not able to fill in some
data) and thus<br>
should be re-run before
starting */<br>
+<br>
+ /* Number of dirty GFNs per ring */<br>
+ unsigned int dirty_gfn_count;<br>
};<br>
<br>
<br>
diff --git a/src/qemu/qemu_command.c
b/src/qemu/qemu_command.c<br>
index 0f660aa..31829ba 100644<br>
--- a/src/qemu/qemu_command.c<br>
+++ b/src/qemu/qemu_command.c<br>
@@ -6525,6 +6525,9 @@ qemuBuildCpuCommandLine(virCommandPtr
cmd,<br>
virBufferAddLit(&buf,
",kvm-poll-control=on");<br>
break;<br>
<br>
+ case VIR_DOMAIN_KVM_DIRTY_RING:<br>
+ break;<br>
+<br>
/* coverity[dead_error_begin] */<br>
case VIR_DOMAIN_KVM_LAST:<br>
break;<br>
@@ -6959,9 +6962,13 @@
qemuBuildAccelCommandLineTcgOptions(void)<br>
<br>
<br>
static void<br>
-qemuBuildAccelCommandLineKvmOptions(void)<br>
+qemuBuildAccelCommandLineKvmOptions(virBuffer *buf,<br>
+ const virDomainDef
*def)<br>
{<br>
- /* implemented in the next patch */<br>
+ if (def->features[VIR_DOMAIN_FEATURE_KVM] ==
VIR_TRISTATE_SWITCH_ON &&<br>
+ def->kvm_features[VIR_DOMAIN_KVM_DIRTY_RING] ==
VIR_TRISTATE_SWITCH_ON) {<br>
+ virBufferAsprintf(buf, ",dirty-gfn-count=%d",
def->dirty_gfn_count);<br>
+ }<br>
}<br>
<br>
<br>
@@ -6982,7 +6989,7 @@
qemuBuildAccelCommandLine(virCommandPtr cmd,<br>
<br>
case VIR_DOMAIN_VIRT_KVM:<br>
virBufferAddLit(&buf, "kvm");<br>
- qemuBuildAccelCommandLineKvmOptions();<br>
+ qemuBuildAccelCommandLineKvmOptions(&buf, def);<br>
break;<br>
<br>
case VIR_DOMAIN_VIRT_KQEMU:<br>
-- <br>
1.8.3.1<br>
<br>
</blockquote>
</div>
</div>
</blockquote>
</body>
</html>