Discussion:
[libvirt] [PATCH v2 0/5] conf: qemu: support new Hyper-V enlightenments in Qemu 3.1
Vitaly Kuznetsov
2018-11-14 16:27:46 UTC
Permalink
The upcoming Qemu-3.1 release will bring us two new Hyper-V enlightenments:
hv_ipi and hv_evmcs. Support these in libvirt.

Changes since v1:
- Split patches into 'conf' and 'qemu' [John Ferlan]
- Add entries to docs/news.xml [Andrea Bolognani]
- Add a cleanup PATCH1 removing extra whitespaces from
docs/formatdomain.html.in [Andrea Bolognani]
- Minor tweaks [Andrea Bolognani]

Vitaly Kuznetsov (5):
docs: remove extra whitespate from Hyper-V enlightenments options
conf: add support for Hyper-V PV IPIs
qemu: add support for Hyper-V PV IPIs
conf: add support for Hyper-V Enlightened VMCS
qemu: add support for Hyper-V Enlightened VMCS

docs/formatdomain.html.in | 32 ++++++++++++++++++-------
docs/news.xml | 18 ++++++++++++++
docs/schemas/domaincommon.rng | 10 ++++++++
src/conf/domain_conf.c | 11 ++++++++-
src/conf/domain_conf.h | 2 ++
src/cpu/cpu_x86.c | 6 +++++
src/cpu/cpu_x86_data.h | 2 ++
src/qemu/qemu_command.c | 2 ++
src/qemu/qemu_parse_command.c | 2 ++
src/qemu/qemu_process.c | 2 ++
tests/qemuxml2argvdata/hyperv-off.xml | 2 ++
tests/qemuxml2argvdata/hyperv.args | 2 +-
tests/qemuxml2argvdata/hyperv.xml | 2 ++
tests/qemuxml2xmloutdata/hyperv-off.xml | 2 ++
tests/qemuxml2xmloutdata/hyperv.xml | 2 ++
15 files changed, 86 insertions(+), 11 deletions(-)
--
2.17.2
Vitaly Kuznetsov
2018-11-14 16:27:47 UTC
Permalink
Remove redundant leading whitespaces from "<td> on, off</td>".

Suggested-by: Andrea Bolognani <***@redhat.com>
Signed-off-by: Vitaly Kuznetsov <***@redhat.com>
---
docs/formatdomain.html.in | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 269741a690..28246deb63 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2052,7 +2052,7 @@
<tr>
<td>relaxed</td>
<td>Relax constraints on timers</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.0.0 (QEMU 2.0)</span></td>
</tr>
<tr>
@@ -2070,31 +2070,31 @@
<tr>
<td>vpindex</td>
<td>Virtual processor index</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.3.3 (QEMU 2.5)</span></td>
</tr>
<tr>
<td>runtime</td>
<td>Processor time spent on running guest code and on behalf of guest code</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.3.3 (QEMU 2.5)</span></td>
</tr>
<tr>
<td>synic</td>
<td>Enable Synthetic Interrupt Controller (SyNIC)</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.3.3 (QEMU 2.6)</span></td>
</tr>
<tr>
<td>stimer</td>
<td>Enable SyNIC timers</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.3.3 (QEMU 2.6)</span></td>
</tr>
<tr>
<td>reset</td>
<td>Enable hypervisor reset</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">1.3.3 (QEMU 2.5)</span></td>
</tr>
<tr>
@@ -2106,19 +2106,19 @@
<tr>
<td>frequencies</td>
<td>Expose frequency MSRs</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">4.7.0 (QEMU 2.12)</span></td>
</tr>
<tr>
<td>reenlightenment</td>
<td>Enable re-enlightenment notification on migration</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">4.7.0 (QEMU 3.0)</span></td>
</tr>
<tr>
<td>tlbflush</td>
<td>Enable PV TLB flush support</td>
- <td> on, off</td>
+ <td>on, off</td>
<td><span class="since">4.7.0 (QEMU 3.0)</span></td>
</tr>
</table>
--
2.17.2
Andrea Bolognani
2018-11-14 17:20:07 UTC
Permalink
Post by Vitaly Kuznetsov
Remove redundant leading whitespaces from "<td> on, off</td>".
In the subject: s/whitespate/whitespace/

