[PATCH v3 1/4] conf: Introduce TCG domain features

Michal Privoznik mprivozn at redhat.com
Thu Dec 2 08:53:33 UTC 2021


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 at redhat.com>
Tested-by: Kashyap Chamarthy <kchamart at redhat.com>
---
 docs/formatdomain.rst                         | 11 ++++
 docs/schemas/domaincommon.rng                 | 15 ++++-
 src/conf/domain_conf.c                        | 58 ++++++++++++++++++-
 src/conf/domain_conf.h                        |  7 +++
 src/qemu/qemu_validate.c                      |  1 +
 .../x86_64-default-cpu-tcg-features.xml       | 56 ++++++++++++++++++
 ...default-cpu-tcg-features.x86_64-latest.xml |  1 +
 tests/qemuxml2xmltest.c                       |  1 +
 8 files changed, 147 insertions(+), 3 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
 create mode 120000 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-features.x86_64-latest.xml

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index eb8c973cf1..041dfc699d 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -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"/>`
 
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index f01b7a6470..ce51e95895 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -6092,7 +6092,7 @@
     </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">
@@ -6232,6 +6232,9 @@
           <optional>
             <ref name="ibs"/>
           </optional>
+          <optional>
+            <ref name="tcgfeatures"/>
+          </optional>
         </interleave>
       </element>
     </optional>
@@ -6520,6 +6523,16 @@
     </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>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bdcc3dc2c1..7306fdc179 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -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);
@@ -17652,6 +17654,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)
@@ -17860,6 +17886,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;
         }
@@ -21664,8 +21695,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
             break;
 
         case VIR_DOMAIN_FEATURE_MSRS:
-            break;
-
+        case VIR_DOMAIN_FEATURE_TCG:
         case VIR_DOMAIN_FEATURE_LAST:
             break;
         }
@@ -27652,6 +27682,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)
@@ -27972,6 +28022,10 @@ virDomainDefFormatFeatures(virBuffer *buf,
                               virDomainIBSTypeToString(def->features[i]));
             break;
 
+        case VIR_DOMAIN_FEATURE_TCG:
+            virDomainFeatureTCGFormat(&childBuf, def);
+            break;
+
         case VIR_DOMAIN_FEATURE_LAST:
             break;
         }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index c0c07ea6ba..b410922f68 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -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;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 1de6e05101..a7c89f27cf 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -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
index 0000000000..808e31752c
--- /dev/null
+++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
@@ -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
index 0000000000..8226a54027
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-features.x86_64-latest.xml
@@ -0,0 +1 @@
+../qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
\ No newline at end of file
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index b535cda187..9ea9a1ddba 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -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");
-- 
2.32.0




More information about the libvir-list mailing list