mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
conf: Introduce TCG domain features
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>
This commit is contained in:
parent
c1b06f5cf0
commit
f106788069
@ -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"/>`
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
56
tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
Normal file
56
tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
Normal file
@ -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>
|
@ -0,0 +1 @@
|
||||
../qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user