[PATCH v3 0/4] Introduce TCG domain features

v3 of: https://listman.redhat.com/archives/libvir-list/2021-November/msg00194.html Note, patches 1/4 and 2/4 from v2 were pushed already. diff to v2: - Split feature validation into a separate patch - Validate that the size is a multiple of MiB, because that's QEMU's granularity - Remembered to write NEWS entry - Worked in Peter's comments from v2 (mostly to make code more future proof) Michal Prívozník (4): conf: Introduce TCG domain features qemu: Validate TCG feature is enabled only for TCG domains qemu: Generate command line for tb-cache feature NEWS: Document TCG features NEWS.rst | 5 ++ docs/formatdomain.rst | 11 ++++ docs/schemas/domaincommon.rng | 15 ++++- src/conf/domain_conf.c | 58 ++++++++++++++++++- src/conf/domain_conf.h | 7 +++ src/qemu/qemu_command.c | 5 ++ src/qemu/qemu_validate.c | 17 ++++++ ...efault-cpu-tcg-features.x86_64-latest.args | 36 ++++++++++++ .../x86_64-default-cpu-tcg-features.xml | 56 ++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + ...default-cpu-tcg-features.x86_64-latest.xml | 1 + tests/qemuxml2xmltest.c | 1 + 12 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args 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 -- 2.32.0

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> --- 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

After previous commit it's possible for domains to fine tune TCG features (well, just one - tb-cache). Check that domain has TCG enabled, otherwise the feature makes no sense. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- docs/formatdomain.rst | 2 +- src/qemu/qemu_validate.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 041dfc699d..98eb7b7481 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2074,7 +2074,7 @@ are: =========== ============================================== =================================================== ============== Feature Description Value Since =========== ============================================== =================================================== ============== - tb-cache The size of translation block cache size an integer :since:`8.0.0` + tb-cache The size of translation block cache size an integer (a multiple of MiB) :since:`8.0.0` =========== ============================================== =================================================== ============== :anchor:`<a id="elementsTime"/>` diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index a7c89f27cf..3a1c279e63 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -295,6 +295,22 @@ 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; + } + + if (def->tcg_features->tb_cache & 0xff) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("tb-cache size must be an integer multiple of MiB")); + return -1; + } + } + break; + case VIR_DOMAIN_FEATURE_SMM: case VIR_DOMAIN_FEATURE_KVM: case VIR_DOMAIN_FEATURE_XEN: -- 2.32.0

On Thu, Dec 02, 2021 at 09:53:34 +0100, Michal Privoznik wrote:
After previous commit it's possible for domains to fine tune TCG features (well, just one - tb-cache). Check that domain has TCG enabled, otherwise the feature makes no sense.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- docs/formatdomain.rst | 2 +- src/qemu/qemu_validate.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 041dfc699d..98eb7b7481 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -2074,7 +2074,7 @@ are: =========== ============================================== =================================================== ============== Feature Description Value Since =========== ============================================== =================================================== ============== - tb-cache The size of translation block cache size an integer :since:`8.0.0` + tb-cache The size of translation block cache size an integer (a multiple of MiB) :since:`8.0.0` =========== ============================================== =================================================== ==============
:anchor:`<a id="elementsTime"/>` diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index a7c89f27cf..3a1c279e63 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -295,6 +295,22 @@ 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; + } + + if (def->tcg_features->tb_cache & 0xff) {
You are 2 bits off here. This won't catch increments of 0x100 KiB (256KiB). You'll need 0x3FF as a mask and an explicit comparison with 0.
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("tb-cache size must be an integer multiple of MiB")); + return -1; + } + } + break; + case VIR_DOMAIN_FEATURE_SMM: case VIR_DOMAIN_FEATURE_KVM: case VIR_DOMAIN_FEATURE_XEN: -- 2.32.0

