]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Introduce TCG domain features
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 3 Nov 2021 12:15:41 +0000 (13:15 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 13 Dec 2021 16:01:02 +0000 (17:01 +0100)
It may come handy to be able to tweak TCG options, in this
specific case the size of translation block cache size (tb-size).
Since we can expect more knobs to tweak let's put them under
common element, like this:

  <domain>
    <features>
      <tcg>
        <tb-cache unit='MiB'>128</tb-cache>
      </tcg>
    </features>
  </domain>

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Tested-by: Kashyap Chamarthy <kchamart@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
docs/formatdomain.rst
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_validate.c
tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-features.x86_64-latest.xml [new symlink]
tests/qemuxml2xmltest.c

index eb8c973cf1fcb3ff40f8524160b5a14adb244fd6..041dfc699d351d5e8a94fb48f8ae12f532384105 100644 (file)
@@ -1864,6 +1864,9 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
      <cfpc value='workaround'/>
      <sbbc value='workaround'/>
      <ibs value='fixed-na'/>
+     <tcg>
+       <tb-cache unit='MiB'>128</tb-cache>
+     </tcg>
    </features>
    ...
 
@@ -2065,6 +2068,14 @@ are:
    ``fixed-na (fixed in           hardware - no longer applicable)``. If the
    attribute is not defined, the hypervisor default will be used. :since:`Since
    6.3.0` (QEMU/KVM only)
+``tcg``
+   Various features to change the behavior of the TCG accelerator.
+
+   =========== ============================================== =================================================== ==============
+   Feature     Description                                    Value                                               Since
+   =========== ============================================== =================================================== ==============
+   tb-cache    The size of translation block cache size       an integer                                          :since:`8.0.0`
+   =========== ============================================== =================================================== ==============
 
 :anchor:`<a id="elementsTime"/>`
 
index f01b7a64704b4d09435c71b7b466f81deb993c75..ce51e95895b8226158ebc1c4f85b1ef1ecef74e5 100644 (file)
     </element>
   </define>
   <!--
-      A set of optional features: PAE, APIC, ACPI, GIC,
+      A set of optional features: PAE, APIC, ACPI, GIC, TCG,
       HyperV Enlightenment, KVM features, paravirtual spinlocks and HAP support
     -->
   <define name="features">
           <optional>
             <ref name="ibs"/>
           </optional>
+          <optional>
+            <ref name="tcgfeatures"/>
+          </optional>
         </interleave>
       </element>
     </optional>
     </element>
   </define>
 
+  <define name="tcgfeatures">
+    <element name="tcg">
+      <optional>
+        <element name="tb-cache">
+          <ref name="scaledInteger"/>
+        </element>
+      </optional>
+    </element>
+  </define>
+
   <define name="address">
     <element name="address">
       <choice>
index c634e7dd4191c920e0fb0854eb93a4c9ac901d2b..b6249aa76fd0aa62d660f64542b4f661faec1005 100644 (file)
@@ -172,6 +172,7 @@ VIR_ENUM_IMPL(virDomainFeature,
               "cfpc",
               "sbbc",
               "ibs",
+              "tcg",
 );
 
 VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
@@ -3713,6 +3714,7 @@ void virDomainDefFree(virDomainDef *def)
     g_free(def->description);
     g_free(def->title);
     g_free(def->hyperv_vendor_id);
+    g_free(def->tcg_features);
 
     virBlkioDeviceArrayClear(def->blkio.devices,
                              def->blkio.ndevices);
@@ -17648,6 +17650,30 @@ virDomainFeaturesCapabilitiesDefParse(virDomainDef *def,
 }
 
 
+static int
+virDomainFeaturesTCGDefParse(virDomainDef *def,
+                             xmlXPathContextPtr ctxt,
+                             xmlNodePtr node)
+{
+    g_autofree virDomainFeatureTCG *tcg = NULL;
+    VIR_XPATH_NODE_AUTORESTORE(ctxt);
+
+    tcg = g_new0(virDomainFeatureTCG, 1);
+    ctxt->node = node;
+
+    if (virDomainParseMemory("./tb-cache", "./tb-cache/@unit",
+                             ctxt, &tcg->tb_cache, false, false) < 0)
+        return -1;
+
+    if (tcg->tb_cache == 0)
+        return 0;
+
+    def->features[VIR_DOMAIN_FEATURE_TCG] = VIR_TRISTATE_SWITCH_ON;
+    def->tcg_features = g_steal_pointer(&tcg);
+    return 0;
+}
+
+
 static int
 virDomainFeaturesDefParse(virDomainDef *def,
                           xmlXPathContextPtr ctxt)
@@ -17856,6 +17882,11 @@ virDomainFeaturesDefParse(virDomainDef *def,
             break;
         }
 
+        case VIR_DOMAIN_FEATURE_TCG:
+            if (virDomainFeaturesTCGDefParse(def, ctxt, nodes[i]) < 0)
+                return -1;
+            break;
+
         case VIR_DOMAIN_FEATURE_LAST:
             break;
         }
@@ -21656,8 +21687,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
             break;
 
         case VIR_DOMAIN_FEATURE_MSRS:
