]> xenbits.xensource.com Git - libvirt.git/commitdiff
domain_capabilities: Expose Hyper-V Enlightenments
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 21 Dec 2022 14:14:54 +0000 (15:14 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 5 Jan 2023 11:35:20 +0000 (12:35 +0100)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
docs/formatdomaincaps.rst
src/conf/domain_capabilities.c
src/conf/domain_capabilities.h
src/conf/schemas/domaincaps.rng

index 532fea0f60a8f405e83caefdbc26bbfe83e8d095..dc227e9d02f55b01b76889f7b3196d616bc79eed 100644 (file)
@@ -624,6 +624,12 @@ capabilities. All features occur as children of the main ``features`` element.
            <section node='1' size='262144' unit='KiB'/>
          </sections>
        </sgx>
+       <hyperv supported='yes'>
+         <enum name='features'>
+           <value>relaxed</value>
+           <value>vapic</value>
+         </enum>
+       </hyperv>
      </features>
    </domainCapabilities>
 
@@ -733,3 +739,12 @@ document store. In order to use SGX with libvirt have a look at `SGX in domain X
 
 ``sections``
    The sections of the SGX enclave page cache (called EPC).
+
+
+Hyper-V Enlightenments
+^^^^^^^^^^^^^^^^^^^^^^
+
+Report which features improving behavior of guests running Microsoft Windows
+are supported. The ``features`` enum corresponds to the ``<hyperv/>`` element
+(well, its children) as documented in `Hypervisor features
+<formatdomain.html#hypervisor-features>`__
index edaa8df6ac23b66ec12737114b4a3d051552563a..7c30e629c7cc5a61b50fcc53aea751c12d4481ab 100644 (file)
@@ -100,6 +100,7 @@ virDomainCapsDispose(void *obj)
     virCPUDefFree(caps->cpu.hostModel);
     virSEVCapabilitiesFree(caps->sev);
     virSGXCapabilitiesFree(caps->sgx);
+    g_free(caps->hyperv);
 
     values = &caps->os.loader.values;
     for (i = 0; i < values->nvalues; i++)
@@ -678,6 +679,20 @@ virDomainCapsFeatureSGXFormat(virBuffer *buf,
     virBufferAddLit(buf, "</sgx>\n");
 }
 
+static void
+virDomainCapsFeatureHypervFormat(virBuffer *buf,
+                                 const virDomainCapsFeatureHyperv *hyperv)
+{
+    if (!hyperv)
+        return;
+
+    FORMAT_PROLOGUE(hyperv);
+
+    ENUM_PROCESS(hyperv, features, virDomainHypervTypeToString);
+
+    FORMAT_EPILOGUE(hyperv);
+}
+
 static void
 virDomainCapsFormatFeatures(const virDomainCaps *caps,
                             virBuffer *buf)
@@ -698,6 +713,7 @@ virDomainCapsFormatFeatures(const virDomainCaps *caps,
 
     virDomainCapsFeatureSEVFormat(&childBuf, caps->sev);
     virDomainCapsFeatureSGXFormat(&childBuf, caps->sgx);
+    virDomainCapsFeatureHypervFormat(&childBuf, caps->hyperv);
 
     virXMLFormatElement(buf, "features", NULL, &childBuf);
 }
index 1d504a3506c506737ed350f168a0ed4cee470182..770856bf5357c5b4926c34ada86b9144bb1b53fa 100644 (file)
@@ -158,6 +158,13 @@ struct _virDomainCapsFeatureGIC {
     virDomainCapsEnum version; /* Info about virGICVersion */
 };
 
+STATIC_ASSERT_ENUM(VIR_DOMAIN_HYPERV_LAST);
+typedef struct _virDomainCapsFeatureHyperv virDomainCapsFeatureHyperv;
+struct _virDomainCapsFeatureHyperv {
+    virTristateBool supported;
+    virDomainCapsEnum features; /* Info about supported virDomainHyperv features */
+};
+
 typedef enum {
     VIR_DOMCAPS_CPU_USABLE_UNKNOWN,
     VIR_DOMCAPS_CPU_USABLE_YES,
@@ -263,6 +270,7 @@ struct _virDomainCaps {
     virDomainCapsFeatureGIC gic;
     virSEVCapability *sev;
     virSGXCapability *sgx;
+    virDomainCapsFeatureHyperv *hyperv;
     /* add new domain features here */
 
     virTristateBool features[VIR_DOMAIN_CAPS_FEATURE_LAST];
index b6408bca88bd087e3f0933543d3ccc8f72d3ae46..4b96e89dfa892c182eb5b40922c453b33fa13436 100644 (file)
       <optional>
         <ref name="sgx"/>
       </optional>
+      <optional>
+        <ref name="hyperv"/>
+      </optional>
     </element>
   </define>
 
     </element>
   </define>
 
+  <define name="hyperv">
+    <element name="hyperv">
+      <ref name="supported"/>
+      <ref name="enum"/>
+    </element>
+  </define>
+
   <define name="value">
     <zeroOrMore>
       <element name="value">