Generating command line is pretty easy - just put tb-size=XXX onto -accel tcg part. Note, that QEMU expects the size in MiB. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/229 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Tested-by: Kashyap Chamarthy <kchamart@redhat.com> --- src/qemu/qemu_command.c | 5 +++ ...efault-cpu-tcg-features.x86_64-latest.args | 36 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 3 files changed, 42 insertions(+) create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c47998aabd..4b2b558aba 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7282,6 +7282,11 @@ qemuBuildAccelCommandLine(virCommand *cmd, switch ((virDomainVirtType)def->virtType) { case VIR_DOMAIN_VIRT_QEMU: virBufferAddLit(&buf, "tcg"); + + if (def->features[VIR_DOMAIN_FEATURE_TCG] == VIR_TRISTATE_SWITCH_ON) { + virBufferAsprintf(&buf, ",tb-size=%llu", + def->tcg_features->tb_cache >> 10); + } break; case VIR_DOMAIN_VIRT_KVM: diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args new file mode 100644 index 0000000000..c9c71cf4e6 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args @@ -0,0 +1,36 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/tmp/lib/domain--1-guest/master-key.aes"}' \ +-machine pc-q35-6.2,usb=off,dump-guest-core=off,memory-backend=pc.ram \ +-accel tcg,tb-size=100 \ +-cpu qemu64 \ +-m 4096 \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":4294967296}' \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus":"pcie.0","multifunction":true,"addr":"0x1"}' \ +-device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus":"pcie.0","addr":"0x1.0x1"}' \ +-device '{"driver":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bus":"pcie.0","addr":"0x1.0x2"}' \ +-device '{"driver":"qemu-xhci","id":"usb","bus":"pci.1","addr":"0x0"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.2","addr":"0x0"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5e4cd7389c..a940c51815 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3372,6 +3372,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

On Thu, Dec 02, 2021 at 09:53:35 +0100, Michal Privoznik wrote:
Generating command line is pretty easy - just put tb-size=XXX onto -accel tcg part. Note, that QEMU expects the size in MiB.
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/229 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Tested-by: Kashyap Chamarthy <kchamart@redhat.com> --- src/qemu/qemu_command.c | 5 +++ ...efault-cpu-tcg-features.x86_64-latest.args | 36 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + 3 files changed, 42 insertions(+) create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-features.x86_64-latest.args
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c47998aabd..4b2b558aba 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7282,6 +7282,11 @@ qemuBuildAccelCommandLine(virCommand *cmd, switch ((virDomainVirtType)def->virtType) { case VIR_DOMAIN_VIRT_QEMU: virBufferAddLit(&buf, "tcg"); + + if (def->features[VIR_DOMAIN_FEATURE_TCG] == VIR_TRISTATE_SWITCH_ON) {
&& tb-size > 0) {
+ virBufferAsprintf(&buf, ",tb-size=%llu", + def->tcg_features->tb_cache >> 10); + } break;
case VIR_DOMAIN_VIRT_KVM::

Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- NEWS.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 4d690ff64b..4c56377cac 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,11 @@ v8.0.0 (unreleased) * **New features** + * Introduce TCG domain features + + Libvirt is now able to set the size of translation block cache size + (tb-size) for TCG domains. + * **Improvements** * **Bug fixes** -- 2.32.0

On Thu, Dec 02, 2021 at 09:53:32 +0100, Michal Privoznik wrote:
v3 of:
https://listman.redhat.com/archives/libvir-list/2021-November/msg00194.html
Note, patches 1/4 and 2/4 from v2 were pushed already.
diff to v2: - Split feature validation into a separate patch - Validate that the size is a multiple of MiB, because that's QEMU's granularity - Remembered to write NEWS entry - Worked in Peter's comments from v2 (mostly to make code more future proof)
With the stuff I've pointed out inline resolved: Reviewed-by: Peter Krempa <pkrempa@redhat.com>
participants (2)
-
Michal Privoznik
-
Peter Krempa