[libvirt] [PATCH v2 0/5] conf: qemu: support new Hyper-V enlightenments in Qemu 3.1

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

Remove redundant leading whitespaces from "<td> on, off</td>". Suggested-by: Andrea Bolognani <abologna@redhat.com> Signed-off-by: Vitaly Kuznetsov <vkuznets@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

On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
Remove redundant leading whitespaces from "<td> on, off</td>".
In the subject: s/whitespate/whitespace/ With that fixed, Reviewed-by: Andrea Bolognani <abologna@redhat.com> -- Andrea Bolognani / Red Hat / Virtualization

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 <vkuznets@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 @@ <frequencies state='on'/> <reenlightenment state='on'/> <tlbflush state='on'/> + <ipi state='on'/> </hyperv> <kvm> <hidden state='on'/> @@ -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

On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
Support Hyper-V PV IPI enlightenment in domain config. Qemu support will
s/Qemu/QEMU/
be implemented in the next patch, adding interim VIR_DOMAIN_HYPERV_IPI cases to src/qemu/* for now.
Signed-off-by: Vitaly Kuznetsov <vkuznets@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(-)
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 <abologna@redhat.com> -- Andrea Bolognani / Red Hat / Virtualization

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 <vkuznets@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

On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
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 ;) [...]
+ <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 <abologna@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

Andrea Bolognani <abologna@redhat.com> writes:
On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
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 ;)
[...]
+ <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 <abologna@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.
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

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 <vkuznets@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 @@ <reenlightenment state='on'/> <tlbflush state='on'/> <ipi state='on'/> + <evmcs state='on'/> </hyperv> <kvm> <hidden state='on'/> @@ -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

On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
Support Hyper-V Enlightened VMCS in domain config. Qemu support will
s/Qemu/QEMU/ With that fixed, Reviewed-by: Andrea Bolognani <abologna@redhat.com> -- Andrea Bolognani / Red Hat / Virtualization

Qemu 3.1 supports Hyper-V Enlightened VMCS feature which significantly speeds up nested Hyper-V on KVM environments. Signed-off-by: Vitaly Kuznetsov <vkuznets@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

On Wed, 2018-11-14 at 17:27 +0100, Vitaly Kuznetsov wrote:
Qemu 3.1 supports Hyper-V Enlightened VMCS feature which significantly
s/Qemu/QEMU/ [...]
+ <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 <abologna@redhat.com> -- Andrea Bolognani / Red Hat / Virtualization
participants (2)
-
Andrea Bolognani
-
Vitaly Kuznetsov