[PATCH 0/4] Add support for 'hv-avic' hyperv enlightenment

Peter Krempa (4): conf: virDomainDefFormatFeatures: Realign line cpu: x86: Group and order hyperv enlightenment features by leaf and register cpu: x86: Introduce the 'hv-avic' feature conf: Introduce support for 'hv-avic' Hyper-V enlightenment docs/formatdomain.rst | 1 + src/conf/domain_conf.c | 7 +++++-- src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++++ src/cpu/cpu_x86.c | 9 +++++++-- src/cpu/cpu_x86_data.h | 1 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_process.c | 1 + tests/qemuxml2argvdata/hyperv.x86_64-latest.args | 2 +- tests/qemuxml2argvdata/hyperv.xml | 1 + tests/qemuxml2xmloutdata/hyperv.xml | 1 + 11 files changed, 25 insertions(+), 5 deletions(-) -- 2.37.3

Don't break line after opening bracket of a funtion call. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/conf/domain_conf.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fda1c6caa6..dc2281b2bd 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -26440,8 +26440,7 @@ virDomainDefFormatFeatures(virBuffer *buf, virBufferAsprintf(&childBuf, "<%s state='%s'", virDomainHypervTypeToString(j), - virTristateSwitchTypeToString( - def->hyperv_features[j])); + virTristateSwitchTypeToString(def->hyperv_features[j])); switch ((virDomainHyperv) j) { case VIR_DOMAIN_HYPERV_RELAXED: -- 2.37.3