With that fixed,

Reviewed-by: Andrea Bolognani <***@redhat.com>
--
Andrea Bolognani / Red Hat / Virtualization
Vitaly Kuznetsov
2018-11-14 16:27:48 UTC
Permalink
Support Hyper-V PV IPI enlightenment in domain config. Qemu support will
be implemented in the next patch, adding interim VIR_DOMAIN_HYPERV_IPI cases
to src/qemu/* for now.

Signed-off-by: Vitaly Kuznetsov <***@redhat.com>
---
docs/formatdomain.html.in | 7 +++++++
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 7 ++++++-
src/conf/domain_conf.h | 1 +
src/cpu/cpu_x86.c | 3 +++
src/cpu/cpu_x86_data.h | 1 +
src/qemu/qemu_command.c | 1 +
src/qemu/qemu_parse_command.c | 1 +
src/qemu/qemu_process.c | 1 +
9 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 28246deb63..7592f13a84 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1981,6 +1981,7 @@
&lt;frequencies state='on'/&gt;
&lt;reenlightenment state='on'/&gt;
&lt;tlbflush state='on'/&gt;
+ &lt;ipi state='on'/&gt;
&lt;/hyperv&gt;
&lt;kvm&gt;
&lt;hidden state='on'/&gt;
@@ -2121,6 +2122,12 @@
<td>on, off</td>
<td><span class="since">4.7.0 (QEMU 3.0)</span></td>
</tr>
+ <tr>
+ <td>ipi</td>
+ <td>Enable PV IPI support</td>
+ <td>on, off</td>
+ <td><span class="since">4.10.0 (QEMU 3.1)</span></td>
+ </tr>
</table>
</dd>
<dt><code>pvspinlock</code></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index b9ac5df479..26019b3279 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -5769,6 +5769,11 @@
<ref name="featurestate"/>
</element>
</optional>
+ <optional>
+ <element name="ipi">
+ <ref name="featurestate"/>
+ </element>
+ </optional>
</interleave>
</element>
</define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e8e0adc819..24876994c5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -172,7 +172,9 @@ VIR_ENUM_IMPL(virDomainHyperv, VIR_DOMAIN_HYPERV_LAST,
"vendor_id",
"frequencies",
"reenlightenment",
- "tlbflush")
+ "tlbflush",
+ "ipi",
+);

VIR_ENUM_IMPL(virDomainKVM, VIR_DOMAIN_KVM_LAST,
"hidden")
@@ -19990,6 +19992,7 @@ virDomainDefParseXML(xmlDocPtr xml,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
break;

case VIR_DOMAIN_HYPERV_SPINLOCKS:
@@ -22184,6 +22187,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
if (src->hyperv_features[i] != dst->hyperv_features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of HyperV enlightenment "
@@ -27948,6 +27952,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
break;

case VIR_DOMAIN_HYPERV_SPINLOCKS:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e30a4b2fe7..9eea75548d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1795,6 +1795,7 @@ typedef enum {
VIR_DOMAIN_HYPERV_FREQUENCIES,
VIR_DOMAIN_HYPERV_REENLIGHTENMENT,
VIR_DOMAIN_HYPERV_TLBFLUSH,
+ VIR_DOMAIN_HYPERV_IPI,

VIR_DOMAIN_HYPERV_LAST
} virDomainHyperv;
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 69a0c8db28..33252e927e 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -114,6 +114,8 @@ KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_REENLIGHTENMENT,
0x40000003, 0x00002000);
KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_TLBFLUSH,
0x40000004, 0x00000004);
+KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_IPI,
+ 0x40000004, 0x00000400);

static virCPUx86Feature x86_kvm_features[] =
{
@@ -137,6 +139,7 @@ static virCPUx86Feature x86_kvm_features[] =
KVM_FEATURE(VIR_CPU_x86_KVM_HV_FREQUENCIES),
KVM_FEATURE(VIR_CPU_x86_KVM_HV_REENLIGHTENMENT),
KVM_FEATURE(VIR_CPU_x86_KVM_HV_TLBFLUSH),
+ KVM_FEATURE(VIR_CPU_x86_KVM_HV_IPI),
};

typedef struct _virCPUx86Model virCPUx86Model;
diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h
index e75b3a2d0d..8c51d88e1a 100644
--- a/src/cpu/cpu_x86_data.h
+++ b/src/cpu/cpu_x86_data.h
@@ -65,6 +65,7 @@ struct _virCPUx86CPUID {
# define VIR_CPU_x86_KVM_HV_FREQUENCIES "__kvm_hv_frequencies"
# define VIR_CPU_x86_KVM_HV_REENLIGHTENMENT "__kvm_hv_reenlightenment"
# define VIR_CPU_x86_KVM_HV_TLBFLUSH "__kvm_hv_tlbflush"
+# define VIR_CPU_x86_KVM_HV_IPI "__kvm_hv_ipi"


# define VIR_CPU_X86_DATA_INIT { 0 }
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f59cbf559e..b4d3f1ee35 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6899,6 +6899,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
def->hyperv_vendor_id);
break;

+ case VIR_DOMAIN_HYPERV_IPI:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_LAST:
break;
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index 5b4a378a18..ab418432af 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -1579,6 +1579,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,

break;

+ case VIR_DOMAIN_HYPERV_IPI:
case VIR_DOMAIN_HYPERV_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1850923914..3291d3f439 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3958,6 +3958,7 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
virDomainHypervTypeToString(i));
return -1;

+ case VIR_DOMAIN_HYPERV_IPI:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_VENDOR_ID:
case VIR_DOMAIN_HYPERV_LAST:
--
2.17.2
Andrea Bolognani
2018-11-14 17:25:56 UTC
Permalink
Post by Vitaly Kuznetsov
Support Hyper-V PV IPI enlightenment in domain config. Qemu support will
s/Qemu/QEMU/
Post by Vitaly Kuznetsov
be implemented in the next patch, adding interim VIR_DOMAIN_HYPERV_IPI cases
to src/qemu/* for now.
---
docs/formatdomain.html.in | 7 +++++++
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 7 ++++++-
src/conf/domain_conf.h | 1 +
src/cpu/cpu_x86.c | 3 +++
src/cpu/cpu_x86_data.h | 1 +
src/qemu/qemu_command.c | 1 +
src/qemu/qemu_parse_command.c | 1 +
src/qemu/qemu_process.c | 1 +
9 files changed, 26 insertions(+), 1 deletion(-)
So, personally I don't feel like splitting the patch into two really
improves the situation - actually the opposite, since now as you
mention in the commit message you have to go out of your way to add
placeholders only to remove them in the next commit.

But it's really not a big deal either way, so you can leave it as-is
and, with the commit message fixed, still get a

Reviewed-by: Andrea Bolognani <***@redhat.com>
--
Andrea Bolognani / Red Hat / Virtualization
Vitaly Kuznetsov
2018-11-14 16:27:49 UTC
Permalink
Qemu 3.1 supports Hyper-V-style PV IPIs making it cheaper for Windows
guests to send an IPI, especially when it targets many CPUs.

Signed-off-by: Vitaly Kuznetsov <***@redhat.com>
---
docs/news.xml | 9 +++++++++
src/qemu/qemu_command.c | 2 +-
src/qemu/qemu_parse_command.c | 2 +-
src/qemu/qemu_process.c | 2 +-
tests/qemuxml2argvdata/hyperv-off.xml | 1 +
tests/qemuxml2argvdata/hyperv.args | 2 +-
tests/qemuxml2argvdata/hyperv.xml | 1 +
tests/qemuxml2xmloutdata/hyperv-off.xml | 1 +
tests/qemuxml2xmloutdata/hyperv.xml | 1 +
9 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/docs/news.xml b/docs/news.xml
index 88774c55ae..c826380a92 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -35,6 +35,15 @@
<libvirt>
<release version="v4.10.0" date="unreleased">
<section title="New features">
+ <change>
+ <summary>
+ qemu: Add Hyper-V PV IPI support
+ </summary>
+ <description>
+ The QEMU driver now has support for Hyper-V PV IPI enlightenment
+ for Windows guests.
+ </description>
+ </change>
</section>
<section title="Improvements">
</section>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b4d3f1ee35..6fc8deff00 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6882,6 +6882,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON)
virBufferAsprintf(&buf, ",hv_%s",
virDomainHypervTypeToString(i));
@@ -6899,7 +6900,6 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
def->hyperv_vendor_id);
break;

- case VIR_DOMAIN_HYPERV_IPI:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_LAST:
break;
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index ab418432af..a15f4d1121 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -1539,6 +1539,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
if (value) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("HyperV feature '%s' should not "
@@ -1579,7 +1580,6 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,

break;

- case VIR_DOMAIN_HYPERV_IPI:
case VIR_DOMAIN_HYPERV_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 3291d3f439..85e2f7046b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3953,12 +3953,12 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
case VIR_DOMAIN_HYPERV_FREQUENCIES:
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
+ case VIR_DOMAIN_HYPERV_IPI:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("host doesn't support hyperv '%s' feature"),
virDomainHypervTypeToString(i));
return -1;

- case VIR_DOMAIN_HYPERV_IPI:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_VENDOR_ID:
case VIR_DOMAIN_HYPERV_LAST:
diff --git a/tests/qemuxml2argvdata/hyperv-off.xml b/tests/qemuxml2argvdata/hyperv-off.xml
index dc5777355f..e51cca45b5 100644
--- a/tests/qemuxml2argvdata/hyperv-off.xml
+++ b/tests/qemuxml2argvdata/hyperv-off.xml
@@ -23,6 +23,7 @@
<frequencies state='off'/>
<reenlightenment state='off'/>
<tlbflush state='off'/>
+ <ipi state='off'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/hyperv.args b/tests/qemuxml2argvdata/hyperv.args
index c55204b0c8..0800e4f79d 100644
--- a/tests/qemuxml2argvdata/hyperv.args
+++ b/tests/qemuxml2argvdata/hyperv.args
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
-machine pc,accel=tcg,usb=off,dump-guest-core=off \
-cpu 'qemu32,hv_relaxed,hv_vapic,hv_spinlocks=0x2fff,hv_vpindex,hv_runtime,\
hv_synic,hv_stimer,hv_reset,hv_vendor_id=KVM Hv,hv_frequencies,\
-hv_reenlightenment,hv_tlbflush' \
+hv_reenlightenment,hv_tlbflush,hv_ipi' \
-m 214 \
-smp 6,sockets=6,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hyperv.xml b/tests/qemuxml2argvdata/hyperv.xml
index 816adf6907..05c7d478f7 100644
--- a/tests/qemuxml2argvdata/hyperv.xml
+++ b/tests/qemuxml2argvdata/hyperv.xml
@@ -23,6 +23,7 @@
<frequencies state='on'/>
<reenlightenment state='on'/>
<tlbflush state='on'/>
+ <ipi state='on'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/hyperv-off.xml b/tests/qemuxml2xmloutdata/hyperv-off.xml
index 77a8dac810..2282b763b5 100644
--- a/tests/qemuxml2xmloutdata/hyperv-off.xml
+++ b/tests/qemuxml2xmloutdata/hyperv-off.xml
@@ -23,6 +23,7 @@
<frequencies state='off'/>
<reenlightenment state='off'/>
<tlbflush state='off'/>
+ <ipi state='off'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/hyperv.xml b/tests/qemuxml2xmloutdata/hyperv.xml
index fc8c59a557..97f387c172 100644
--- a/tests/qemuxml2xmloutdata/hyperv.xml
+++ b/tests/qemuxml2xmloutdata/hyperv.xml
@@ -23,6 +23,7 @@
<frequencies state='on'/>
<reenlightenment state='on'/>
<tlbflush state='on'/>
+ <ipi state='on'/>
</hyperv>
</features>
<clock offset='utc'/>
--
2.17.2
Andrea Bolognani
2018-11-14 17:33:21 UTC
Permalink
Post by Vitaly Kuznetsov
Qemu 3.1 supports Hyper-V-style PV IPIs making it cheaper for Windows
s/Qemu/QEMU/

Better than in v1 but not quite perfect yet ;)

[...]
Post by Vitaly Kuznetsov
+ <change>
+ <summary>
+ qemu: Add Hyper-V PV IPI support
+ </summary>
+ <description>
+ The QEMU driver now has support for Hyper-V PV IPI enlightenment
+ for Windows guests.
+ </description>
+ </change>
Okay, not your fault at all, just something that I failed to
communicate properly: updates to the release notes are supposed to
always go in their own commit. The rationale for that is making it
easy for downstreams to cherry-pick the code changes without having
to worry about conflicts in the documentation.

Additionally, and again I'm at fault for not communicating it
adequately, I kinda expected to have a single entry in the release
notes covering both changes. Does that sound reasonable?

Since everything else looks good and I'd rather not have you go
through more trouble than you already have, if you're okay with it
I can just drop this hunk from the patch, slap a

Reviewed-by: Andrea Bolognani <***@redhat.com>

on it and push it; you can then re-post the release note update
as a separate follow up patch. Let me know if that works for you.
--
Andrea Bolognani / Red Hat / Virtualization
Vitaly Kuznetsov
2018-11-14 22:25:09 UTC
Permalink
Post by Andrea Bolognani
Post by Vitaly Kuznetsov
Qemu 3.1 supports Hyper-V-style PV IPIs making it cheaper for Windows
s/Qemu/QEMU/
Better than in v1 but not quite perfect yet ;)
[...]
Post by Vitaly Kuznetsov
+ <change>
+ <summary>
+ qemu: Add Hyper-V PV IPI support
+ </summary>
+ <description>
+ The QEMU driver now has support for Hyper-V PV IPI enlightenment
+ for Windows guests.
+ </description>
+ </change>
Okay, not your fault at all, just something that I failed to
communicate properly: updates to the release notes are supposed to
always go in their own commit. The rationale for that is making it
easy for downstreams to cherry-pick the code changes without having
to worry about conflicts in the documentation.
Additionally, and again I'm at fault for not communicating it
adequately, I kinda expected to have a single entry in the release
notes covering both changes. Does that sound reasonable?
Since everything else looks good and I'd rather not have you go
through more trouble than you already have, if you're okay with it
I can just drop this hunk from the patch, slap a
on it and push it; you can then re-post the release note update
as a separate follow up patch. Let me know if that works for you.
No problem at all, I can do v3 fixing stuff like Qemu/QEMU, separate
docs/news.xml hunks into their own patch (squashing together as a single
<change>).

Thanks for the review!
--
Vitaly
Vitaly Kuznetsov
2018-11-14 16:27:50 UTC
Permalink
Support Hyper-V Enlightened VMCS in domain config. Qemu support will
be implemented in the next patch, adding interim VIR_DOMAIN_HYPERV_EVMCS
cases to src/qemu/* for now.

Signed-off-by: Vitaly Kuznetsov <***@redhat.com>
---
docs/formatdomain.html.in | 7 +++++++
docs/schemas/domaincommon.rng | 5 +++++
src/conf/domain_conf.c | 4 ++++
src/conf/domain_conf.h | 1 +
src/cpu/cpu_x86.c | 3 +++
src/cpu/cpu_x86_data.h | 1 +
src/qemu/qemu_command.c | 1 +
src/qemu/qemu_parse_command.c | 1 +
src/qemu/qemu_process.c | 1 +
9 files changed, 24 insertions(+)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 7592f13a84..1b1518f465 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1982,6 +1982,7 @@
&lt;reenlightenment state='on'/&gt;
&lt;tlbflush state='on'/&gt;
&lt;ipi state='on'/&gt;
+ &lt;evmcs state='on'/&gt;
&lt;/hyperv&gt;
&lt;kvm&gt;
&lt;hidden state='on'/&gt;
@@ -2128,6 +2129,12 @@
<td>on, off</td>
<td><span class="since">4.10.0 (QEMU 3.1)</span></td>
</tr>
+ <tr>
+ <td>evmcs</td>
+ <td>Enable Enlightened VMCS</td>
+ <td>on, off</td>
+ <td><span class="since">4.10.0 (QEMU 3.1)</span></td>
+ </tr>
</table>
</dd>
<dt><code>pvspinlock</code></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 26019b3279..ff57ce1015 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -5774,6 +5774,11 @@
<ref name="featurestate"/>
</element>
</optional>
+ <optional>
+ <element name="evmcs">
+ <ref name="featurestate"/>
+ </element>
+ </optional>
</interleave>
</element>
</define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 24876994c5..18d235872f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -174,6 +174,7 @@ VIR_ENUM_IMPL(virDomainHyperv, VIR_DOMAIN_HYPERV_LAST,
"reenlightenment",
"tlbflush",
"ipi",
+ "evmcs",
);

VIR_ENUM_IMPL(virDomainKVM, VIR_DOMAIN_KVM_LAST,
@@ -19993,6 +19994,7 @@ virDomainDefParseXML(xmlDocPtr xml,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
break;

case VIR_DOMAIN_HYPERV_SPINLOCKS:
@@ -22188,6 +22190,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
if (src->hyperv_features[i] != dst->hyperv_features[i]) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("State of HyperV enlightenment "
@@ -27953,6 +27956,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
break;

case VIR_DOMAIN_HYPERV_SPINLOCKS:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 9eea75548d..061185e779 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1796,6 +1796,7 @@ typedef enum {
VIR_DOMAIN_HYPERV_REENLIGHTENMENT,
VIR_DOMAIN_HYPERV_TLBFLUSH,
VIR_DOMAIN_HYPERV_IPI,
+ VIR_DOMAIN_HYPERV_EVMCS,

VIR_DOMAIN_HYPERV_LAST
} virDomainHyperv;
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 33252e927e..ebfa74fccd 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -116,6 +116,8 @@ KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_TLBFLUSH,
0x40000004, 0x00000004);
KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_IPI,
0x40000004, 0x00000400);
+KVM_FEATURE_DEF(VIR_CPU_x86_KVM_HV_EVMCS,
+ 0x40000004, 0x00004000);

static virCPUx86Feature x86_kvm_features[] =
{
@@ -140,6 +142,7 @@ static virCPUx86Feature x86_kvm_features[] =
KVM_FEATURE(VIR_CPU_x86_KVM_HV_REENLIGHTENMENT),
KVM_FEATURE(VIR_CPU_x86_KVM_HV_TLBFLUSH),
KVM_FEATURE(VIR_CPU_x86_KVM_HV_IPI),
+ KVM_FEATURE(VIR_CPU_x86_KVM_HV_EVMCS),
};

typedef struct _virCPUx86Model virCPUx86Model;
diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h
index 8c51d88e1a..f52bba821f 100644
--- a/src/cpu/cpu_x86_data.h
+++ b/src/cpu/cpu_x86_data.h
@@ -66,6 +66,7 @@ struct _virCPUx86CPUID {
# define VIR_CPU_x86_KVM_HV_REENLIGHTENMENT "__kvm_hv_reenlightenment"
# define VIR_CPU_x86_KVM_HV_TLBFLUSH "__kvm_hv_tlbflush"
# define VIR_CPU_x86_KVM_HV_IPI "__kvm_hv_ipi"
+# define VIR_CPU_x86_KVM_HV_EVMCS "__kvm_hv_evmcs"


# define VIR_CPU_X86_DATA_INIT { 0 }
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 6fc8deff00..27e77f7d66 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6900,6 +6900,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
def->hyperv_vendor_id);
break;

+ case VIR_DOMAIN_HYPERV_EVMCS:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_LAST:
break;
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index a15f4d1121..a1f8369919 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -1580,6 +1580,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,

break;

+ case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 85e2f7046b..ed8bcf7f76 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3959,6 +3959,7 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
virDomainHypervTypeToString(i));
return -1;

+ case VIR_DOMAIN_HYPERV_EVMCS:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_VENDOR_ID:
case VIR_DOMAIN_HYPERV_LAST:
--
2.17.2
Andrea Bolognani
2018-11-14 17:34:26 UTC
Permalink
Post by Vitaly Kuznetsov
Support Hyper-V Enlightened VMCS in domain config. Qemu support will
s/Qemu/QEMU/

With that fixed,

Reviewed-by: Andrea Bolognani <***@redhat.com>
--
Andrea Bolognani / Red Hat / Virtualization
Vitaly Kuznetsov
2018-11-14 16:27:51 UTC
Permalink
Qemu 3.1 supports Hyper-V Enlightened VMCS feature which significantly
speeds up nested Hyper-V on KVM environments.

Signed-off-by: Vitaly Kuznetsov <***@redhat.com>
---
docs/news.xml | 9 +++++++++
src/qemu/qemu_command.c | 2 +-
src/qemu/qemu_parse_command.c | 2 +-
src/qemu/qemu_process.c | 2 +-
tests/qemuxml2argvdata/hyperv-off.xml | 1 +
tests/qemuxml2argvdata/hyperv.args | 2 +-
tests/qemuxml2argvdata/hyperv.xml | 1 +
tests/qemuxml2xmloutdata/hyperv-off.xml | 1 +
tests/qemuxml2xmloutdata/hyperv.xml | 1 +
9 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/docs/news.xml b/docs/news.xml
index c826380a92..dc10cfe69b 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -44,6 +44,15 @@
for Windows guests.
</description>
</change>
+ <change>
+ <summary>
+ qemu: Add Hyper-V Enlightened VMCS support
+ </summary>
+ <description>
+ The QEMU driver now has support for Hyper-V Enlightened VMCS
+ enlightenment for Hyper-V guests.
+ </description>
+ </change>
</section>
<section title="Improvements">
</section>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 27e77f7d66..d543ada2a1 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6883,6 +6883,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON)
virBufferAsprintf(&buf, ",hv_%s",
virDomainHypervTypeToString(i));
@@ -6900,7 +6901,6 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
def->hyperv_vendor_id);
break;

- case VIR_DOMAIN_HYPERV_EVMCS:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_LAST:
break;
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index a1f8369919..d91fc8d901 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -1540,6 +1540,7 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
if (value) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("HyperV feature '%s' should not "
@@ -1580,7 +1581,6 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,

break;

- case VIR_DOMAIN_HYPERV_EVMCS:
case VIR_DOMAIN_HYPERV_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index ed8bcf7f76..ebe8e244ae 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3954,12 +3954,12 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def,
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
case VIR_DOMAIN_HYPERV_TLBFLUSH:
case VIR_DOMAIN_HYPERV_IPI:
+ case VIR_DOMAIN_HYPERV_EVMCS:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("host doesn't support hyperv '%s' feature"),
virDomainHypervTypeToString(i));
return -1;

- case VIR_DOMAIN_HYPERV_EVMCS:
/* coverity[dead_error_begin] */
case VIR_DOMAIN_HYPERV_VENDOR_ID:
case VIR_DOMAIN_HYPERV_LAST:
diff --git a/tests/qemuxml2argvdata/hyperv-off.xml b/tests/qemuxml2argvdata/hyperv-off.xml
index e51cca45b5..59c1e17ccd 100644
--- a/tests/qemuxml2argvdata/hyperv-off.xml
+++ b/tests/qemuxml2argvdata/hyperv-off.xml
@@ -24,6 +24,7 @@
<reenlightenment state='off'/>
<tlbflush state='off'/>
<ipi state='off'/>
+ <evmcs state='off'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2argvdata/hyperv.args b/tests/qemuxml2argvdata/hyperv.args
index 0800e4f79d..5d59788e14 100644
--- a/tests/qemuxml2argvdata/hyperv.args
+++ b/tests/qemuxml2argvdata/hyperv.args
@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
-machine pc,accel=tcg,usb=off,dump-guest-core=off \
-cpu 'qemu32,hv_relaxed,hv_vapic,hv_spinlocks=0x2fff,hv_vpindex,hv_runtime,\
hv_synic,hv_stimer,hv_reset,hv_vendor_id=KVM Hv,hv_frequencies,\
-hv_reenlightenment,hv_tlbflush,hv_ipi' \
+hv_reenlightenment,hv_tlbflush,hv_ipi,hv_evmcs' \
-m 214 \
-smp 6,sockets=6,cores=1,threads=1 \
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
diff --git a/tests/qemuxml2argvdata/hyperv.xml b/tests/qemuxml2argvdata/hyperv.xml
index 05c7d478f7..c6feaed528 100644
--- a/tests/qemuxml2argvdata/hyperv.xml
+++ b/tests/qemuxml2argvdata/hyperv.xml
@@ -24,6 +24,7 @@
<reenlightenment state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
+ <evmcs state='on'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/hyperv-off.xml b/tests/qemuxml2xmloutdata/hyperv-off.xml
index 2282b763b5..1b7d82b14a 100644
--- a/tests/qemuxml2xmloutdata/hyperv-off.xml
+++ b/tests/qemuxml2xmloutdata/hyperv-off.xml
@@ -24,6 +24,7 @@
<reenlightenment state='off'/>
<tlbflush state='off'/>
<ipi state='off'/>
+ <evmcs state='off'/>
</hyperv>
</features>
<clock offset='utc'/>
diff --git a/tests/qemuxml2xmloutdata/hyperv.xml b/tests/qemuxml2xmloutdata/hyperv.xml
index 97f387c172..5510d3dfad 100644
--- a/tests/qemuxml2xmloutdata/hyperv.xml
+++ b/tests/qemuxml2xmloutdata/hyperv.xml
@@ -24,6 +24,7 @@
<reenlightenment state='on'/>
<tlbflush state='on'/>
<ipi state='on'/>
+ <evmcs state='on'/>
</hyperv>
</features>
<clock offset='utc'/>
--
2.17.2
Andrea Bolognani
2018-11-14 17:36:58 UTC
Permalink
Post by Vitaly Kuznetsov
Qemu 3.1 supports Hyper-V Enlightened VMCS feature which significantly
s/Qemu/QEMU/

[...]
Post by Vitaly Kuznetsov
+ <change>
+ <summary>
+ qemu: Add Hyper-V Enlightened VMCS support
+ </summary>
+ <description>
+ The QEMU driver now has support for Hyper-V Enlightened VMCS
+ enlightenment for Hyper-V guests.
+ </description>
+ </change>
Assuming you're okay with this hunk being dropped as suggested in
my reply to 3/5, then

Reviewed-by: Andrea Bolognani <***@redhat.com>
--
Andrea Bolognani / Red Hat / Virtualization
Loading...