-            break;
-
+        case VIR_DOMAIN_FEATURE_TCG:
         case VIR_DOMAIN_FEATURE_LAST:
             break;
         }
@@ -27644,6 +27674,26 @@ virDomainDefFormatBlkiotune(virBuffer *buf,
 }
 
 
+static void
+virDomainFeatureTCGFormat(virBuffer *buf,
+                          const virDomainDef *def)
+{
+    g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+
+    if (!def->tcg_features ||
+        def->features[VIR_DOMAIN_FEATURE_TCG] != VIR_TRISTATE_SWITCH_ON)
+        return;
+
+    if (def->tcg_features->tb_cache > 0) {
+        virBufferAsprintf(&childBuf,
+                          "<tb-cache unit='KiB'>%lld</tb-cache>\n",
+                          def->tcg_features->tb_cache);
+    }
+
+    virXMLFormatElement(buf, "tcg", NULL, &childBuf);
+}
+
+
 static int
 virDomainDefFormatFeatures(virBuffer *buf,
                            virDomainDef *def)
@@ -27964,6 +28014,10 @@ virDomainDefFormatFeatures(virBuffer *buf,
                               virDomainIBSTypeToString(def->features[i]));
             break;
 
+        case VIR_DOMAIN_FEATURE_TCG:
+            virDomainFeatureTCGFormat(&childBuf, def);
+            break;
+
         case VIR_DOMAIN_FEATURE_LAST:
             break;
         }
index c0c07ea6ba24c3c1554e00422c812f698467ee73..b410922f683bc62e7d9400980ea2d1f93ba0bffb 100644 (file)
@@ -2054,6 +2054,7 @@ typedef enum {
     VIR_DOMAIN_FEATURE_CFPC,
     VIR_DOMAIN_FEATURE_SBBC,
     VIR_DOMAIN_FEATURE_IBS,
+    VIR_DOMAIN_FEATURE_TCG,
 
     VIR_DOMAIN_FEATURE_LAST
 } virDomainFeature;
@@ -2262,6 +2263,11 @@ typedef enum {
 
 VIR_ENUM_DECL(virDomainIBS);
 
+typedef struct _virDomainFeatureTCG virDomainFeatureTCG;
+struct _virDomainFeatureTCG {
+    unsigned long long tb_cache; /* Stored in KiB */
+};
+
 /* Operating system configuration data & machine / arch */
 struct _virDomainOSEnv {
     char *name;
@@ -2824,6 +2830,7 @@ struct _virDomainDef {
     unsigned long long hpt_maxpagesize; /* Stored in KiB */
     char *hyperv_vendor_id;
     virTristateSwitch apic_eoi;
+    virDomainFeatureTCG *tcg_features;
 
     bool tseg_specified;
     unsigned long long tseg_size;
index 29b01495ad64e629e80dcc392cb390fdc2c77afb..2c9ccbd4fd9f71eb297fa255333e14a9f22ed5a3 100644 (file)
@@ -294,6 +294,7 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
             }
             break;
 
+        case VIR_DOMAIN_FEATURE_TCG:
         case VIR_DOMAIN_FEATURE_SMM:
         case VIR_DOMAIN_FEATURE_KVM:
         case VIR_DOMAIN_FEATURE_XEN:
diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
new file mode 100644 (file)
index 0000000..808e317
--- /dev/null
@@ -0,0 +1,56 @@
+<domain type='qemu'>
+  <name>guest</name>
+  <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+  <memory unit='KiB'>4194304</memory>
+  <currentMemory unit='KiB'>4194304</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <tcg>
+      <tb-cache unit='KiB'>102400</tb-cache>
+    </tcg>
+  </features>
+  <cpu mode='custom' match='exact' check='none'>
+    <model fallback='forbid'>qemu64</model>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0' model='qemu-xhci'>
+      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+    </controller>
+    <controller type='sata' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
+    </controller>
+    <controller type='pci' index='0' model='pcie-root'/>
+    <controller type='pci' index='1' model='pcie-root-port'>
+      <model name='pcie-root-port'/>
+      <target chassis='1' port='0x8'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
+    </controller>
+    <controller type='pci' index='2' model='pcie-root-port'>
+      <model name='pcie-root-port'/>
+      <target chassis='2' port='0x9'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='3' model='pcie-root-port'>
+      <model name='pcie-root-port'/>
+      <target chassis='3' port='0xa'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <audio id='1' type='none'/>
+    <memballoon model='virtio'>
+      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-features.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-features.x86_64-latest.xml
new file mode 120000 (symlink)
index 0000000..8226a54
--- /dev/null
@@ -0,0 +1 @@
+../qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
\ No newline at end of file
index b535cda1879fbcc3322fc703901faba1d7566a4d..9ea9a1ddba3af4f29fe9aed90613cac35a6278bd 100644 (file)
@@ -1387,6 +1387,7 @@ mymain(void)
     DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-pc-4.2", "x86_64");
     DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-q35-4.2", "x86_64");
     DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64");
+    DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-features", "x86_64");
 
     DO_TEST_CAPS_LATEST("virtio-9p-multidevs");
     DO_TEST_CAPS_LATEST("virtio-9p-createmode");