'VIR_CPU_x86_HV_STIMER_DIRECT' is reported under leaf 0x40000003, but the data is in the EDX register. Create a new group for such features and move them after the 0x40000003 EAX group. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/cpu/cpu_x86.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 4d2379803c..034d25bf60 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -94,14 +94,16 @@ KVM_FEATURE_DEF(VIR_CPU_x86_HV_FREQUENCIES, 0x40000003, 0x00000800, 0x0); KVM_FEATURE_DEF(VIR_CPU_x86_HV_REENLIGHTENMENT, 0x40000003, 0x00002000, 0x0); + +KVM_FEATURE_DEF(VIR_CPU_x86_HV_STIMER_DIRECT, + 0x40000003, 0x0, 0x00080000); + KVM_FEATURE_DEF(VIR_CPU_x86_HV_TLBFLUSH, 0x40000004, 0x00000004, 0x0); KVM_FEATURE_DEF(VIR_CPU_x86_HV_IPI, 0x40000004, 0x00000400, 0x0); KVM_FEATURE_DEF(VIR_CPU_x86_HV_EVMCS, 0x40000004, 0x00004000, 0x0); -KVM_FEATURE_DEF(VIR_CPU_x86_HV_STIMER_DIRECT, - 0x40000003, 0x0, 0x00080000); static virCPUx86Feature x86_kvm_features[] = { -- 2.37.3

Based on qemu commit e1f9a8e8c90ae54387922e33e5ac4fd759747d01 introduce the hv-avic feature in leaf 0x40000004, EAX 0x00000200 (1 << 9). Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/cpu/cpu_x86.c | 3 +++ src/cpu/cpu_x86_data.h | 1 + 2 files changed, 4 insertions(+) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 034d25bf60..b3f76f3d79 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -100,6 +100,8 @@ KVM_FEATURE_DEF(VIR_CPU_x86_HV_STIMER_DIRECT, KVM_FEATURE_DEF(VIR_CPU_x86_HV_TLBFLUSH, 0x40000004, 0x00000004, 0x0); +KVM_FEATURE_DEF(VIR_CPU_x86_HV_AVIC, + 0x40000004, 0x00000200, 0x0); KVM_FEATURE_DEF(VIR_CPU_x86_HV_IPI, 0x40000004, 0x00000400, 0x0); KVM_FEATURE_DEF(VIR_CPU_x86_HV_EVMCS, @@ -118,6 +120,7 @@ static virCPUx86Feature x86_kvm_features[] = KVM_FEATURE(VIR_CPU_x86_HV_FREQUENCIES), KVM_FEATURE(VIR_CPU_x86_HV_REENLIGHTENMENT), KVM_FEATURE(VIR_CPU_x86_HV_TLBFLUSH), + KVM_FEATURE(VIR_CPU_x86_HV_AVIC), KVM_FEATURE(VIR_CPU_x86_HV_IPI), KVM_FEATURE(VIR_CPU_x86_HV_EVMCS), KVM_FEATURE(VIR_CPU_x86_HV_STIMER_DIRECT), diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h index 9a4333bf2b..d1ca63db6d 100644 --- a/src/cpu/cpu_x86_data.h +++ b/src/cpu/cpu_x86_data.h @@ -61,6 +61,7 @@ struct _virCPUx86MSR { #define VIR_CPU_x86_HV_TLBFLUSH "hv-tlbflush" #define VIR_CPU_x86_HV_IPI "hv-ipi" #define VIR_CPU_x86_HV_EVMCS "hv-evmcs" +#define VIR_CPU_x86_HV_AVIC "hv-avic" /* Hyper-V Synthetic Timer option */ #define VIR_CPU_x86_HV_STIMER_DIRECT "hv-stimer-direct" -- 2.37.3

qemu-6.2 introduced support for the hv-avic enlightenment which allows to use Hyper-V SynIC with hardware APICv/AVIC enabled. Implement the libvirt support for it. Closes: https://gitlab.com/libvirt/libvirt/-/issues/402 Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- docs/formatdomain.rst | 1 + src/conf/domain_conf.c | 4 ++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++++ src/qemu/qemu_command.c | 1 + src/qemu/qemu_process.c | 1 + tests/qemuxml2argvdata/hyperv.x86_64-latest.args | 2 +- tests/qemuxml2argvdata/hyperv.xml | 1 + tests/qemuxml2xmloutdata/hyperv.xml | 1 + 9 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index acb318520c..488b6be862 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2016,6 +2016,7 @@ are: tlbflush Enable PV TLB flush support on, off :since:`4.7.0 (QEMU 3.0)` ipi Enable PV IPI support on, off :since:`4.10.0 (QEMU 3.1)` evmcs Enable Enlightened VMCS on, off :since:`4.10.0 (QEMU 3.1)` + avic Enable use Hyper-V SynIC with hardware APICv/AVIC on, off :since:`8.10.0 (QEMU 6.2)` =============== ====================================================================== ============================================ ======================================================= :since:`Since 8.0.0` , the hypervisor can be configured further by setting diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dc2281b2bd..2643f62e03 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -206,6 +206,7 @@ VIR_ENUM_IMPL(virDomainHyperv, "tlbflush", "ipi", "evmcs", + "avic", ); VIR_ENUM_IMPL(virDomainKVM, @@ -15814,6 +15815,7 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def, case VIR_DOMAIN_HYPERV_TLBFLUSH: case VIR_DOMAIN_HYPERV_IPI: case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: break; case VIR_DOMAIN_HYPERV_STIMER: @@ -20134,6 +20136,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src, case VIR_DOMAIN_HYPERV_TLBFLUSH: case VIR_DOMAIN_HYPERV_IPI: case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: if (src->hyperv_features[i] != dst->hyperv_features[i]) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("State of HyperV enlightenment " @@ -26454,6 +26457,7 @@ virDomainDefFormatFeatures(virBuffer *buf, case VIR_DOMAIN_HYPERV_TLBFLUSH: case VIR_DOMAIN_HYPERV_IPI: case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: virBufferAddLit(&childBuf, "/>\n"); break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 54dc9098df..a05d4d4b1c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2149,6 +2149,7 @@ typedef enum { VIR_DOMAIN_HYPERV_TLBFLUSH, VIR_DOMAIN_HYPERV_IPI, VIR_DOMAIN_HYPERV_EVMCS, + VIR_DOMAIN_HYPERV_AVIC, VIR_DOMAIN_HYPERV_LAST } virDomainHyperv; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index cefe818044..03703148df 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -7461,6 +7461,11 @@ <ref name="featurestate"/> </element> </optional> + <optional> + <element name="avic"> + <ref name="featurestate"/> + </element> + </optional> </interleave> </group> </choice> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 256ef4912c..513ff7624f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -6237,6 +6237,7 @@ qemuBuildCpuCommandLine(virCommand *cmd, case VIR_DOMAIN_HYPERV_TLBFLUSH: case VIR_DOMAIN_HYPERV_IPI: case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) virBufferAsprintf(&buf, ",hv-%s=on", virDomainHypervTypeToString(i)); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e7f92228f5..0ced2d88ab 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4245,6 +4245,7 @@ qemuProcessVerifyHypervFeatures(virDomainDef *def, case VIR_DOMAIN_HYPERV_TLBFLUSH: case VIR_DOMAIN_HYPERV_IPI: case VIR_DOMAIN_HYPERV_EVMCS: + case VIR_DOMAIN_HYPERV_AVIC: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("host doesn't support hyperv '%s' feature"), virDomainHypervTypeToString(i)); diff --git a/tests/qemuxml2argvdata/hyperv.x86_64-latest.args b/tests/qemuxml2argvdata/hyperv.x86_64-latest.args index 50329f6e30..0b00102e18 100644 --- a/tests/qemuxml2argvdata/hyperv.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hyperv.x86_64-latest.args @@ -12,7 +12,7 @@ XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \ -object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \ -machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram \ -accel tcg \ --cpu 'qemu64,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0x2fff,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-reset=on,hv-vendor-id=KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-ipi=on,hv-evmcs=on' \ +-cpu 'qemu64,hv-relaxed=on,hv-vapic=on,hv-spinlocks=0x2fff,hv-vpindex=on,hv-runtime=on,hv-synic=on,hv-stimer=on,hv-reset=on,hv-vendor-id=KVM Hv,hv-frequencies=on,hv-reenlightenment=on,hv-tlbflush=on,hv-ipi=on,hv-evmcs=on,hv-avic=on' \ -m 214 \ -object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ -overcommit mem-lock=off \ diff --git a/tests/qemuxml2argvdata/hyperv.xml b/tests/qemuxml2argvdata/hyperv.xml index e3184b3657..dde091aa9a 100644 --- a/tests/qemuxml2argvdata/hyperv.xml +++ b/tests/qemuxml2argvdata/hyperv.xml @@ -25,6 +25,7 @@ <tlbflush state='on'/> <ipi state='on'/> <evmcs state='on'/> + <avic state='on'/> </hyperv> </features> <clock offset='utc'/> diff --git a/tests/qemuxml2xmloutdata/hyperv.xml b/tests/qemuxml2xmloutdata/hyperv.xml index e21c330767..4445c85118 100644 --- a/tests/qemuxml2xmloutdata/hyperv.xml +++ b/tests/qemuxml2xmloutdata/hyperv.xml @@ -25,6 +25,7 @@ <tlbflush state='on'/> <ipi state='on'/> <evmcs state='on'/> + <avic state='on'/> </hyperv> </features> <clock offset='utc'/> -- 2.37.3

On a Tuesday in 2022, Peter Krempa wrote:
Peter Krempa (4): conf: virDomainDefFormatFeatures: Realign line cpu: x86: Group and order hyperv enlightenment features by leaf and register cpu: x86: Introduce the 'hv-avic' feature conf: Introduce support for 'hv-avic' Hyper-V enlightenment
docs/formatdomain.rst | 1 + src/conf/domain_conf.c | 7 +++++-- src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++++ src/cpu/cpu_x86.c | 9 +++++++-- src/cpu/cpu_x86_data.h | 1 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_process.c | 1 + tests/qemuxml2argvdata/hyperv.x86_64-latest.args | 2 +- tests/qemuxml2argvdata/hyperv.xml | 1 + tests/qemuxml2xmloutdata/hyperv.xml | 1 + 11 files changed, 25 insertions(+), 5 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa