[PATCH v2 3/4] conf: Introduce TCG domain features
Peter Krempa
pkrempa at redhat.com
Mon Nov 22 09:30:37 UTC 2021
On Fri, Nov 05, 2021 at 10:35:19 +0100, Michal Privoznik wrote:
> 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 | 90 +++++++++++++++++++
> src/conf/domain_conf.h | 7 ++
> src/qemu/qemu_validate.c | 11 +++
> .../x86_64-default-cpu-tcg-features.xml | 67 ++++++++++++++
> ...default-cpu-tcg-features.x86_64-latest.xml | 1 +
> tests/qemuxml2xmltest.c | 1 +
> 8 files changed, 202 insertions(+), 1 deletion(-)
> 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
[...]
> @@ -21555,6 +21585,39 @@ virDomainRedirFilterDefCheckABIStability(virDomainRedirFilterDef *src,
> }
>
>
> +static bool
> +virDomainFeatureTCGCheckABIStability(const virDomainDef *src,
> + const virDomainDef *dst)
> +{
> + const int srcF = src->features[VIR_DOMAIN_FEATURE_TCG];
> + const int dstF = dst->features[VIR_DOMAIN_FEATURE_TCG];
> +
> + if (srcF != dstF ||
> + !!src->tcg_features != !!dst->tcg_features) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("State of feature '%s' differs: "
> + "source: '%s', destination: '%s'"),
> + virDomainFeatureTypeToString(VIR_DOMAIN_FEATURE_TCG),
> + virTristateSwitchTypeToString(srcF),
> + virTristateSwitchTypeToString(dstF));
> + return false;
> + }
> +
> + if (!src->tcg_features && !dst->tcg_features)
> + return true;
This check is either questionable (e.g. if just one of them is non-NULL,
this doesn't trigger and the subsequent condition dereferences NULL in
the other one), or unnecessary.
> + if (src->tcg_features->tb_cache != dst->tcg_features->tb_cache) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("TCG tb-cache mismatch: source %llu, destination: %llu"),
> + src->tcg_features->tb_cache,
> + dst->tcg_features->tb_cache);
I don't think this is ABI, do you have any supporting evidence? If yes,
put it into the commnet for the next person questioning this.
> + return false;
> + }
> +
> + return true;
> +}
> +
> +
> static bool
> virDomainDefFeaturesCheckABIStability(virDomainDef *src,
> virDomainDef *dst)
[...]
> @@ -27691,6 +27759,24 @@ 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;
> +
> + virBufferAsprintf(&childBuf,
> + "<tb-cache unit='KiB'>%lld</tb-cache>\n",
> + def->tcg_features->tb_cache);
This is not very extensible and similarly the parser as setting the
cache to 0 is considered as not being present.
> +
> + virXMLFormatElement(buf, "tcg", NULL, &childBuf);
> +}
> +
> +
> static int
> virDomainDefFormatFeatures(virBuffer *buf,
> virDomainDef *def)
[...]
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index 397eea5ede..bd33c9a800 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -294,6 +294,17 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
> }
> break;
>
> + case VIR_DOMAIN_FEATURE_TCG:
> + if (def->features[i] == VIR_TRISTATE_SWITCH_ON) {
> + if (def->virtType != VIR_DOMAIN_VIRT_QEMU) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("TCG features are incompatible with domain type '%s'"),
> + virDomainVirtTypeToString(def->virtType));
> + return -1;
> + }
> + }
> + break;
> +
Preferably, implement the qemu logic in the patch adding the qemu bits.
> 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..e2058487b2
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.xml
> @@ -0,0 +1,67 @@
> +<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>
> + <disk type='file' device='disk'>
> + <driver name='qemu' type='qcow2'/>
> + <source file='/var/lib/libvirt/images/guest.qcow2'/>
> + <target dev='vda' bus='virtio'/>
> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
> + </disk>
Storage is not relevant to the test. Please remove the disk from this
definition.
More information about the libvir-list
mailing list