]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Introduce support for 'hv-avic' Hyper-V enlightenment
authorPeter Krempa <pkrempa@redhat.com>
Tue, 8 Nov 2022 12:29:04 +0000 (13:29 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Nov 2022 13:08:31 +0000 (14:08 +0100)
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>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
docs/formatdomain.rst
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/schemas/domaincommon.rng
src/qemu/qemu_command.c
src/qemu/qemu_process.c
tests/qemuxml2argvdata/hyperv.x86_64-latest.args
tests/qemuxml2argvdata/hyperv.xml
tests/qemuxml2xmloutdata/hyperv.xml

index acb318520c62a6350cf95df37bab2f075e953818..488b6be862f3cfc9c3c29bc895c0c32566d2e79f 100644 (file)
@@ -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
index 34686144f23c4a1d4c073666aadbf0daec71cd35..cbc08064c430315a1aef34dd344b4dbf5b7405d4 100644 (file)
@@ -206,6 +206,7 @@ VIR_ENUM_IMPL(virDomainHyperv,
               "tlbflush",
               "ipi",
               "evmcs",
+              "avic",
 );
 
 VIR_ENUM_IMPL(virDomainKVM,
@@ -15840,6 +15841,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:
@@ -20160,6 +20162,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 "
@@ -26506,6 +26509,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;
 
index 321fa216f89b927a649576aacf5d4c75097ecc01..a076471808ae9e8849d0c19236b7e77c2d23f4c6 100644 (file)
@@ -2151,6 +2151,7 @@ typedef enum {
     VIR_DOMAIN_HYPERV_TLBFLUSH,
     VIR_DOMAIN_HYPERV_IPI,
     VIR_DOMAIN_HYPERV_EVMCS,
+    VIR_DOMAIN_HYPERV_AVIC,
 
     VIR_DOMAIN_HYPERV_LAST
 } virDomainHyperv;
index cefe818044da50c4ae9c102885f359026dbf8aae..03703148dfa1c15443fe0ab42e6ff83f85fdc668 100644 (file)
                 <ref name="featurestate"/>
               </element>
             </optional>
+            <optional>
+              <element name="avic">
+                <ref name="featurestate"/>
+              </element>
+            </optional>
           </interleave>
         </group>
       </choice>
index 3236196c14fce1276347416f64681c0acc5d73b8..18a36495b92febd63be35e2ced382df59313cd8b 100644 (file)
@@ -6230,6 +6230,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));
index 40abd306f6692b6f7eb50aecf0de8dad8da0e5c5..5a72e353088a5428095e459fbaa0c00044c1e6d4 100644 (file)
@@ -4243,6 +4243,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));
index 50329f6e30877b30cde8d3f84398085a18317815..0b00102e1862df0bd1b8890064e7702720e378dd 100644 (file)
@@ -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 \
index e3184b36578343dc4418fc18b1c8c220904ecf50..dde091aa9a2a37a926175bf6fd933619c834c4cc 100644 (file)
@@ -25,6 +25,7 @@
       <tlbflush state='on'/>
       <ipi state='on'/>
       <evmcs state='on'/>
+      <avic state='on'/>
     </hyperv>
   </features>
   <clock offset='utc'/>
index e21c3307676fefeece0a8bbfd776d20158108984..4445c85118b927f3f0898f84484b3c71ea6767bf 100644 (file)
@@ -25,6 +25,7 @@
       <tlbflush state='on'/>
       <ipi state='on'/>
       <evmcs state='on'/>
+      <avic state='on'/>
     </hyperv>
   </features>
   <clock offset='utc'/>