Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- 18 participants
- 40170 discussions
[PATCH] crypto: add support for sm4 without key length suffix and remove the restriction about ciper name in xml
by luzhipeng 31 Jul '24
by luzhipeng 31 Jul '24
31 Jul '24
qemu add sm4 in release 9, but the name of sm4 doesn't have the key
length suffix, So set size to 0, construct cipher name without
key length as suffix.
In order to support the snapshot of encrypted disks, it remove
the restrictions about cipher names in XML
Signed-off-by: luzhipeng <luzhipeng(a)cestc.cn>
---
docs/formatstorageencryption.rst | 8 +++++---
src/conf/domain_validate.c | 12 ------------
src/qemu/qemu_block.c | 10 +++++++---
3 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/docs/formatstorageencryption.rst b/docs/formatstorageencryption.rst
index 066d285090..6cb8cf024c 100644
--- a/docs/formatstorageencryption.rst
+++ b/docs/formatstorageencryption.rst
@@ -75,11 +75,13 @@ initialization vector generation.
``name``
The name of the cipher algorithm used for data encryption, such as 'aes',
- 'des', 'cast5', 'serpent', 'twofish', etc. Support of the specific
+ 'des', 'cast5', 'serpent', 'twofish', 'sm4', etc. Support of the specific
algorithm is storage driver implementation dependent.
``size``
- The size of the cipher in bits, such as '256', '192', '128', etc. Support
- of the specific size for a specific cipher is hypervisor dependent.
+ The size of the cipher in bits, such as '256', '192', '128', '0', etc.
+ '0' indicates that the encryption algorithm name doesn't have key length
+ suffix. Support of the specific size for a specific cipher is hypervisor
+ dependent.
``mode``
An optional cipher algorithm mode such as 'cbc', 'xts', 'ecb', etc.
Support of the specific cipher mode is hypervisor dependent.
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 39b8d67928..b70edcaaa0 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -529,18 +529,6 @@ virDomainDiskDefValidateSourceChainOne(const virStorageSource *src)
}
}
- if (src->encryption) {
- virStorageEncryption *encryption = src->encryption;
-
- if (encryption->format == VIR_STORAGE_ENCRYPTION_FORMAT_LUKS &&
- encryption->encinfo.cipher_name) {
-
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("supplying <cipher> for domain disk definition is unnecessary"));
- return -1;
- }
- }
-
/* internal snapshots and config files are currently supported only with rbd: */
if (virStorageSourceGetActualType(src) != VIR_STORAGE_TYPE_NETWORK &&
src->protocol != VIR_STORAGE_NET_PROTOCOL_RBD) {
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index d6cdf521c4..ac55c077e9 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -2137,9 +2137,13 @@ qemuBlockStorageSourceCreateGetEncryptionLUKS(virStorageSource *src,
if (src->encryption) {
if (src->encryption->encinfo.cipher_name) {
- cipheralg = g_strdup_printf("%s-%u",
- src->encryption->encinfo.cipher_name,
- src->encryption->encinfo.cipher_size);
+ if (src->encryption->encinfo.cipher_size) {
+ cipheralg = g_strdup_printf("%s-%u",
+ src->encryption->encinfo.cipher_name,
+ src->encryption->encinfo.cipher_size);
+ } else {
+ cipheralg = g_strdup_printf("%s", src->encryption->encinfo.cipher_name)
+ }
}
if (virJSONValueObjectAdd(&props,
--
2.34.0.windows.1
1
0
These address Andrea's suggestion:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/EEI…
I know we've just entered freeze, but pstore is a new feature and it'd
be nice to have these in. The first one is technically a feature, but
the second one can be viewed as a bug fix.
Michal Prívozník (2):
qemu: Autofill pstore path if missing
qemu: Pre-create pstore device file
src/qemu/qemu_domain.c | 27 +++++++++++++++++++++++-
src/qemu/qemu_process.c | 46 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 1 deletion(-)
--
2.44.2
3
6
[PATCH] NEWS: Document features/improvements/bug fixes I've participated in
by Michal Privoznik 30 Jul '24
by Michal Privoznik 30 Jul '24
30 Jul '24
There are some features/improvements/bug fixes I've either
contributed or reviewed/merged. Document them for upcoming
release.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
NEWS.rst | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst
index 17335b3f6e..1a320c5442 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -28,8 +28,42 @@ v10.6.0 (unreleased)
* **Improvements**
+ * qemu: Set 'passt' net backend if 'default' is unsupported
+
+ If QEMU is compiled without SLIRP support, and if domain XML allows it,
+ starting from this release libvirt will use passt as the default backend
+ instead. Also, supported backends are now reported in the domain
+ capabilities XML.
+
+ * qemu: Require QEMU-5.2.0 or newer
+
+ The minimal required version of QEMU was bumped to 5.2.0.
+
+ * qemu: add a monitor to /proc/$pid when killing times out
+
+ In cases when a QEMU process takes longer to be killed, libvirt might have
+ skipped cleaning up after it. But now a /proc/$pid watch is installed so
+ this does not happen ever again.
+
* **Bug fixes**
+ * virt-aa-helper: Allow RO access to /usr/share/edk2-ovmf
+
+ When binary version of edk2 is distributed, the files reside under
+ /usr/share/edk2-ovmf. Allow virt-aa-helper to generate paths under that
+ directory.
+
+ * virt-host-validate: Allow longer list of CPU flags
+
+ During its run, virt-host-validate parses /proc/cpuinfo to learn about CPU
+ flags. But due to a bug it parsed only the first 1024 bytes worth of CPU
+ flags leading to unexpected results. The file is now parsed properly.
+
+ * capabilities: Be more forgiving when decoding OEM strings
+
+ On some systems, OEM strings are scattered in multiple sections. This
+ confused libvirt when generating capabilities XML. Not anymore.
+
v10.5.0 (2024-07-01)
====================
--
2.44.2
3
2
Hi,
With the below virt-install options, I am trying to import a Realm VM:
[…]
export LIBVIRT_QEMU=/home/realm/qemu-system-aarch64
virt-install --machine=virt --arch=aarch64 --name=test8 --disk path=/var/lib/libvirt/images/jammy.qcow2,format=qcow2,device=disk,bus=virtio,cache=none --memory=2048 --vcpu=8 --nographic --check all=off --features acpi=off --import --os-variant=ubuntu22.04 --qemu-commandline="-M virt,confidential-guest-support=rme0,acpi=off,gic-version=3 -cpu host -object rme-guest,id=rme0,measurement-algo=sha512" --boot kernel=Image-cca,initrd=rootfs.cpio
[…]
However, it fails with the messages:
WARNING Disk /var/lib/libvirt/images/jammy.qcow2 is already in use by other guests ['test', 'tmp1', 'jammy'].
Starting install...
ERROR internal error: QEMU unexpectedly closed the monitor (vm='test8'): 2024-07-22T06:40:39.290847Z qemu-system-aarch64: could not load kernel '/home/realm/Image-cca'
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
virsh --connect qemu:///system start test8
otherwise, please restart your installation.
The libvirt packages are from Ubuntu 24.04 LTS, but QEMU is the one Linaro folk maintain.
Am I using the opions wrong for kernel direct boot scenario?
Thanks,
Itaru.
2
2
I have just tagged v10.6.0-rc1 in the repository and pushed signed
tarballs to https://download.libvirt.org/
Please give the release candidate some testing and in case you find a
serious issue which should have a fix in the upcoming release, feel
free to reply to this thread to make sure the issue is more visible.
If you have not done so yet, please update NEWS.rst to document any
significant change you made since the last release.
Thanks,
Jirka
1
0
26 Jul '24
Technically, this is a v2 of:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/C6QP…
but it implements completely different approach, so I'm starting a new
thread.
Michal Prívozník (2):
vireventthread: Introduce virEventThreadStop
qemu: Use virEventThreadStop() in qemuProcessStop()
src/libvirt_private.syms | 1 +
src/qemu/qemu_process.c | 14 ++++++++++----
src/util/vireventthread.c | 22 ++++++++++++++++++++++
src/util/vireventthread.h | 2 ++
4 files changed, 35 insertions(+), 4 deletions(-)
--
2.44.2
5
12
This is a rebased version of:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/UAUK…
which was a rebased version of:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/VWR6…
Let's hope no more resends will be needed.
Michal Prívozník (5):
qemu_capabilities: Introduce QEMU_CAPS_DEVICE_ACPI_ERST
conf: Introduce pstore device
qemu: Build cmd line for pstore device
security: Set seclabels for pstore device
NEWS: Document pstore device addition
NEWS.rst | 7 +
docs/formatdomain.rst | 32 ++++
src/ch/ch_domain.c | 1 +
src/conf/domain_conf.c | 153 ++++++++++++++++++
src/conf/domain_conf.h | 19 +++
src/conf/domain_postparse.c | 1 +
src/conf/domain_validate.c | 30 ++++
src/conf/schemas/domaincommon.rng | 25 +++
src/conf/virconftypes.h | 2 +
src/hyperv/hyperv_driver.c | 1 +
src/libvirt_private.syms | 2 +
src/libxl/libxl_driver.c | 6 +
src/lxc/lxc_driver.c | 6 +
src/qemu/qemu_alias.c | 10 ++
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 52 ++++++
src/qemu/qemu_domain.c | 3 +
src/qemu/qemu_domain_address.c | 11 ++
src/qemu/qemu_driver.c | 3 +
src/qemu/qemu_hotplug.c | 5 +
src/qemu/qemu_validate.c | 26 +++
src/security/security_dac.c | 10 ++
src/security/security_selinux.c | 9 ++
src/security/virt-aa-helper.c | 4 +
src/test/test_driver.c | 1 +
.../caps_7.0.0_aarch64+hvf.xml | 1 +
.../caps_7.0.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 +
.../caps_7.0.0_x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 +
.../caps_7.1.0_x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 +
.../caps_7.2.0_x86_64+hvf.xml | 1 +
.../caps_7.2.0_x86_64.xml | 1 +
.../caps_8.0.0_x86_64.xml | 1 +
.../caps_8.1.0_x86_64.xml | 1 +
.../caps_8.2.0_aarch64.xml | 1 +
.../caps_8.2.0_armv7l.xml | 1 +
.../caps_8.2.0_loongarch64.xml | 1 +
.../caps_8.2.0_x86_64.xml | 1 +
.../caps_9.0.0_x86_64.xml | 1 +
.../caps_9.1.0_x86_64.xml | 1 +
.../pstore-acpi-erst.x86_64-latest.args | 38 +++++
.../pstore-acpi-erst.x86_64-latest.xml | 1 +
tests/qemuxmlconfdata/pstore-acpi-erst.xml | 53 ++++++
tests/qemuxmlconftest.c | 1 +
47 files changed, 532 insertions(+)
create mode 100644 tests/qemuxmlconfdata/pstore-acpi-erst.x86_64-latest.args
create mode 120000 tests/qemuxmlconfdata/pstore-acpi-erst.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/pstore-acpi-erst.xml
--
2.44.2
3
9
26 Jul '24
These patches make use of QMP recently added snapshot-save/delete
commands and reaps HMP savevm/deletevm. The usage of HMP commands
are highly discouraged by QEMU.
Nikolai Barybin (4):
qemu monitor: add snaphot-save/delete QMP commands
qemu blockjob: add snapshot-save/delete job types
qemu snapshot: use QMP snapshot-save/delete for internal snapshots
qemu monitor: reap qemu_monitor_text
po/POTFILES | 1 -
po/libvirt.pot | 18 ----
src/qemu/meson.build | 1 -
src/qemu/qemu_block.c | 2 +
src/qemu/qemu_blockjob.c | 6 +-
src/qemu/qemu_blockjob.h | 2 +
src/qemu/qemu_domain.c | 4 +
src/qemu/qemu_monitor.c | 23 +++--
src/qemu/qemu_monitor.h | 16 +++-
src/qemu/qemu_monitor_json.c | 66 +++++++++++++++
src/qemu/qemu_monitor_json.h | 13 +++
src/qemu/qemu_monitor_text.c | 88 -------------------
src/qemu/qemu_monitor_text.h | 29 -------
src/qemu/qemu_snapshot.c | 158 ++++++++++++++++++++++++++++++++---
14 files changed, 267 insertions(+), 160 deletions(-)
delete mode 100644 src/qemu/qemu_monitor_text.c
delete mode 100644 src/qemu/qemu_monitor_text.h
--
2.43.5
4
12
[PATCH-for-9.1] target/riscv: Remove the deprecated 'any' CPU type
by Philippe Mathieu-Daudé 26 Jul '24
by Philippe Mathieu-Daudé 26 Jul '24
26 Jul '24
The 'any' CPU is deprecated since commit f57d5f8004b
("target/riscv: deprecate the 'any' CPU type"). Users
are better off using the default CPUs or the 'max' CPU.
Signed-off-by: Philippe Mathieu-Daudé <philmd(a)linaro.org>
---
docs/about/deprecated.rst | 13 -------------
docs/about/removed-features.rst | 8 ++++++++
target/riscv/cpu-qom.h | 1 -
target/riscv/cpu.c | 28 ----------------------------
4 files changed, 8 insertions(+), 42 deletions(-)
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
index 88f0f037865..0ac49b15b44 100644
--- a/docs/about/deprecated.rst
+++ b/docs/about/deprecated.rst
@@ -347,19 +347,6 @@ QEMU's ``vhost`` feature, which would eliminate the high latency costs under
which the 9p ``proxy`` backend currently suffers. However as of to date nobody
has indicated plans for such kind of reimplementation unfortunately.
-RISC-V 'any' CPU type ``-cpu any`` (since 8.2)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The 'any' CPU type was introduced back in 2018 and has been around since the
-initial RISC-V QEMU port. Its usage has always been unclear: users don't know
-what to expect from a CPU called 'any', and in fact the CPU does not do anything
-special that isn't already done by the default CPUs rv32/rv64.
-
-After the introduction of the 'max' CPU type, RISC-V now has a good coverage
-of generic CPUs: rv32 and rv64 as default CPUs and 'max' as a feature complete
-CPU for both 32 and 64 bit builds. Users are then discouraged to use the 'any'
-CPU type starting in 8.2.
-
RISC-V CPU properties which start with capital 'Z' (since 8.2)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst
index fc7b28e6373..f3e9474a73e 100644
--- a/docs/about/removed-features.rst
+++ b/docs/about/removed-features.rst
@@ -850,6 +850,14 @@ The RISC-V no MMU cpus have been removed. The two CPUs: ``rv32imacu-nommu`` and
``rv64imacu-nommu`` can no longer be used. Instead the MMU status can be specified
via the CPU ``mmu`` option when using the ``rv32`` or ``rv64`` CPUs.
+RISC-V 'any' CPU type ``-cpu any`` (removed in 9.1)
+'''''''''''''''''''''''''''''''''''''''''''''''''''
+
+The 'any' CPU type was introduced back in 2018 and was around since the
+initial RISC-V QEMU port. Its usage was always been unclear: users don't know
+what to expect from a CPU called 'any', and in fact the CPU does not do anything
+special that isn't already done by the default CPUs rv32/rv64.
+
``compat`` property of server class POWER CPUs (removed in 6.0)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h
index 3670cfe6d9a..4464c0fd7a3 100644
--- a/target/riscv/cpu-qom.h
+++ b/target/riscv/cpu-qom.h
@@ -29,7 +29,6 @@
#define RISCV_CPU_TYPE_SUFFIX "-" TYPE_RISCV_CPU
#define RISCV_CPU_TYPE_NAME(name) (name RISCV_CPU_TYPE_SUFFIX)
-#define TYPE_RISCV_CPU_ANY RISCV_CPU_TYPE_NAME("any")
#define TYPE_RISCV_CPU_MAX RISCV_CPU_TYPE_NAME("max")
#define TYPE_RISCV_CPU_BASE32 RISCV_CPU_TYPE_NAME("rv32")
#define TYPE_RISCV_CPU_BASE64 RISCV_CPU_TYPE_NAME("rv64")
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index a90808a3bac..4bda754b013 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -438,27 +438,6 @@ static void set_satp_mode_default_map(RISCVCPU *cpu)
}
#endif
-static void riscv_any_cpu_init(Object *obj)
-{
- RISCVCPU *cpu = RISCV_CPU(obj);
- CPURISCVState *env = &cpu->env;
- riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
-
-#ifndef CONFIG_USER_ONLY
- set_satp_mode_max_supported(RISCV_CPU(obj),
- riscv_cpu_mxl(&RISCV_CPU(obj)->env) == MXL_RV32 ?
- VM_1_10_SV32 : VM_1_10_SV57);
-#endif
-
- env->priv_ver = PRIV_VERSION_LATEST;
-
- /* inherited from parent obj via riscv_cpu_init() */
- cpu->cfg.ext_zifencei = true;
- cpu->cfg.ext_zicsr = true;
- cpu->cfg.mmu = true;
- cpu->cfg.pmp = true;
-}
-
static void riscv_max_cpu_init(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
@@ -1161,11 +1140,6 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
Error *local_err = NULL;
- if (object_dynamic_cast(OBJECT(dev), TYPE_RISCV_CPU_ANY) != NULL) {
- warn_report("The 'any' CPU is deprecated and will be "
- "removed in the future.");
- }
-
cpu_exec_realizefn(cs, &local_err);
if (local_err != NULL) {
error_propagate(errp, local_err);
@@ -2952,7 +2926,6 @@ static const TypeInfo riscv_cpu_type_infos[] = {
.abstract = true,
},
#if defined(TARGET_RISCV32)
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV32, riscv_any_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV32, riscv_max_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, MXL_RV32, rv32_base_cpu_init),
DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_IBEX, MXL_RV32, rv32_ibex_cpu_init),
@@ -2962,7 +2935,6 @@ static const TypeInfo riscv_cpu_type_infos[] = {
DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV32I, MXL_RV32, rv32i_bare_cpu_init),
DEFINE_BARE_CPU(TYPE_RISCV_CPU_RV32E, MXL_RV32, rv32e_bare_cpu_init),
#elif defined(TARGET_RISCV64)
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV64, riscv_any_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV64, riscv_max_cpu_init),
DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, MXL_RV64, rv64_base_cpu_init),
DEFINE_VENDOR_CPU(TYPE_RISCV_CPU_SIFIVE_E51, MXL_RV64, rv64_sifive_e_cpu_init),
--
2.45.2
3
3
25 Jul '24
See 4/5 for explanation.
Michal Prívozník (5):
vircommand: Initialize dryRunStatus to portable EXIT_SUCCESS instead
of 0
virsysinfo: Trim newline when decoding OEM strings
tests: Add HPE Apollo test case to sysinfotest
virsysinfo: Be more forgiving when decoding OEM strings
virsysinfo: Calculate OEM string index better
src/util/vircommand.c | 2 +-
src/util/virsysinfo.c | 36 +++-
.../aarch64-hpe-apollosysinfo.data | 162 ++++++++++++++++++
.../aarch64-hpe-apollosysinfo.expect | 88 ++++++++++
tests/sysinfotest.c | 9 +-
5 files changed, 285 insertions(+), 12 deletions(-)
create mode 100644 tests/sysinfodata/aarch64-hpe-apollosysinfo.data
create mode 100644 tests/sysinfodata/aarch64-hpe-apollosysinfo.expect
--
2.44.2
2
7
Disk targets were generated in virVMXParseConfig() with
virVMXGenerateDiskTarget(). It works on combination of
controller, fix offset, unit and prefix. While SCSI and SATA have
same prefix "sd", function virVMXGenerateDiskTarget() could
returned in some cases same targets.
In this patch, after loaded SCSI and SATA disks to the def, it
checks if in array exists any SATA disks after SCSI. If not,
nothing happened. If yes, targets of all SATA disks are changed.
Disk target is calculated as: last SCSI target value + n, where n
is position of disk in array after last SCSI (1,2,..).
Because assigned addresses of disks are generated from their
indexes, for every changed SATA disk is called
virDomainDiskDefAssignAddress() with the updated value.
The corresponding tests have been modified to match the index
changes.
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/vmx/vmx.c | 32 ++++++++++++++++++++++++
tests/vmx2xmldata/esx-in-the-wild-12.xml | 4 +--
tests/vmx2xmldata/esx-in-the-wild-8.xml | 4 +--
3 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 227744d062..9fdf0f1cd4 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -1389,6 +1389,9 @@ virVMXParseConfig(virVMXContext *ctx,
bool smbios_reflecthost = false;
int controller;
int bus;
+ int ndisk;
+ int last_scsi;
+ int offset = -1;
int port;
bool present;
int scsi_virtualDev[4] = { -1, -1, -1, -1 };
@@ -1805,6 +1808,35 @@ virVMXParseConfig(virVMXContext *ctx,
}
}
+ /* now disks contain only SCSI and SATA, SATA could have same index (dst) as SCSI
+ * find last SCSI index in array and use it as offset for all SATA indexes
+ * (overwrite old values)
+ * finally, regenerate correct addresses, while it depends on the index */
+ for (ndisk = 0; ndisk < def->ndisks; ndisk++) {
+ virDomainDiskDef *dsc = def->disks[ndisk];
+
+ if (dsc->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
+ offset = virDiskNameToIndex(dsc->dst);
+ last_scsi = ndisk;
+ continue;
+ }
+
+ if (offset > -1) {
+ VIR_FREE(def->disks[ndisk]->dst);
+ def->disks[ndisk]->dst = virIndexToDiskName(offset + ndisk - last_scsi, "sd");
+
+ if (virDomainDiskDefAssignAddress(NULL, def->disks[ndisk], def) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Could not assign address to disk '%1$s'"),
+ virDomainDiskGetSource(dsc));
+ goto cleanup;
+ }
+ }
+
+ else
+ break;
+ }
+
/* def:disks (ide) */
for (bus = 0; bus < 2; ++bus) {
for (unit = 0; unit < 2; ++unit) {
diff --git a/tests/vmx2xmldata/esx-in-the-wild-12.xml b/tests/vmx2xmldata/esx-in-the-wild-12.xml
index 42184501d0..a7730845ee 100644
--- a/tests/vmx2xmldata/esx-in-the-wild-12.xml
+++ b/tests/vmx2xmldata/esx-in-the-wild-12.xml
@@ -21,9 +21,9 @@
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
- <target dev='sda' bus='sata'/>
+ <target dev='sdb' bus='sata'/>
<readonly/>
- <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='scsi' index='0' model='vmpvscsi'/>
<controller type='sata' index='0'/>
diff --git a/tests/vmx2xmldata/esx-in-the-wild-8.xml b/tests/vmx2xmldata/esx-in-the-wild-8.xml
index 47d22ced2a..d5356bda34 100644
--- a/tests/vmx2xmldata/esx-in-the-wild-8.xml
+++ b/tests/vmx2xmldata/esx-in-the-wild-8.xml
@@ -36,9 +36,9 @@
</disk>
<disk type='file' device='cdrom'>
<source file='[692eb778-2d4937fe] CentOS-4.7.ServerCD-x86_64.iso'/>
- <target dev='sda' bus='sata'/>
+ <target dev='sdd' bus='sata'/>
<readonly/>
- <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='3'/>
</disk>
<controller type='scsi' index='0' model='vmpvscsi'/>
<controller type='sata' index='0'/>
--
2.45.2
2
1
24 Jul '24
The new option style renamed one of the cache modes.
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
---
src/qemu/qemu_virtiofs.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
index 703f1226a2..db987ddfe1 100644
--- a/src/qemu/qemu_virtiofs.c
+++ b/src/qemu/qemu_virtiofs.c
@@ -147,10 +147,19 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfig *cfg,
virCommandAddArg(cmd, "--shared-dir");
virCommandAddArg(cmd, fs->src->path);
- if (fs->cache) {
+ switch (fs->cache) {
+ case VIR_DOMAIN_FS_CACHE_MODE_DEFAULT:
+ break;
+ case VIR_DOMAIN_FS_CACHE_MODE_NONE:
+ virCommandAddArg(cmd, "--cache");
+ virCommandAddArg(cmd, "never");
+ break;
+ case VIR_DOMAIN_FS_CACHE_MODE_ALWAYS:
virCommandAddArg(cmd, "--cache");
virCommandAddArg(cmd, virDomainFSCacheModeTypeToString(fs->cache));
+ break;
}
+
if (fs->sandbox) {
virCommandAddArg(cmd, "--sandbox");
virCommandAddArg(cmd, virDomainFSSandboxModeTypeToString(fs->sandbox));
--
2.45.2
2
1
The current "building from git" test uses "test -d .git"; however, that
doesn't work when libvirt is used as a submodule, as in that case .git
is a normal file. Use "test -e .git" instead.
Signed-off-by: John Levon <john.levon(a)nutanix.com>
---
meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 3ab8e57e4a..231470e2ee 100644
--- a/meson.build
+++ b/meson.build
@@ -17,7 +17,7 @@ endif
# figure out if we are building from git
-git = run_command('test', '-d', '.git', check: false).returncode() == 0
+git = run_command('test', '-e', '.git', check: false).returncode() == 0
if git and not get_option('no_git')
run_command('git', 'submodule', 'update', '--init', check: true)
--
2.34.1
2
1
New element 'openfiles' had confusing name. Since the patch with
this new element wasn't propagate yet, old name ('rlimit_nofile')
was changed.
...
<binary>
<openfiles max='122333'/>
</binary>
...
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
docs/formatdomain.rst | 6 +++---
src/conf/domain_conf.c | 14 +++++++-------
src/conf/domain_conf.h | 2 +-
src/conf/schemas/domaincommon.rng | 4 ++--
src/qemu/qemu_virtiofs.c | 4 ++--
... vhost-user-fs-fd-openfiles.x86_64-latest.args} | 0
.../vhost-user-fs-fd-openfiles.x86_64-latest.xml | 1 +
...d-rlimit.xml => vhost-user-fs-fd-openfiles.xml} | 2 +-
.../vhost-user-fs-fd-rlimit.x86_64-latest.xml | 1 -
tests/qemuxmlconftest.c | 2 +-
10 files changed, 18 insertions(+), 18 deletions(-)
rename tests/qemuxmlconfdata/{vhost-user-fs-fd-rlimit.x86_64-latest.args => vhost-user-fs-fd-openfiles.x86_64-latest.args} (100%)
create mode 120000 tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.xml
rename tests/qemuxmlconfdata/{vhost-user-fs-fd-rlimit.xml => vhost-user-fs-fd-openfiles.xml} (97%)
delete mode 120000 tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 10584dfe83..c2a6d0b910 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -3734,10 +3734,10 @@ A directory on the host that can be accessed directly from the guest.
The thread pool helps increase the number of requests in flight when used with
storage that has a higher latency. However, it has an overhead, and so for
fast, low latency filesystems, it may be best to turn it off. ( :since:`Since 8.5.0` )
- Element ``rlimit_profile`` accepts one attribute ``size`` which defines the
+ Element ``openfiles`` accepts one attribute ``max`` which defines the
maximum number of file descriptors. Non-positive values are forbidden.
- Although numbers greater than 1M are allowed, the virtiofsd documentation
- states that in this case its set by virtiofsd to the 1M. ( :since:`Since 10.6.0` )
+ The upper bound on the number of open files is implementation defined.
+ ( :since:`Since 10.6.0` )
``source``
The resource on the host that is being accessed in the guest. The ``name``
attribute must be used with ``type='template'``, and the ``dir`` attribute
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6733857a3a..d1c59f7a91 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8868,7 +8868,7 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt);
g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt);
g_autofree char *thread_pool_size = virXPathString("string(./binary/thread_pool/@size)", ctxt);
- g_autofree char *rlimit_nofile = virXPathString("string(./binary/rlimit_nofile/@size)", ctxt);
+ g_autofree char *openfiles = virXPathString("string(./binary/openfiles/@max)", ctxt);
xmlNodePtr binary_node = virXPathNode("./binary", ctxt);
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
@@ -8892,11 +8892,11 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
goto error;
}
- if (rlimit_nofile &&
- virStrToLong_ull(rlimit_nofile, NULL, 10, &def->rlimit_nofile) < 0) {
+ if (openfiles &&
+ virStrToLong_ull(openfiles, NULL, 10, &def->openfiles) < 0) {
virReportError(VIR_ERR_XML_ERROR,
- _("cannot parse rlimit_nofile '%1$s' for virtiofs"),
- rlimit_nofile);
+ _("cannot parse openfiles '%1$s' for virtiofs"),
+ openfiles);
goto error;
}
@@ -23424,8 +23424,8 @@ virDomainFSDefFormat(virBuffer *buf,
if (def->thread_pool_size >= 0)
virBufferAsprintf(&binaryBuf, "<thread_pool size='%d'/>\n", def->thread_pool_size);
- if (def->rlimit_nofile > 0)
- virBufferAsprintf(&binaryBuf, "<rlimit_nofile size='%lld'/>\n", def->rlimit_nofile);
+ if (def->openfiles > 0)
+ virBufferAsprintf(&binaryBuf, "<openfiles max='%lld'/>\n", def->openfiles);
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 8283493dfc..6972f6ae9b 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -890,7 +890,7 @@ struct _virDomainFSDef {
bool symlinksResolved;
char *binary;
unsigned long long queue_size;
- unsigned long long rlimit_nofile;
+ unsigned long long openfiles;
virTristateSwitch xattr;
virDomainFSCacheMode cache;
virTristateSwitch posix_lock;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index ab5374d5f0..8dae6416e9 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -3381,9 +3381,9 @@
</element>
</optional>
<optional>
- <element name="rlimit_nofile">
+ <element name="openfiles">
<optional>
- <attribute name="size">
+ <attribute name="max">
<data type="positiveInteger"/>
</attribute>
</optional>
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
index 703f1226a2..a8f2416273 100644
--- a/src/qemu/qemu_virtiofs.c
+++ b/src/qemu/qemu_virtiofs.c
@@ -194,8 +194,8 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfig *cfg,
if (fs->thread_pool_size >= 0)
virCommandAddArgFormat(cmd, "--thread-pool-size=%i", fs->thread_pool_size);
- if (fs->rlimit_nofile > 0)
- virCommandAddArgFormat(cmd, "--rlimit-nofile=%llu", fs->rlimit_nofile);
+ if (fs->openfiles > 0)
+ virCommandAddArgFormat(cmd, "--rlimit-nofile=%llu", fs->openfiles);
if (cfg->virtiofsdDebug) {
if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS))
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args b/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.args
similarity index 100%
rename from tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args
rename to tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.args
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.xml
new file mode 120000
index 0000000000..74761b0d0f
--- /dev/null
+++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.x86_64-latest.xml
@@ -0,0 +1 @@
+vhost-user-fs-fd-openfiles.xml
\ No newline at end of file
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.xml
similarity index 97%
rename from tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml
rename to tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.xml
index 2983d3f275..3e925a8c8b 100644
--- a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml
+++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-openfiles.xml
@@ -32,7 +32,7 @@
<cache mode='always'/>
<sandbox mode='chroot'/>
<thread_pool size='16'/>
- <rlimit_nofile size='122333'/>
+ <openfiles max='122333'/>
</binary>
<idmap>
<uid start='0' target='100000' count='65535'/>
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
deleted file mode 120000
index 68c4e8a482..0000000000
--- a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
+++ /dev/null
@@ -1 +0,0 @@
-vhost-user-fs-fd-rlimit.xml
\ No newline at end of file
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index cc984440ea..bf88bd2f8d 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2816,7 +2816,7 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("launch-security-s390-pv", "s390x");
DO_TEST_CAPS_LATEST("vhost-user-fs-fd-memory");
- DO_TEST_CAPS_LATEST("vhost-user-fs-fd-rlimit");
+ DO_TEST_CAPS_LATEST("vhost-user-fs-fd-openfiles");
DO_TEST_CAPS_LATEST("vhost-user-fs-hugepages");
DO_TEST_CAPS_LATEST_PARSE_ERROR("vhost-user-fs-readonly");
--
2.45.2
2
1
24 Jul '24
If there are absent values in an already existing element
specifying rom settings, we simply use the old ones. This
behaviour is not desired, as users might think that deleting the
element from XML would delete the setting (because the hotplug
succeeds) - which does not happen. Because of that, we should not
accept an interface without elements that cannot be changed.
Therefore, we should not allow absent values for already existing
rom setting during hotplug.
Resolves: https://issues.redhat.com/browse/RHEL-7109
Signed-off-by: Kristina Hanicova <khanicov(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1f4620d833..7f158ddcd5 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3838,16 +3838,12 @@ qemuDomainChangeNet(virQEMUDriver *driver,
/* device alias is checked already in virDomainDefCompatibleDevice */
- if (newdev->info.rombar == VIR_TRISTATE_SWITCH_ABSENT)
- newdev->info.rombar = olddev->info.rombar;
if (olddev->info.rombar != newdev->info.rombar) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("cannot modify network device rom bar setting"));
goto cleanup;
}
- if (!newdev->info.romfile)
- newdev->info.romfile = g_strdup(olddev->info.romfile);
if (STRNEQ_NULLABLE(olddev->info.romfile, newdev->info.romfile)) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("cannot modify network rom file"));
@@ -3860,8 +3856,6 @@ qemuDomainChangeNet(virQEMUDriver *driver,
goto cleanup;
}
- if (newdev->info.romenabled == VIR_TRISTATE_BOOL_ABSENT)
- newdev->info.romenabled = olddev->info.romenabled;
if (olddev->info.romenabled != newdev->info.romenabled) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("cannot modify network device rom enabled setting"));
--
2.45.1
2
1
24 Jul '24
In cases when a QEMU process takes longer than the time sigterm and
sigkill are issued to kill the process do not simply fail and leave the
VM in state VIR_DOMAIN_SHUTDOWN until the daemon stops. Instead set up
an fd on /proc/$pid and get notified when the QEMU process finally has
terminated to cleanup the VM state.
Resolves: https://issues.redhat.com/browse/RHEL-28819
Signed-off-by: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
---
src/qemu/qemu_domain.c | 8 +++
src/qemu/qemu_domain.h | 2 +
src/qemu/qemu_driver.c | 18 ++++++
src/qemu/qemu_process.c | 124 ++++++++++++++++++++++++++++++++++++++--
src/qemu/qemu_process.h | 1 +
5 files changed, 148 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2134b11038..8147ff02fd 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1889,6 +1889,11 @@ qemuDomainObjPrivateFree(void *data)
virChrdevFree(priv->devs);
+ if (priv->pidMonitored >= 0) {
+ virEventRemoveHandle(priv->pidMonitored);
+ priv->pidMonitored = -1;
+ }
+
/* This should never be non-NULL if we get here, but just in case... */
if (priv->mon) {
VIR_ERROR(_("Unexpected QEMU monitor still active during domain deletion"));
@@ -1934,6 +1939,8 @@ qemuDomainObjPrivateAlloc(void *opaque)
priv->blockjobs = virHashNew(virObjectUnref);
priv->fds = virHashNew(g_object_unref);
+ priv->pidMonitored = -1;
+
/* agent commands block by default, user can choose different behavior */
priv->agentTimeout = VIR_DOMAIN_AGENT_RESPONSE_TIMEOUT_BLOCK;
priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
@@ -11680,6 +11687,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event)
case QEMU_PROCESS_EVENT_RESET:
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
case QEMU_PROCESS_EVENT_MONITOR_EOF:
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index d777559119..a5092dd7f0 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -119,6 +119,7 @@ struct _qemuDomainObjPrivate {
bool beingDestroyed;
char *pidfile;
+ int pidMonitored;
virDomainPCIAddressSet *pciaddrs;
virDomainUSBAddressSet *usbaddrs;
@@ -469,6 +470,7 @@ typedef enum {
QEMU_PROCESS_EVENT_UNATTENDED_MIGRATION,
QEMU_PROCESS_EVENT_RESET,
QEMU_PROCESS_EVENT_NBDKIT_EXITED,
+ QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9f3013e231..6b1e4084f6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4041,6 +4041,21 @@ processNbdkitExitedEvent(virDomainObj *vm,
}
+static void
+processShutdownCompletedEvent(virQEMUDriver *driver,
+ virDomainObj *vm)
+{
+ if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+ return;
+
+ if (virDomainObjIsActive(vm))
+ qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN,
+ VIR_ASYNC_JOB_NONE, 0);
+
+ virDomainObjEndJob(vm);
+}
+
+
static void qemuProcessEventHandler(void *data, void *opaque)
{
struct qemuProcessEvent *processEvent = data;
@@ -4101,6 +4116,9 @@ static void qemuProcessEventHandler(void *data, void *opaque)
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
processNbdkitExitedEvent(vm, processEvent->data);
break;
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
+ processShutdownCompletedEvent(driver, vm);
+ break;
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 25dfd04272..c6f7d34168 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -25,6 +25,9 @@
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
+#if WITH_SYS_SYSCALL_H
+# include <sys/syscall.h>
+#endif
#if defined(__linux__)
# include <linux/capability.h>
#elif defined(__FreeBSD__)
@@ -8387,9 +8390,114 @@ qemuProcessCreatePretendCmdBuild(virDomainObj *vm,
}
+#if WITH_SYS_SYSCALL_H && defined(SYS_pidfd_open)
+typedef struct {
+ virDomainObj *vm;
+ int pidfd;
+} qemuProcessInShutdownEventData;
+
+
+static qemuProcessInShutdownEventData*
+qemuProcessInShutdownEventDataNew(virDomainObj *vm, int pidfd)
+{
+ qemuProcessInShutdownEventData *d = g_new(qemuProcessInShutdownEventData, 1);
+ d->vm = virObjectRef(vm);
+ d->pidfd = pidfd;
+ return d;
+}
+
+
+static void
+qemuProcessInShutdownEventDataFree(qemuProcessInShutdownEventData *d)
+{
+ virObjectUnref(d->vm);
+ VIR_FORCE_CLOSE(d->pidfd);
+ g_free(d);
+}
+
+
+static void
+qemuProcessInShutdownPidfdCb(int watch,
+ int fd,
+ int events G_GNUC_UNUSED,
+ void *opaque)
+{
+ qemuProcessInShutdownEventData *data = opaque;
+ virDomainObj *vm = data->vm;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld fd=%d",
+ vm, vm->def->name, (long long)vm->pid, fd);
+
+ virEventRemoveHandle(watch);
+
+ virObjectLock(vm);
+
+ VIR_INFO("QEMU process %lld finally completed termination",
+ (long long)vm->pid);
+
+ QEMU_DOMAIN_PRIVATE(vm)->pidMonitored = -1;
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
+ 0, 0, NULL);
+
+ virObjectUnlock(vm);
+}
+#endif /* WITH_SYS_SYSCALL_H && defined(SYS_pidfd_open) */
+
+
+static int
+qemuProcessInShutdownStartMonitor(virDomainObj *vm)
+{
+#if WITH_SYS_SYSCALL_H && defined(SYS_pidfd_open)
+ qemuDomainObjPrivate *priv = vm->privateData;
+ qemuProcessInShutdownEventData *data;
+ int pidfd;
+ int ret = -1;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld pidMonitored=%d",
+ vm, vm->def->name, (long long)vm->pid,
+ priv->pidMonitored);
+
+ if (priv->pidMonitored >= 0) {
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i already set up", vm->pid);
+ goto cleanup;
+ }
+
+ pidfd = syscall(SYS_pidfd_open, vm->pid, 0);
+ if (pidfd < 0) {
+ if (errno == ESRCH) /* process has already terminated */
+ ret = 1;
+ goto cleanup;
+ }
+
+ data = qemuProcessInShutdownEventDataNew(vm, pidfd);
+ if ((priv->pidMonitored = virEventAddHandle(pidfd,
+ VIR_EVENT_HANDLE_READABLE,
+ qemuProcessInShutdownPidfdCb,
+ data,
+ (virFreeCallback)qemuProcessInShutdownEventDataFree)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("failed to monitor qemu in-shutdown process %1$i"),
+ vm->pid);
+ qemuProcessInShutdownEventDataFree(data);
+ goto cleanup;
+ }
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i for termination", vm->pid);
+ ret = 0;
+
+ cleanup:
+ return ret;
+#else /* !WITH_SYS_SYSCALL_H || !defined(SYS_pidfd_open) */
+ VIR_DEBUG("Monitoring qemu process %i not implemented", vm->pid);
+ return -1;
+#endif /* !WITH_SYS_SYSCALL_H || !defined(SYS_pidfd_open) */
+}
+
+
int
qemuProcessKill(virDomainObj *vm, unsigned int flags)
{
+ int ret = -1;
+
VIR_DEBUG("vm=%p name=%s pid=%lld flags=0x%x",
vm, vm->def->name,
(long long)vm->pid, flags);
@@ -8410,10 +8518,16 @@ qemuProcessKill(virDomainObj *vm, unsigned int flags)
/* Request an extra delay of two seconds per current nhostdevs
* to be safe against stalls by the kernel freeing up the resources */
- return virProcessKillPainfullyDelay(vm->pid,
- !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
- vm->def->nhostdevs * 2,
- false);
+ ret = virProcessKillPainfullyDelay(vm->pid,
+ !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
+ vm->def->nhostdevs * 2,
+ false);
+
+ if (ret < 0 && (flags & VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR))
+ if (qemuProcessInShutdownStartMonitor(vm) == 1)
+ ret = 0; /* process termination detected */
+
+ return ret;
}
@@ -8438,7 +8552,7 @@ qemuProcessBeginStopJob(virDomainObj *vm,
* cleared inside qemuProcessStop */
priv->beingDestroyed = true;
- if (qemuProcessKill(vm, killFlags) < 0)
+ if (qemuProcessKill(vm, killFlags|VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR) < 0)
goto error;
/* Wake up anything waiting on domain condition */
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index cb67bfcd2d..2324aeb7bd 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -180,6 +180,7 @@ typedef enum {
VIR_QEMU_PROCESS_KILL_FORCE = 1 << 0,
VIR_QEMU_PROCESS_KILL_NOWAIT = 1 << 1,
VIR_QEMU_PROCESS_KILL_NOCHECK = 1 << 2, /* bypass the running vm check */
+ VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR = 1 << 3, /* on error enable process monitor */
} virQemuProcessKillMode;
int qemuProcessKill(virDomainObj *vm, unsigned int flags);
--
2.45.0
3
5
24 Jul '24
From: notpua <atp(a)tutamail.com>
Provides completers for auth-type and source-format commands for
virsh pool-create-as and pool-define-as commands. Use Empty completers
for options where completions are not required.
Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
Signed-off-by: Abhiram Tilak <atp.exp(a)gmail.com>
---
Changes in v2:
- Fix all formatting errors
- Change some options using Empty completers, to use
LocalPath completers.
- Add completers for AdapterName and AdapterParent using information
from node devices.
Changes in v3:
- Call virshNodeDeviceNameComplete with modified flags instead of
duplicating the whole implementation.
src/libvirt_private.syms | 2 ++
tools/virsh-completer-pool.c | 70 ++++++++++++++++++++++++++++++++++++
tools/virsh-completer-pool.h | 20 +++++++++++
tools/virsh-pool.c | 9 +++++
4 files changed, 101 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c35366c9e1..6ba1e8e2c5 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1123,6 +1123,8 @@ virStorageAuthDefCopy;
virStorageAuthDefFormat;
virStorageAuthDefFree;
virStorageAuthDefParse;
+virStorageAuthTypeFromString;
+virStorageAuthTypeToString;
virStorageFileFeatureTypeFromString;
virStorageFileFeatureTypeToString;
virStorageFileFormatTypeFromString;
diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
index 3568bb985b..ba7855fdba 100644
--- a/tools/virsh-completer-pool.c
+++ b/tools/virsh-completer-pool.c
@@ -23,6 +23,7 @@
#include "virsh-completer-pool.h"
#include "virsh-util.h"
#include "conf/storage_conf.h"
+#include "conf/node_device_conf.h"
#include "virsh-pool.h"
#include "virsh.h"
@@ -106,3 +107,72 @@ virshPoolTypeCompleter(vshControl *ctl,
return virshCommaStringListComplete(type_str, (const char **)tmp);
}
+
+
+char **
+virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ size_t i = 0;
+ size_t j = 0;
+ g_auto(GStrv) tmp = NULL;
+ size_t nformats = VIR_STORAGE_POOL_FS_LAST + VIR_STORAGE_POOL_NETFS_LAST +
+ VIR_STORAGE_POOL_DISK_LAST + VIR_STORAGE_POOL_LOGICAL_LAST;
+
+ virCheckFlags(0, NULL);
+
+ tmp = g_new0(char *, nformats + 1);
+
+ /* Club all PoolFormats for completion */
+ for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
+
+ for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
+
+ for (i = 1; i < VIR_STORAGE_POOL_DISK_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));
+
+ for (i = 1; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));
+
+ return g_steal_pointer(&tmp);
+}
+
+
+char **
+virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ size_t i = 0;
+ g_auto(GStrv) tmp = NULL;
+
+ virCheckFlags(0, NULL);
+
+ tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
+
+ for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
+ tmp[i] = g_strdup(virStorageAuthTypeToString(i));
+
+ return g_steal_pointer(&tmp);
+}
+
+
+char **
+virshAdapterNameCompleter(vshControl *ctl,
+ const vshCmd *cmd, unsigned int flags)
+{
+ flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST;
+ return virshNodeDeviceNameCompleter(ctl, cmd, flags);
+}
+
+
+char **
+virshAdapterParentCompleter(vshControl *ctl,
+ const vshCmd *cmd, unsigned int flags)
+{
+ flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPORTS;
+ return virshNodeDeviceNameCompleter(ctl, cmd, flags);
+}
diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
index bff3e5742b..eccc08a73f 100644
--- a/tools/virsh-completer-pool.h
+++ b/tools/virsh-completer-pool.h
@@ -40,3 +40,23 @@ char **
virshPoolTypeCompleter(vshControl *ctl,
const vshCmd *cmd,
unsigned int flags);
+
+char **
+virshPoolFormatCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshPoolAuthTypeCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshAdapterNameCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshAdapterParentCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
index f9aad8ded0..0cbd1417e6 100644
--- a/tools/virsh-pool.c
+++ b/tools/virsh-pool.c
@@ -80,31 +80,37 @@
{.name = "source-path", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("source path for underlying storage") \
}, \
{.name = "source-dev", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("source device for underlying storage") \
}, \
{.name = "source-name", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompleteEmpty, \
.help = N_("source name for underlying storage") \
}, \
{.name = "target", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("target for underlying storage") \
}, \
{.name = "source-format", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshPoolFormatCompleter, \
.help = N_("format for underlying storage") \
}, \
{.name = "auth-type", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshPoolAuthTypeCompleter, \
.help = N_("auth type to be used for underlying storage") \
}, \
{.name = "auth-username", \
@@ -126,6 +132,7 @@
{.name = "adapter-name", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshAdapterNameCompleter, \
.help = N_("adapter name to be used for underlying storage") \
}, \
{.name = "adapter-wwnn", \
@@ -141,6 +148,7 @@
{.name = "adapter-parent", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshAdapterParentCompleter, \
.help = N_("adapter parent scsi_hostN to be used for underlying vHBA storage") \
}, \
{.name = "adapter-parent-wwnn", \
@@ -161,6 +169,7 @@
{.name = "source-protocol-ver", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompleteEmpty, \
.help = N_("nfsvers value for NFS pool mount option") \
}, \
{.name = "source-initiator", \
--
2.39.2
2
1
23 Jul '24
Provides completers for auth-type and source-format commands for
virsh pool-create-as and pool-define-as commands. Use Empty completers
for options where completions are not required.
Related Issue: https://gitlab.com/libvirt/libvirt/-/issues/9
Signed-off-by: Abhiram Tilak <atp.exp(a)gmail.com>
---
Changes in v2:
- Fix all formatting errors
- Change some options using Empty completers, to use
LocalPath completers.
- Add completers for AdapterName and AdapterParent using information
from node devices.
src/libvirt_private.syms | 2 +
tools/virsh-completer-pool.c | 128 +++++++++++++++++++++++++++++++++++
tools/virsh-completer-pool.h | 20 ++++++
tools/virsh-pool.c | 9 +++
4 files changed, 159 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f0f7aa8654..fcb0ef7afe 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1117,6 +1117,8 @@ virStorageAuthDefCopy;
virStorageAuthDefFormat;
virStorageAuthDefFree;
virStorageAuthDefParse;
+virStorageAuthTypeFromString;
+virStorageAuthTypeToString;
virStorageFileFeatureTypeFromString;
virStorageFileFeatureTypeToString;
virStorageFileFormatTypeFromString;
diff --git a/tools/virsh-completer-pool.c b/tools/virsh-completer-pool.c
index 3568bb985b..7db2a20347 100644
--- a/tools/virsh-completer-pool.c
+++ b/tools/virsh-completer-pool.c
@@ -23,6 +23,7 @@
#include "virsh-completer-pool.h"
#include "virsh-util.h"
#include "conf/storage_conf.h"
+#include "conf/node_device_conf.h"
#include "virsh-pool.h"
#include "virsh.h"
@@ -106,3 +107,130 @@ virshPoolTypeCompleter(vshControl *ctl,
return virshCommaStringListComplete(type_str, (const char **)tmp);
}
+
+
+char **
+virshPoolFormatCompleter(vshControl *ctl G_GNUC_UNUSED,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ size_t i = 0;
+ size_t j = 0;
+ g_auto(GStrv) tmp = NULL;
+ size_t nformats = VIR_STORAGE_POOL_FS_LAST + VIR_STORAGE_POOL_NETFS_LAST +
+ VIR_STORAGE_POOL_DISK_LAST + VIR_STORAGE_POOL_LOGICAL_LAST;
+
+ virCheckFlags(0, NULL);
+
+ tmp = g_new0(char *, nformats + 1);
+
+ /* Club all PoolFormats for completion */
+ for (i = 0; i < VIR_STORAGE_POOL_FS_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatFileSystemTypeToString(i));
+
+ for (i = 0; i < VIR_STORAGE_POOL_NETFS_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatFileSystemNetTypeToString(i));
+
+ for (i = 1; i < VIR_STORAGE_POOL_DISK_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatDiskTypeToString(i));
+
+ for (i = 1; i < VIR_STORAGE_POOL_LOGICAL_LAST; i++)
+ tmp[j++] = g_strdup(virStoragePoolFormatLogicalTypeToString(i));
+
+ return g_steal_pointer(&tmp);
+}
+
+
+char **
+virshPoolAuthTypeCompleter(vshControl *ctl G_GNUC_UNUSED,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ size_t i = 0;
+ g_auto(GStrv) tmp = NULL;
+
+ virCheckFlags(0, NULL);
+
+ tmp = g_new0(char *, VIR_STORAGE_AUTH_TYPE_LAST + 1);
+
+ for (i = 0; i < VIR_STORAGE_AUTH_TYPE_LAST; i++)
+ tmp[i] = g_strdup(virStorageAuthTypeToString(i));
+
+ return g_steal_pointer(&tmp);
+}
+
+
+char **
+virshAdapterNameCompleter(vshControl *ctl,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ virshControl *priv = ctl->privData;
+ virNodeDevicePtr *devs = NULL;
+ int ndevs = 0;
+ size_t i = 0;
+ char **ret = NULL;
+ g_auto(GStrv) tmp = NULL;
+
+ virCheckFlags(0, NULL);
+
+ if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
+ return NULL;
+
+ flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST;
+ if ((ndevs = virConnectListAllNodeDevices(priv->conn, &devs, flags)) < 0)
+ return NULL;
+
+ tmp = g_new0(char *, ndevs + 1);
+
+ for (i = 0; i < ndevs; i++) {
+ const char *name = virNodeDeviceGetName(devs[i]);
+
+ tmp[i] = g_strdup(name);
+ }
+
+ ret = g_steal_pointer(&tmp);
+
+ for (i = 0; i < ndevs; i++)
+ virshNodeDeviceFree(devs[i]);
+ g_free(devs);
+ return ret;
+}
+
+
+char **
+virshAdapterParentCompleter(vshControl *ctl,
+ const vshCmd *cmd G_GNUC_UNUSED,
+ unsigned int flags)
+{
+ virshControl *priv = ctl->privData;
+ virNodeDevicePtr *devs = NULL;
+ int ndevs = 0;
+ size_t i = 0;
+ char **ret = NULL;
+ g_auto(GStrv) tmp = NULL;
+
+ virCheckFlags(0, NULL);
+
+ if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
+ return NULL;
+
+ flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_VPORTS;
+ if ((ndevs = virConnectListAllNodeDevices(priv->conn, &devs, flags)) < 0)
+ return NULL;
+
+ tmp = g_new0(char *, ndevs + 1);
+
+ for (i = 0; i < ndevs; i++) {
+ const char *name = virNodeDeviceGetName(devs[i]);
+
+ tmp[i] = g_strdup(name);
+ }
+
+ ret = g_steal_pointer(&tmp);
+
+ for (i = 0; i < ndevs; i++)
+ virshNodeDeviceFree(devs[i]);
+ g_free(devs);
+ return ret;
+}
diff --git a/tools/virsh-completer-pool.h b/tools/virsh-completer-pool.h
index bff3e5742b..eccc08a73f 100644
--- a/tools/virsh-completer-pool.h
+++ b/tools/virsh-completer-pool.h
@@ -40,3 +40,23 @@ char **
virshPoolTypeCompleter(vshControl *ctl,
const vshCmd *cmd,
unsigned int flags);
+
+char **
+virshPoolFormatCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshPoolAuthTypeCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshAdapterNameCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
+
+char **
+virshAdapterParentCompleter(vshControl *ctl,
+ const vshCmd *cmd,
+ unsigned int flags);
diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c
index f9aad8ded0..0cbd1417e6 100644
--- a/tools/virsh-pool.c
+++ b/tools/virsh-pool.c
@@ -80,31 +80,37 @@
{.name = "source-path", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("source path for underlying storage") \
}, \
{.name = "source-dev", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("source device for underlying storage") \
}, \
{.name = "source-name", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompleteEmpty, \
.help = N_("source name for underlying storage") \
}, \
{.name = "target", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompletePathLocalExisting, \
.help = N_("target for underlying storage") \
}, \
{.name = "source-format", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshPoolFormatCompleter, \
.help = N_("format for underlying storage") \
}, \
{.name = "auth-type", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshPoolAuthTypeCompleter, \
.help = N_("auth type to be used for underlying storage") \
}, \
{.name = "auth-username", \
@@ -126,6 +132,7 @@
{.name = "adapter-name", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshAdapterNameCompleter, \
.help = N_("adapter name to be used for underlying storage") \
}, \
{.name = "adapter-wwnn", \
@@ -141,6 +148,7 @@
{.name = "adapter-parent", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshAdapterParentCompleter, \
.help = N_("adapter parent scsi_hostN to be used for underlying vHBA storage") \
}, \
{.name = "adapter-parent-wwnn", \
@@ -161,6 +169,7 @@
{.name = "source-protocol-ver", \
.type = VSH_OT_STRING, \
.unwanted_positional = true, \
+ .completer = virshCompleteEmpty, \
.help = N_("nfsvers value for NFS pool mount option") \
}, \
{.name = "source-initiator", \
--
2.39.2
3
2
[PATCH] qemuProcessStop: Don't unlock domain until most of the cleanup is done
by Michal Privoznik 23 Jul '24
by Michal Privoznik 23 Jul '24
23 Jul '24
Imagine two threads. Thread A is executing qemuProcessStop() and
thread B is executing qemuDomainCreateXML(). To make things more
interesting, the domain XML passed to qemuDomainCreateXML matches
name + UUID of that the virDomainObj that qemuProcessStop() is
currently working with. Here's what happens.
1) Thread A locks @vm, enters qemuProcessStop().
2) Thread B parses given XML, calls virDomainObjListAdd() ->
virDomainObjListAdd() -> virDomainObjListAddLocked() ->
virDomainObjListFindByUUIDLocked(). Since there's a match on
UUID, an virDomainObj object is returned and the thread
proceeds to calling virObjectLock(). NB, it's the same object
as in thread A.
3) Thread A sets vm->def->id = -1; this means that from this
point on, virDomainObjIsActive() will return false.
4) Thread A calls qemuDomainObjStopWorker() which unlocks the
@vm.
5) Thread B acquires the @vm lock and since
virDomainObjIsActive() returns false, it proceeds to calling
virDomainObjAssignDef() where vm->def is replaced.
6) Thread B then calls qemuProcessBeginJob() which unlocks the
@vm temporarily.
7) Thread A, still in qemuDomainObjStopWorker() acquires @vm lock
and proceeds with cleanup.
8) Thread A finds different definition than the one needing
cleanup.
In my testing I've seen stale pointers, e.g.
vm->def->nets[0]->priv was NULL, which lead to a SIGSEGV as
there's 'QEMU_DOMAIN_NETWORK_PRIVATE(net)->created' line when
cleaning up nets. Your mileage may vary.
Even if we did not crash, the plain fact that vm->def is changed
in the middle of qemuProcessStop() means we might be cleaning up
something else than intended.
As a fix, I'm moving all lines that obviously touch vm->def
before the domain object is unlocked. That left
virHookCall(VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END) nearly
next to virHookCall(VIR_HOOK_QEMU_OP_RELEASE,
VIR_HOOK_SUBOP_END) which I figured is not something we want. So
I've shuffled things a bit more.
Fixes: 3865410e7f67ca4ec66e9a905e75f452762a97f0
Resolves: https://issues.redhat.com/browse/RHEL-49607
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_process.c | 122 ++++++++++++++++++++--------------------
1 file changed, 62 insertions(+), 60 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 25dfd04272..9ea6c678b8 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8530,6 +8530,18 @@ void qemuProcessStop(virQEMUDriver *driver,
VIR_QEMU_PROCESS_KILL_FORCE|
VIR_QEMU_PROCESS_KILL_NOCHECK));
+ vm->pid = 0;
+
+ /* now that we know it's stopped call the hook if present */
+ if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
+ g_autofree char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
+
+ /* we can't stop the operation even if the script raised an error */
+ ignore_value(virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
+ VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END,
+ NULL, xml, NULL));
+ }
+
if (priv->agent) {
g_clear_pointer(&priv->agent, qemuAgentClose);
}
@@ -8553,25 +8565,6 @@ void qemuProcessStop(virQEMUDriver *driver,
qemuDBusStop(driver, vm);
- /* Only after this point we can reset 'priv->beingDestroyed' so that
- * there's no point at which the VM could be considered as alive between
- * entering the destroy job and this point where the active "flag" is
- * cleared.
- */
- vm->def->id = -1;
- priv->beingDestroyed = false;
-
- /* Wake up anything waiting on domain condition */
- virDomainObjBroadcast(vm);
-
- /* IMPORTANT: qemuDomainObjStopWorker() unlocks @vm in order to prevent
- * deadlocks with the per-VM event loop thread. This MUST be done after
- * marking the VM as dead */
- qemuDomainObjStopWorker(vm);
-
- if (!!g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
- driver->inhibitCallback(false, driver->inhibitOpaque);
-
/* Clear network bandwidth */
virDomainClearNetBandwidth(vm->def);
@@ -8588,18 +8581,6 @@ void qemuProcessStop(virQEMUDriver *driver,
}
}
- virPortAllocatorRelease(priv->nbdPort);
- priv->nbdPort = 0;
-
- if (priv->monConfig) {
- if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX)
- unlink(priv->monConfig->data.nix.path);
- g_clear_pointer(&priv->monConfig, virObjectUnref);
- }
-
- /* Remove the master key */
- qemuDomainMasterKeyRemove(priv);
-
ignore_value(virDomainChrDefForeach(vm->def,
false,
qemuProcessCleanupChardevDevice,
@@ -8609,22 +8590,6 @@ void qemuProcessStop(virQEMUDriver *driver,
/* Its namespace is also gone then. */
qemuDomainDestroyNamespace(driver, vm);
- virFileDeleteTree(priv->libDir);
- virFileDeleteTree(priv->channelTargetDir);
-
- /* Stop autodestroy in case guest is restarted */
- virCloseCallbacksDomainRemove(vm, NULL, qemuProcessAutoDestroy);
-
- /* now that we know it's stopped call the hook if present */
- if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
- g_autofree char *xml = qemuDomainDefFormatXML(driver, NULL, vm->def, 0);
-
- /* we can't stop the operation even if the script raised an error */
- ignore_value(virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
- VIR_HOOK_QEMU_OP_STOPPED, VIR_HOOK_SUBOP_END,
- NULL, xml, NULL));
- }
-
/* Reset Security Labels unless caller don't want us to */
if (!(flags & VIR_QEMU_PROCESS_STOP_NO_RELABEL))
qemuSecurityRestoreAllLabel(driver, vm,
@@ -8672,8 +8637,6 @@ void qemuProcessStop(virQEMUDriver *driver,
virResctrlAllocRemove(vm->def->resctrls[i]->alloc);
}
- qemuProcessRemoveDomainStatus(driver, vm);
-
/* Remove VNC and Spice ports from port reservation bitmap, but only if
they were reserved by the driver (autoport=yes)
*/
@@ -8706,20 +8669,9 @@ void qemuProcessStop(virQEMUDriver *driver,
}
}
- for (i = 0; i < vm->ndeprecations; i++)
- g_free(vm->deprecations[i]);
- g_clear_pointer(&vm->deprecations, g_free);
- vm->ndeprecations = 0;
- vm->taint = 0;
- vm->pid = 0;
- virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
for (i = 0; i < vm->def->niothreadids; i++)
vm->def->iothreadids[i]->thread_id = 0;
- /* clean up a possible backup job */
- if (priv->backup)
- qemuBackupJobTerminate(vm, VIR_DOMAIN_JOB_STATUS_CANCELED);
-
/* Do this explicitly after vm->pid is reset so that security drivers don't
* try to enter the domain's namespace which is non-existent by now as qemu
* is no longer running. */
@@ -8753,6 +8705,56 @@ void qemuProcessStop(virQEMUDriver *driver,
qemuSecurityReleaseLabel(driver->securityManager, vm->def);
+ /* Only after this point we can reset 'priv->beingDestroyed' so that
+ * there's no point at which the VM could be considered as alive between
+ * entering the destroy job and this point where the active "flag" is
+ * cleared.
+ */
+ vm->def->id = -1;
+ priv->beingDestroyed = false;
+
+ /* Wake up anything waiting on domain condition */
+ virDomainObjBroadcast(vm);
+
+ /* IMPORTANT: qemuDomainObjStopWorker() unlocks @vm in order to prevent
+ * deadlocks with the per-VM event loop thread. This MUST be done after
+ * marking the VM as dead */
+ qemuDomainObjStopWorker(vm);
+
+ if (!!g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
+ driver->inhibitCallback(false, driver->inhibitOpaque);
+
+ virPortAllocatorRelease(priv->nbdPort);
+ priv->nbdPort = 0;
+
+ if (priv->monConfig) {
+ if (priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX)
+ unlink(priv->monConfig->data.nix.path);
+ g_clear_pointer(&priv->monConfig, virObjectUnref);
+ }
+
+ /* Remove the master key */
+ qemuDomainMasterKeyRemove(priv);
+
+ virFileDeleteTree(priv->libDir);
+ virFileDeleteTree(priv->channelTargetDir);
+
+ /* Stop autodestroy in case guest is restarted */
+ virCloseCallbacksDomainRemove(vm, NULL, qemuProcessAutoDestroy);
+
+ qemuProcessRemoveDomainStatus(driver, vm);
+
+ for (i = 0; i < vm->ndeprecations; i++)
+ g_free(vm->deprecations[i]);
+ g_clear_pointer(&vm->deprecations, g_free);
+ vm->ndeprecations = 0;
+ vm->taint = 0;
+ virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
+
+ /* clean up a possible backup job */
+ if (priv->backup)
+ qemuBackupJobTerminate(vm, VIR_DOMAIN_JOB_STATUS_CANCELED);
+
/* clear all private data entries which are no longer needed */
qemuDomainObjPrivateDataClear(priv);
--
2.44.2
3
4
23 Jul '24
On various occasions, virt-host-validate parses /proc/cpuinfo to
learn about CPU flags (see virHostValidateGetCPUFlags()). It does
so, by reading the file line by line until the line with CPU
flags is reached. Then the line is split into individual flags
(using space as a delimiter) and the list of flags is then
iterated over.
This works, except for cases when the line with CPU flags is too
long. Problem is - the line is capped at 1024 bytes and on newer
CPUs (and newer kernels), the line can be significantly longer.
I've seen a line that's ~1200 characters long (with 164 flags
reported).
Switch to unbounded read from the file (getline()).
Resolves: https://issues.redhat.com/browse/RHEL-39969
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
v2 of:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/LK74…
diff to v2:
- Keep trimming of the optional newline
tools/virt-host-validate-common.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index 591143c24d..63cc3dbe7b 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -106,21 +106,19 @@ virBitmap *virHostValidateGetCPUFlags(void)
{
FILE *fp;
virBitmap *flags = NULL;
+ g_autofree char *line = NULL;
+ size_t linelen = 0;
if (!(fp = fopen("/proc/cpuinfo", "r")))
return NULL;
flags = virBitmapNew(VIR_HOST_VALIDATE_CPU_FLAG_LAST);
- do {
- char line[1024];
+ while (getline(&line, &linelen, fp) > 0) {
char *start;
g_auto(GStrv) tokens = NULL;
GStrv next;
- if (!fgets(line, sizeof(line), fp))
- break;
-
/* The line we're interested in is marked differently depending
* on the architecture, so check possible prefixes */
if (!STRPREFIX(line, "flags") &&
@@ -129,11 +127,9 @@ virBitmap *virHostValidateGetCPUFlags(void)
!STRPREFIX(line, "facilities"))
continue;
- /* fgets() includes the trailing newline in the output buffer,
- * so we need to clean that up ourselves. We can safely access
- * line[strlen(line) - 1] because the checks above would cause
- * us to skip empty strings */
- line[strlen(line) - 1] = '\0';
+ /* getline() may include the trailing newline in the output
+ * buffer, so we need to clean that up ourselves. */
+ virStringTrimOptionalNewline(line);
/* Skip to the separator */
if (!(start = strchr(line, ':')))
@@ -153,7 +149,7 @@ virBitmap *virHostValidateGetCPUFlags(void)
if ((value = virHostValidateCPUFlagTypeFromString(*next)) >= 0)
ignore_value(virBitmapSetBit(flags, value));
}
- } while (1);
+ }
VIR_FORCE_FCLOSE(fp);
--
2.44.2
2
1
23 Jul '24
On various occasions, virt-host-validate parses /proc/cpuinfo to
learn about CPU flags (see virHostValidateGetCPUFlags()). It does
so, by reading the file line by line until the line with CPU
flags is reached. Then the line is split into individual flags
(using space as a delimiter) and the list of flags is then
iterated over.
This works, except for cases when the line with CPU flags is too
long. Problem is - the line is capped at 1024 bytes and on newer
CPUs (and newer kernels), the line can be significantly longer.
I've seen a line that's ~1200 characters long (with 164 flags
reported).
Switch to unbounded read from the file (getline()).
Resolves: https://issues.redhat.com/browse/RHEL-39969
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tools/virt-host-validate-common.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index 591143c24d..e5fa6606d2 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -106,21 +106,19 @@ virBitmap *virHostValidateGetCPUFlags(void)
{
FILE *fp;
virBitmap *flags = NULL;
+ g_autofree char *line = NULL;
+ size_t linelen = 0;
if (!(fp = fopen("/proc/cpuinfo", "r")))
return NULL;
flags = virBitmapNew(VIR_HOST_VALIDATE_CPU_FLAG_LAST);
- do {
- char line[1024];
+ while (getline(&line, &linelen, fp) > 0) {
char *start;
g_auto(GStrv) tokens = NULL;
GStrv next;
- if (!fgets(line, sizeof(line), fp))
- break;
-
/* The line we're interested in is marked differently depending
* on the architecture, so check possible prefixes */
if (!STRPREFIX(line, "flags") &&
@@ -129,12 +127,6 @@ virBitmap *virHostValidateGetCPUFlags(void)
!STRPREFIX(line, "facilities"))
continue;
- /* fgets() includes the trailing newline in the output buffer,
- * so we need to clean that up ourselves. We can safely access
- * line[strlen(line) - 1] because the checks above would cause
- * us to skip empty strings */
- line[strlen(line) - 1] = '\0';
-
/* Skip to the separator */
if (!(start = strchr(line, ':')))
continue;
@@ -153,7 +145,7 @@ virBitmap *virHostValidateGetCPUFlags(void)
if ((value = virHostValidateCPUFlagTypeFromString(*next)) >= 0)
ignore_value(virBitmapSetBit(flags, value));
}
- } while (1);
+ }
VIR_FORCE_FCLOSE(fp);
--
2.44.2
3
2
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/rpc/virnetclientstream.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
index 98034d737d..380b785869 100644
--- a/src/rpc/virnetclientstream.c
+++ b/src/rpc/virnetclientstream.c
@@ -725,6 +725,8 @@ int virNetClientStreamEventAddCallback(virNetClientStream *st,
virNetClientStreamEventTimer,
st,
virObjectUnref)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to add timer to event loop"));
virObjectUnref(st);
goto cleanup;
}
--
2.45.2
2
1
Hey folks,
My team is working on exposing `cpugroups` to Libvirt while using
'hyperv' hypervisor with cloud-hypervisor(VMM). cpugroups are relevant
in a specific configuration of hyperv called 'minroot'. In Minroot
configuration, hypervisor artificially restricts Dom0 to run on a subset
of cpus (Logical Processors). The rest of the cpus can be assigned to
guests.
cpugroups manage the CPUs assigned to guests and their scheduling
properties. Initially this looks similar to `cpuset` (in cgroups), but
the controls available with cpugroups don't map easily to those in
cgroups. For example:
* "IdleLPs" are the number of Logical Processors in a cpugroup, that
should be reserved to a guest even if they are idle
* "SchedulingPriority", the priority(values between 0..7) with which to
schedule CPUs in a cpugroup.
As controls like above don't easily map to anything in cgroups, using a
driver specific element in Domain xml, to configure cpugroups seems like
a right approach. For example:
<ch:cpugroups>
<idle_lps value='4'/>
<scheduling_priority value='6'/>
</ch:cpugroups>
As cpugroups is only relevant while using minroot configuration on
hyperv, I don't see any value in generalizing this setting. So, having
some "ch" driver specific settings seems like a good approach to
implement this feature.
Question1: Do you see any concerns with this approach?
The cpugroup settings can be applied/modified using sysfs interface or
using a cmdline tool on the host. I see Libvirt uses both these
mechanisms for various use cases. But, given a choice, sysfs based
interface seems like a simpler approach to me. With sysfs interface
Libvirt does not have to take install time dependencies on new tools.
Question2: Of "sysfs" vs "cmdline tool" which is preferred, given a choice?
Early feedback from the community will help us invest in the preferred
choices sooner than later. Thanks for your consideration.
References:
*
https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/man…
--
Regards,
Praveen
2
2
Add an element to configure the rlimit nofile size:
...
<binary>
<rlimit_nofile size='122333'/>
</binary>
...
Non-positive values are forbidden in 'domaincommon.rng'. Added separate
test file, created by modifying the 'vhost-user-fs-fd-memory.xml'.
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/485
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
docs/formatdomain.rst | 4 ++
src/conf/domain_conf.c | 12 +++++
src/conf/domain_conf.h | 1 +
src/conf/schemas/domaincommon.rng | 9 ++++
...vhost-user-fs-fd-rlimit.x86_64-latest.args | 34 +++++++++++++
.../vhost-user-fs-fd-rlimit.x86_64-latest.xml | 50 +++++++++++++++++++
.../vhost-user-fs-fd-rlimit.xml | 50 +++++++++++++++++++
tests/qemuxmlconftest.c | 1 +
8 files changed, 161 insertions(+)
create mode 100644 tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args
create mode 100644 tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index ca33a2a570..10584dfe83 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -3734,6 +3734,10 @@ A directory on the host that can be accessed directly from the guest.
The thread pool helps increase the number of requests in flight when used with
storage that has a higher latency. However, it has an overhead, and so for
fast, low latency filesystems, it may be best to turn it off. ( :since:`Since 8.5.0` )
+ Element ``rlimit_profile`` accepts one attribute ``size`` which defines the
+ maximum number of file descriptors. Non-positive values are forbidden.
+ Although numbers greater than 1M are allowed, the virtiofsd documentation
+ states that in this case its set by virtiofsd to the 1M. ( :since:`Since 10.6.0` )
``source``
The resource on the host that is being accessed in the guest. The ``name``
attribute must be used with ``type='template'``, and the ``dir`` attribute
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 32df908d95..6733857a3a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8868,6 +8868,7 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
g_autofree char *queue_size = virXPathString("string(./driver/@queue)", ctxt);
g_autofree char *binary = virXPathString("string(./binary/@path)", ctxt);
g_autofree char *thread_pool_size = virXPathString("string(./binary/thread_pool/@size)", ctxt);
+ g_autofree char *rlimit_nofile = virXPathString("string(./binary/rlimit_nofile/@size)", ctxt);
xmlNodePtr binary_node = virXPathNode("./binary", ctxt);
xmlNodePtr binary_lock_node = virXPathNode("./binary/lock", ctxt);
xmlNodePtr binary_cache_node = virXPathNode("./binary/cache", ctxt);
@@ -8891,6 +8892,14 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt,
goto error;
}
+ if (rlimit_nofile &&
+ virStrToLong_ull(rlimit_nofile, NULL, 10, &def->rlimit_nofile) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("cannot parse rlimit_nofile '%1$s' for virtiofs"),
+ rlimit_nofile);
+ goto error;
+ }
+
if (binary)
def->binary = virFileSanitizePath(binary);
@@ -23415,6 +23424,9 @@ virDomainFSDefFormat(virBuffer *buf,
if (def->thread_pool_size >= 0)
virBufferAsprintf(&binaryBuf, "<thread_pool size='%d'/>\n", def->thread_pool_size);
+ if (def->rlimit_nofile > 0)
+ virBufferAsprintf(&binaryBuf, "<rlimit_nofile size='%lld'/>\n", def->rlimit_nofile);
+
}
virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 0fcc4f1f9b..8283493dfc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -890,6 +890,7 @@ struct _virDomainFSDef {
bool symlinksResolved;
char *binary;
unsigned long long queue_size;
+ unsigned long long rlimit_nofile;
virTristateSwitch xattr;
virDomainFSCacheMode cache;
virTristateSwitch posix_lock;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 2d23fcf123..ab5374d5f0 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -3380,6 +3380,15 @@
</optional>
</element>
</optional>
+ <optional>
+ <element name="rlimit_nofile">
+ <optional>
+ <attribute name="size">
+ <data type="positiveInteger"/>
+ </attribute>
+ </optional>
+ </element>
+ </optional>
</interleave>
</element>
</define>
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args
new file mode 100644
index 0000000000..b4c2e3fe98
--- /dev/null
+++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.args
@@ -0,0 +1,34 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-guest \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/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":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \
+-machine pc,usb=off,dump-guest-core=off,acpi=off \
+-accel kvm \
+-cpu qemu64 \
+-m size=14680064k \
+-overcommit mem-lock=off \
+-smp 2,sockets=2,cores=1,threads=1 \
+-object '{"qom-type":"memory-backend-file","id":"ram-node0","mem-path":"/var/lib/libvirt/qemu/ram/-1-guest/ram-node0","share":true,"size":15032385536}' \
+-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
+-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
+-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 \
+-chardev socket,id=chr-vu-fs0,path=/var/lib/libvirt/qemu/domain--1-guest/fs0-fs.sock \
+-device '{"driver":"vhost-user-fs-pci","id":"fs0","chardev":"chr-vu-fs0","queue-size":1027,"tag":"mount_tag","bus":"pci.0","addr":"0x2"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
new file mode 100644
index 0000000000..2983d3f275
--- /dev/null
+++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.x86_64-latest.xml
@@ -0,0 +1,50 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
+ <memory unit='KiB'>14680064</memory>
+ <currentMemory unit='KiB'>14680064</currentMemory>
+ <memoryBacking>
+ <source type='file'/>
+ <access mode='shared'/>
+ </memoryBacking>
+ <vcpu placement='static'>2</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ <numa>
+ <cell id='0' cpus='0-1' memory='14680064' unit='KiB' memAccess='shared'/>
+ </numa>
+ </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='none'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <filesystem type='mount' accessmode='passthrough'>
+ <driver type='virtiofs' queue='1027'/>
+ <binary xattr='on'>
+ <cache mode='always'/>
+ <sandbox mode='chroot'/>
+ <thread_pool size='16'/>
+ <rlimit_nofile size='122333'/>
+ </binary>
+ <idmap>
+ <uid start='0' target='100000' count='65535'/>
+ <gid start='0' target='100000' count='65535'/>
+ </idmap>
+ <source dir='/path'/>
+ <target dir='mount_tag'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </filesystem>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml
new file mode 100644
index 0000000000..2983d3f275
--- /dev/null
+++ b/tests/qemuxmlconfdata/vhost-user-fs-fd-rlimit.xml
@@ -0,0 +1,50 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
+ <memory unit='KiB'>14680064</memory>
+ <currentMemory unit='KiB'>14680064</currentMemory>
+ <memoryBacking>
+ <source type='file'/>
+ <access mode='shared'/>
+ </memoryBacking>
+ <vcpu placement='static'>2</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <cpu mode='custom' match='exact' check='none'>
+ <model fallback='forbid'>qemu64</model>
+ <numa>
+ <cell id='0' cpus='0-1' memory='14680064' unit='KiB' memAccess='shared'/>
+ </numa>
+ </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='none'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <filesystem type='mount' accessmode='passthrough'>
+ <driver type='virtiofs' queue='1027'/>
+ <binary xattr='on'>
+ <cache mode='always'/>
+ <sandbox mode='chroot'/>
+ <thread_pool size='16'/>
+ <rlimit_nofile size='122333'/>
+ </binary>
+ <idmap>
+ <uid start='0' target='100000' count='65535'/>
+ <gid start='0' target='100000' count='65535'/>
+ </idmap>
+ <source dir='/path'/>
+ <target dir='mount_tag'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </filesystem>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 389d31800b..2aaf6103db 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2814,6 +2814,7 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("launch-security-s390-pv", "s390x");
DO_TEST_CAPS_LATEST("vhost-user-fs-fd-memory");
+ DO_TEST_CAPS_LATEST("vhost-user-fs-fd-rlimit");
DO_TEST_CAPS_LATEST("vhost-user-fs-hugepages");
DO_TEST_CAPS_LATEST_PARSE_ERROR("vhost-user-fs-readonly");
--
2.45.2
3
2
This introduces the new "model" field in sev elements so that clients can
check whether SEV-ES, the 2nd generation of AMD SEV, is available in
the taget hyprvisor. There is the maxESGuests field (along with the maxGuests
field) but this field does not explain whether SEV-ES is actually
enabled in KVM.
Takashi Kajinami (1):
Expose available AMD SEV models in domain capabilities
Changes since v1:
* Fixed one code path where available models are not added
* Fixed missing update of "report" flag
* Updated the documentation to explain the new model field in addition
to the existing but undocumanted cpu0Id field
Takashi Kajinami (1):
Expose available AMD SEV models in domain capabilities
docs/formatdomaincaps.rst | 5 ++
src/conf/domain_capabilities.c | 2 +
src/conf/domain_capabilities.h | 1 +
src/conf/domain_conf.c | 7 +++
src/conf/domain_conf.h | 8 ++++
src/qemu/qemu_capabilities.c | 84 +++++++++++++++++++++++++---------
6 files changed, 85 insertions(+), 22 deletions(-)
--
2.43.0
2
3
Also, update the sync tool with new features introduced in qemu.
Tim Wiederhake (2):
sync_qemu_models_i386.py: Add missing features
cpu_map: Add GraniteRapids CPU model
src/cpu_map/index.xml | 1 +
src/cpu_map/meson.build | 1 +
src/cpu_map/sync_qemu_models_i386.py | 5 +
src/cpu_map/x86_GraniteRapids.xml | 200 ++++++++++++++++++
.../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 1 +
.../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 1 +
tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 1 +
.../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 1 +
.../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 1 +
tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 1 +
.../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 1 +
.../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 1 +
tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 1 +
.../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 1 +
.../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 1 +
tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 1 +
16 files changed, 219 insertions(+)
create mode 100644 src/cpu_map/x86_GraniteRapids.xml
--
2.43.0
2
3
This adds an option to use libcpuinfo [1] as data source for
libvirt's list of x86 cpu features. This is purely optional and
does not change the script's behavior if libcpuinfo is not
installed.
libcpuinfo is a cross-vendor, cross-architecture source for CPU
related information that has the capability to replace libvirt's
dependence on qemu's cpu feature list.
[1] https://gitlab.com/twiederh/libcpuinfo
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
src/cpu_map/libcpuinfo_aliases.xml | 75 +++++++++++++++++++++++++
src/cpu_map/sync_qemu_features_i386.py | 77 +++++++++++++++++++++++---
2 files changed, 145 insertions(+), 7 deletions(-)
create mode 100644 src/cpu_map/libcpuinfo_aliases.xml
diff --git a/src/cpu_map/libcpuinfo_aliases.xml b/src/cpu_map/libcpuinfo_aliases.xml
new file mode 100644
index 0000000000..75d243fead
--- /dev/null
+++ b/src/cpu_map/libcpuinfo_aliases.xml
@@ -0,0 +1,75 @@
+<!--
+ libvirt uses slightly different names for some cpu features than other
+ software does. Install this file into libcpuinfo's alias directory
+ (e.g. /usr/share/libcpuinfo/aliases/libvirt.xml) to have libcpuinfo
+ automatically translate feature names into the names libvirt uses.
+-->
+
+<external_aliases>
+ <external_alias>
+ <type>feature</type>
+ <canonical>pclmulqdq</canonical>
+ <name>pclmuldq</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>ds-cpl</canonical>
+ <name>ds_cpl</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>sse4-1</canonical>
+ <name>sse4.1</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>sse4-2</canonical>
+ <name>sse4.2</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>tsc-adjust</canonical>
+ <name>tsc_adjust</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>lahf-lm</canonical>
+ <name>lahf_lm</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>cmp-legacy</canonical>
+ <name>cmp_legacy</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>nodeid-msr</canonical>
+ <name>nodeid_msr</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>perfctr-core</canonical>
+ <name>perfctr_core</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>perfctr-nb</canonical>
+ <name>perfctr_nb</name>
+ <domain>libvirt</domain>
+ </external_alias>
+ <external_alias>
+ <type>feature</type>
+ <canonical>fxsr-opt</canonical>
+ <name>fxsr_opt</name>
+ <domain>libvirt</domain>
+ </external_alias>
+</external_aliases>
diff --git a/src/cpu_map/sync_qemu_features_i386.py b/src/cpu_map/sync_qemu_features_i386.py
index e4b1f7275a..3b3ad5a643 100755
--- a/src/cpu_map/sync_qemu_features_i386.py
+++ b/src/cpu_map/sync_qemu_features_i386.py
@@ -4,6 +4,11 @@ import argparse
import os
import re
+try:
+ import pycpuinfo
+except ImportError:
+ pycpuinfo = None
+
# features in qemu that we do not want in libvirt
FEATURES_IGNORE = (
@@ -22,6 +27,7 @@ FEATURES_IGNORE = (
"kvm-steal-time",
"kvmclock",
"kvmclock-stable-bit",
+ "kvmclock2",
"xstore",
"xstore-en",
@@ -295,6 +301,53 @@ def add_feature_qemu(query, data):
add_feature_cpuid(eax, ecx, reg, bit, name)
+def add_features_cpuinfo():
+ def decode_bit(value):
+ for i in range(0, 64):
+ if value == (1 << i):
+ return i
+
+ def decode_cpuid(v):
+ if v[0] != 0 and v[1] == 0 and v[2] == 0 and v[3] == 0:
+ reg, val = "eax", v[0]
+ if v[0] == 0 and v[1] != 0 and v[2] == 0 and v[3] == 0:
+ reg, val = "ebx", v[1]
+ if v[0] == 0 and v[1] == 0 and v[2] != 0 and v[3] == 0:
+ reg, val = "ecx", v[2]
+ if v[0] == 0 and v[1] == 0 and v[2] == 0 and v[3] != 0:
+ reg, val = "edx", v[3]
+
+ return reg, decode_bit(val)
+
+ x86 = pycpuinfo.Family.find("x86", "")
+
+ for feature in pycpuinfo.features():
+ if feature.family() != x86:
+ continue
+
+ if list(feature.features()):
+ continue
+
+ name = feature.name("libvirt")
+ if name in FEATURES_IGNORE:
+ continue
+
+ cpuid = feature.extra_x86_cpuid()
+ if cpuid:
+ eax = cpuid[0]
+ ecx = cpuid[1]
+ if ecx == pycpuinfo.x86.CPUINFO_X86_CPUID_ECX_NONE:
+ ecx = None
+ reg, bit = decode_cpuid(cpuid[2:])
+ add_feature_cpuid(eax, ecx, reg, bit, name)
+
+ msr = feature.extra_x86_msr()
+ if msr:
+ index = msr[0]
+ bit = decode_bit(msr[1] | (msr[2] << 32))
+ add_feature_msr(index, bit, name)
+
+
# read the `feature_word_info` struct from qemu's cpu.c into a list of strings
def read_cpu_c(path):
pattern_comment = re.compile("/\\*.*?\\*/")
@@ -450,6 +503,12 @@ def main():
nargs="?",
type=os.path.realpath,
)
+ if pycpuinfo:
+ parser.add_argument(
+ "--libcpuinfo",
+ help="Use libcpuinfo as data source instead",
+ action="store_true",
+ )
parser.add_argument(
"--output",
"-o",
@@ -459,14 +518,18 @@ def main():
)
args = parser.parse_args()
- if not os.path.isdir(args.qemu):
- parser.print_help()
- exit("qemu source directory not found")
+ if pycpuinfo and args.libcpuinfo:
+ add_features_cpuinfo()
+ else:
+ if not os.path.isdir(args.qemu):
+ parser.print_help()
+ exit("qemu source directory not found")
+
+ read_headers(args.qemu)
+ lines = read_cpu_c(args.qemu)
+ parse_feature_words(lines)
+ add_extra_features()
- read_headers(args.qemu)
- lines = read_cpu_c(args.qemu)
- parse_feature_words(lines)
- add_extra_features()
write_output(args.output)
print(
--
2.43.0
2
2
Based on discussion after commit f432114d9c was pushed it was pointed
out that the documentation still mentions the older version.
Fix the documentation to state the new version and introduce ambiguity
for future updates.
Fixes: f432114d9cf507a4047aa9dc1344b1c13356db08
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
Posting this documentation update to document what happened rather than
introduce (almost pointless) complication in adding a config file which
is unlikely to be ever used.
docs/formatstorage.rst | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/docs/formatstorage.rst b/docs/formatstorage.rst
index 86e167d9cb..9d9a4143eb 100644
--- a/docs/formatstorage.rst
+++ b/docs/formatstorage.rst
@@ -700,10 +700,15 @@ host filesystem. It can contain the following child elements:
Encryption <formatstorageencryption.html>`__ page for more information.
``compat``
Specify compatibility level. So far, this is only used for ``type='qcow2'``
- volumes. Valid values are ``0.10`` and ``1.1`` so far, specifying QEMU
- version the images should be compatible with. If the ``feature`` element is
- present, 1.1 is used. :since:`Since 1.1.0` If omitted, 0.10 is used.
- :since:`Since 1.1.2`
+ volumes. Valid values are ``0.10`` (QCOW2 v2) and ``1.1`` (QCOW2 v3) so far.
+ The values were meant to specify QEMU version the images should be compatible
+ with.
+
+ The default, if the ``feature`` element is present is ``1.1``. :since:`Since 1.1.0`
+ If ``feature`` is not present, ``0.10`` was used :since:`Since 1.1.2` and
+ :since:`Since 10.2.0` ``1.1`` is used as it's the default of ``qemu-img``.
+
+ Any tool depending on a specific version should specify this field explicitly.
``nocow``
Turn off COW of the newly created volume. So far, this is only valid for a
file image in btrfs file system. It will improve performance when the file
--
2.44.0
2
1
We are getting close to 10.6.0 release of libvirt. Since I'll be away
from computers next week, I suggest moving the "last week in a month"
freeze a bit and aim for the release on Monday 05 Aug after entering the
freeze on Monday 29 Jul. There will be no RC2 this time.
I hope this works for everyone.
Jirka
1
0
19 Jul '24
In cases when a QEMU process takes longer than the time sigterm and
sigkill are issued to kill the process do not simply fail and leave the
VM in state VIR_DOMAIN_SHUTDOWN until the daemon stops. Instead set up
an fd on /proc/$pid and get notified when the QEMU process finally has
terminated to cleanup the VM state.
Resolves: https://issues.redhat.com/browse/RHEL-28819
Signed-off-by: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
---
src/qemu/qemu_domain.c | 8 +++
src/qemu/qemu_domain.h | 2 +
src/qemu/qemu_driver.c | 18 +++++++
src/qemu/qemu_process.c | 115 ++++++++++++++++++++++++++++++++++++++--
src/qemu/qemu_process.h | 1 +
5 files changed, 139 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2134b11038..8147ff02fd 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1889,6 +1889,11 @@ qemuDomainObjPrivateFree(void *data)
virChrdevFree(priv->devs);
+ if (priv->pidMonitored >= 0) {
+ virEventRemoveHandle(priv->pidMonitored);
+ priv->pidMonitored = -1;
+ }
+
/* This should never be non-NULL if we get here, but just in case... */
if (priv->mon) {
VIR_ERROR(_("Unexpected QEMU monitor still active during domain deletion"));
@@ -1934,6 +1939,8 @@ qemuDomainObjPrivateAlloc(void *opaque)
priv->blockjobs = virHashNew(virObjectUnref);
priv->fds = virHashNew(g_object_unref);
+ priv->pidMonitored = -1;
+
/* agent commands block by default, user can choose different behavior */
priv->agentTimeout = VIR_DOMAIN_AGENT_RESPONSE_TIMEOUT_BLOCK;
priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
@@ -11680,6 +11687,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event)
case QEMU_PROCESS_EVENT_RESET:
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
case QEMU_PROCESS_EVENT_MONITOR_EOF:
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index d777559119..a5092dd7f0 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -119,6 +119,7 @@ struct _qemuDomainObjPrivate {
bool beingDestroyed;
char *pidfile;
+ int pidMonitored;
virDomainPCIAddressSet *pciaddrs;
virDomainUSBAddressSet *usbaddrs;
@@ -469,6 +470,7 @@ typedef enum {
QEMU_PROCESS_EVENT_UNATTENDED_MIGRATION,
QEMU_PROCESS_EVENT_RESET,
QEMU_PROCESS_EVENT_NBDKIT_EXITED,
+ QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9f3013e231..6b1e4084f6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4041,6 +4041,21 @@ processNbdkitExitedEvent(virDomainObj *vm,
}
+static void
+processShutdownCompletedEvent(virQEMUDriver *driver,
+ virDomainObj *vm)
+{
+ if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+ return;
+
+ if (virDomainObjIsActive(vm))
+ qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN,
+ VIR_ASYNC_JOB_NONE, 0);
+
+ virDomainObjEndJob(vm);
+}
+
+
static void qemuProcessEventHandler(void *data, void *opaque)
{
struct qemuProcessEvent *processEvent = data;
@@ -4101,6 +4116,9 @@ static void qemuProcessEventHandler(void *data, void *opaque)
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
processNbdkitExitedEvent(vm, processEvent->data);
break;
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
+ processShutdownCompletedEvent(driver, vm);
+ break;
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 25dfd04272..86ca495a20 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
+#include <sys/syscall.h>
#if defined(__linux__)
# include <linux/capability.h>
#elif defined(__FreeBSD__)
@@ -8387,9 +8388,107 @@ qemuProcessCreatePretendCmdBuild(virDomainObj *vm,
}
+typedef struct {
+ virDomainObj *vm;
+ int pidfd;
+} qemuProcessInShutdownEventData;
+
+
+static qemuProcessInShutdownEventData*
+qemuProcessInShutdownEventDataNew(virDomainObj *vm, int pidfd)
+{
+ qemuProcessInShutdownEventData *d = g_new(qemuProcessInShutdownEventData, 1);
+ d->vm = virObjectRef(vm);
+ d->pidfd = pidfd;
+ return d;
+}
+
+
+static void
+qemuProcessInShutdownEventDataFree(qemuProcessInShutdownEventData *d)
+{
+ virObjectUnref(d->vm);
+ VIR_FORCE_CLOSE(d->pidfd);
+ g_free(d);
+}
+
+
+static void
+qemuProcessInShutdownPidfdCb(int watch,
+ int fd,
+ int events G_GNUC_UNUSED,
+ void *opaque)
+{
+ qemuProcessInShutdownEventData *data = opaque;
+ virDomainObj *vm = data->vm;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld fd=%d",
+ vm, vm->def->name, (long long)vm->pid, fd);
+
+ virEventRemoveHandle(watch);
+
+ virObjectLock(vm);
+
+ VIR_INFO("QEMU process %lld finally completed termination",
+ (long long)vm->pid);
+
+ QEMU_DOMAIN_PRIVATE(vm)->pidMonitored = -1;
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
+ 0, 0, NULL);
+
+ virObjectUnlock(vm);
+}
+
+
+static int
+qemuProcessInShutdownStartMonitor(virDomainObj *vm)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+ qemuProcessInShutdownEventData *data;
+ int pidfd;
+ int ret = -1;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld pidMonitored=%d",
+ vm, vm->def->name, (long long)vm->pid,
+ priv->pidMonitored);
+
+ if (priv->pidMonitored >= 0) {
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i already set up", vm->pid);
+ goto cleanup;
+ }
+
+ pidfd = syscall(SYS_pidfd_open, vm->pid, 0);
+ if (pidfd < 0) {
+ if (errno == ESRCH) /* process has already terminated */
+ ret = 1;
+ goto cleanup;
+ }
+
+ data = qemuProcessInShutdownEventDataNew(vm, pidfd);
+ if ((priv->pidMonitored = virEventAddHandle(pidfd,
+ VIR_EVENT_HANDLE_READABLE,
+ qemuProcessInShutdownPidfdCb,
+ data,
+ (virFreeCallback)qemuProcessInShutdownEventDataFree)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("failed to monitor qemu in-shutdown process %1$i"),
+ vm->pid);
+ qemuProcessInShutdownEventDataFree(data);
+ goto cleanup;
+ }
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i for termination", vm->pid);
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
int
qemuProcessKill(virDomainObj *vm, unsigned int flags)
{
+ int ret = -1;
+
VIR_DEBUG("vm=%p name=%s pid=%lld flags=0x%x",
vm, vm->def->name,
(long long)vm->pid, flags);
@@ -8410,10 +8509,16 @@ qemuProcessKill(virDomainObj *vm, unsigned int flags)
/* Request an extra delay of two seconds per current nhostdevs
* to be safe against stalls by the kernel freeing up the resources */
- return virProcessKillPainfullyDelay(vm->pid,
- !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
- vm->def->nhostdevs * 2,
- false);
+ ret = virProcessKillPainfullyDelay(vm->pid,
+ !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
+ vm->def->nhostdevs * 2,
+ false);
+
+ if (ret < 0 && (flags & VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR))
+ if (qemuProcessInShutdownStartMonitor(vm) == 1)
+ ret = 0; /* process termination detected */
+
+ return ret;
}
@@ -8438,7 +8543,7 @@ qemuProcessBeginStopJob(virDomainObj *vm,
* cleared inside qemuProcessStop */
priv->beingDestroyed = true;
- if (qemuProcessKill(vm, killFlags) < 0)
+ if (qemuProcessKill(vm, killFlags|VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR) < 0)
goto error;
/* Wake up anything waiting on domain condition */
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index cb67bfcd2d..2324aeb7bd 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -180,6 +180,7 @@ typedef enum {
VIR_QEMU_PROCESS_KILL_FORCE = 1 << 0,
VIR_QEMU_PROCESS_KILL_NOWAIT = 1 << 1,
VIR_QEMU_PROCESS_KILL_NOCHECK = 1 << 2, /* bypass the running vm check */
+ VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR = 1 << 3, /* on error enable process monitor */
} virQemuProcessKillMode;
int qemuProcessKill(virDomainObj *vm, unsigned int flags);
--
2.45.0
2
2
19 Jul '24
Since libvirt commit 3ef9b51b10e52886e8fe8d75e36d0714957616b7,
the pflash storage for the os loader file follows its read-only flag,
and qemu tries to open the file for writing if set so.
This patches virt-aa-helper to generate the VM's AppArmor rules
that allow this, using the same domain definition flag and default.
Signed-off-by: Miroslav Los <mirlos(a)cisco.com>
---
src/security/virt-aa-helper.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index 0374581f07..2f57664a4c 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -1001,9 +1001,14 @@ get_files(vahControl * ctl)
if (vah_add_file(&buf, ctl->def->os.slic_table, "r") != 0)
goto cleanup;
- if (ctl->def->os.loader && ctl->def->os.loader->path)
- if (vah_add_file(&buf, ctl->def->os.loader->path, "rk") != 0)
+ if (ctl->def->os.loader && ctl->def->os.loader->path) {
+ bool readonly = false;
+ virTristateBoolToBool(ctl->def->os.loader->readonly, &readonly);
+ if (vah_add_file(&buf,
+ ctl->def->os.loader->path,
+ readonly ? "rk" : "rwk") != 0)
goto cleanup;
+ }
if (ctl->def->os.loader && ctl->def->os.loader->nvram) {
if (storage_source_add_files(ctl->def->os.loader->nvram, &buf, 0) < 0)
--
2.25.1
4
8
libvirt currently exhibits undefined behavior due to pthread mutex misuse,
e.g. destroying a locked mutex or attempting to unlock an already unlocked
mutex.
Add a warning if such a case is detected, so we can start on fixing the
issues.
Tim Wiederhake (2):
virMutex: Warn on error
DO NOT MERGE: virMutex: Fail loudly
src/util/virthread.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
--
2.43.0
3
8
17 Jul '24
In cases when a QEMU process takes longer than the time sigterm and
sigkill are issued to kill the process do not simply fail and leave the
VM in state VIR_DOMAIN_SHUTDOWN until the daemon stops. Instead set up
an fd on /proc/$pid and get notified when the QEMU process finally has
terminated to cleanup the VM state.
Resolves: https://issues.redhat.com/browse/RHEL-28819
Signed-off-by: Boris Fiuczynski <fiuczy(a)linux.ibm.com>
---
src/qemu/qemu_domain.c | 8 +++
src/qemu/qemu_domain.h | 2 +
src/qemu/qemu_driver.c | 18 ++++++
src/qemu/qemu_process.c | 127 ++++++++++++++++++++++++++++++++++++++--
src/qemu/qemu_process.h | 1 +
5 files changed, 151 insertions(+), 5 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2134b11038..96f4e41a11 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1889,6 +1889,11 @@ qemuDomainObjPrivateFree(void *data)
virChrdevFree(priv->devs);
+ if (priv->watchPid >= 0) {
+ virEventRemoveHandle(priv->watchPid);
+ priv->watchPid = -1;
+ }
+
/* This should never be non-NULL if we get here, but just in case... */
if (priv->mon) {
VIR_ERROR(_("Unexpected QEMU monitor still active during domain deletion"));
@@ -1934,6 +1939,8 @@ qemuDomainObjPrivateAlloc(void *opaque)
priv->blockjobs = virHashNew(virObjectUnref);
priv->fds = virHashNew(g_object_unref);
+ priv->watchPid = -1;
+
/* agent commands block by default, user can choose different behavior */
priv->agentTimeout = VIR_DOMAIN_AGENT_RESPONSE_TIMEOUT_BLOCK;
priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
@@ -11680,6 +11687,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event)
case QEMU_PROCESS_EVENT_RESET:
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
case QEMU_PROCESS_EVENT_MONITOR_EOF:
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index d777559119..e5366c6e8c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -119,6 +119,7 @@ struct _qemuDomainObjPrivate {
bool beingDestroyed;
char *pidfile;
+ int watchPid;
virDomainPCIAddressSet *pciaddrs;
virDomainUSBAddressSet *usbaddrs;
@@ -469,6 +470,7 @@ typedef enum {
QEMU_PROCESS_EVENT_UNATTENDED_MIGRATION,
QEMU_PROCESS_EVENT_RESET,
QEMU_PROCESS_EVENT_NBDKIT_EXITED,
+ QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
QEMU_PROCESS_EVENT_LAST
} qemuProcessEventType;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9f3013e231..6b1e4084f6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4041,6 +4041,21 @@ processNbdkitExitedEvent(virDomainObj *vm,
}
+static void
+processShutdownCompletedEvent(virQEMUDriver *driver,
+ virDomainObj *vm)
+{
+ if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+ return;
+
+ if (virDomainObjIsActive(vm))
+ qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN,
+ VIR_ASYNC_JOB_NONE, 0);
+
+ virDomainObjEndJob(vm);
+}
+
+
static void qemuProcessEventHandler(void *data, void *opaque)
{
struct qemuProcessEvent *processEvent = data;
@@ -4101,6 +4116,9 @@ static void qemuProcessEventHandler(void *data, void *opaque)
case QEMU_PROCESS_EVENT_NBDKIT_EXITED:
processNbdkitExitedEvent(vm, processEvent->data);
break;
+ case QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED:
+ processShutdownCompletedEvent(driver, vm);
+ break;
case QEMU_PROCESS_EVENT_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 25dfd04272..d6dbd7ba53 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
+#include <sys/syscall.h>
#if defined(__linux__)
# include <linux/capability.h>
#elif defined(__FreeBSD__)
@@ -8387,9 +8388,119 @@ qemuProcessCreatePretendCmdBuild(virDomainObj *vm,
}
+typedef struct {
+ virDomainObj *vm;
+ int pidfd;
+} qemuProcessInShutdownEventData;
+
+
+static qemuProcessInShutdownEventData*
+qemuProcessInShutdownEventDataNew(virDomainObj *vm, int pidfd)
+{
+ qemuProcessInShutdownEventData *d = g_new(qemuProcessInShutdownEventData, 1);
+ d->vm = virObjectRef(vm);
+ d->pidfd = pidfd;
+ return d;
+}
+
+
+static void
+qemuProcessInShutdownEventDataFree(qemuProcessInShutdownEventData *d)
+{
+ virObjectUnref(d->vm);
+ VIR_FORCE_CLOSE(d->pidfd);
+ g_free(d);
+}
+
+
+static void
+qemuProcessInShutdownStopMonitor(virDomainObj *vm)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld watchPid=%d",
+ vm, vm->def->name, (long long)vm->pid,
+ priv->watchPid);
+
+ virObjectLock(vm);
+ if (priv->watchPid >= 0) {
+ virEventRemoveHandle(priv->watchPid);
+ priv->watchPid = -1;
+ }
+ virObjectUnlock(vm);
+}
+
+
+static void
+qemuProcessInShutdownPidfdCb(int watch G_GNUC_UNUSED,
+ int fd,
+ int events G_GNUC_UNUSED,
+ void *opaque)
+{
+ qemuProcessInShutdownEventData *data = opaque;
+ virDomainObj *vm = data->vm;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld fd=%d",
+ vm, vm->def->name, (long long)vm->pid, fd);
+
+ VIR_DEBUG("QEMU process %lld finally completed termination",
+ (long long)vm->pid);
+ qemuProcessInShutdownStopMonitor(vm);
+
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_SHUTDOWN_COMPLETED,
+ 0, 0, NULL);
+}
+
+
+static int
+qemuProcessInShutdownStartMonitor(virDomainObj *vm)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+ qemuProcessInShutdownEventData *data;
+ int pidfd;
+ int ret = -1;
+
+ VIR_DEBUG("vm=%p name=%s pid=%lld watchPid=%d",
+ vm, vm->def->name, (long long)vm->pid,
+ priv->watchPid);
+
+ if (priv->watchPid >= 0) {
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i already set up", vm->pid);
+ goto cleanup;
+ }
+
+ pidfd = syscall(SYS_pidfd_open, vm->pid, 0);
+ if (pidfd < 0) {
+ if (errno == ESRCH) /* process has already terminated */
+ ret = 1;
+ goto cleanup;
+ }
+
+ data = qemuProcessInShutdownEventDataNew(vm, pidfd);
+ if ((priv->watchPid = virEventAddHandle(pidfd,
+ VIR_EVENT_HANDLE_READABLE,
+ qemuProcessInShutdownPidfdCb,
+ data,
+ (virFreeCallback)qemuProcessInShutdownEventDataFree)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("failed to monitor qemu in-shutdown process %1$i"),
+ vm->pid);
+ qemuProcessInShutdownEventDataFree(data);
+ goto cleanup;
+ }
+ VIR_DEBUG("Monitoring qemu in-shutdown process %i for termination", vm->pid);
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
int
qemuProcessKill(virDomainObj *vm, unsigned int flags)
{
+ int ret = -1;
+
VIR_DEBUG("vm=%p name=%s pid=%lld flags=0x%x",
vm, vm->def->name,
(long long)vm->pid, flags);
@@ -8410,10 +8521,16 @@ qemuProcessKill(virDomainObj *vm, unsigned int flags)
/* Request an extra delay of two seconds per current nhostdevs
* to be safe against stalls by the kernel freeing up the resources */
- return virProcessKillPainfullyDelay(vm->pid,
- !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
- vm->def->nhostdevs * 2,
- false);
+ ret = virProcessKillPainfullyDelay(vm->pid,
+ !!(flags & VIR_QEMU_PROCESS_KILL_FORCE),
+ vm->def->nhostdevs * 2,
+ false);
+
+ if (ret < 0 && (flags & VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR))
+ if (qemuProcessInShutdownStartMonitor(vm) == 1)
+ ret = 0; /* process termination detected */
+
+ return ret;
}
@@ -8438,7 +8555,7 @@ qemuProcessBeginStopJob(virDomainObj *vm,
* cleared inside qemuProcessStop */
priv->beingDestroyed = true;
- if (qemuProcessKill(vm, killFlags) < 0)
+ if (qemuProcessKill(vm, killFlags|VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR) < 0)
goto error;
/* Wake up anything waiting on domain condition */
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index cb67bfcd2d..2324aeb7bd 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -180,6 +180,7 @@ typedef enum {
VIR_QEMU_PROCESS_KILL_FORCE = 1 << 0,
VIR_QEMU_PROCESS_KILL_NOWAIT = 1 << 1,
VIR_QEMU_PROCESS_KILL_NOCHECK = 1 << 2, /* bypass the running vm check */
+ VIR_QEMU_PROCESS_KILL_MONITOR_ON_ERROR = 1 << 3, /* on error enable process monitor */
} virQemuProcessKillMode;
int qemuProcessKill(virDomainObj *vm, unsigned int flags);
--
2.45.0
1
0
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/485
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/qemu/qemu_virtiofs.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/qemu/qemu_virtiofs.c b/src/qemu/qemu_virtiofs.c
index 0e3c7dbb58..703f1226a2 100644
--- a/src/qemu/qemu_virtiofs.c
+++ b/src/qemu/qemu_virtiofs.c
@@ -194,6 +194,9 @@ qemuVirtioFSBuildCommandLine(virQEMUDriverConfig *cfg,
if (fs->thread_pool_size >= 0)
virCommandAddArgFormat(cmd, "--thread-pool-size=%i", fs->thread_pool_size);
+ if (fs->rlimit_nofile > 0)
+ virCommandAddArgFormat(cmd, "--rlimit-nofile=%llu", fs->rlimit_nofile);
+
if (cfg->virtiofsdDebug) {
if (virBitmapIsBitSet(fs->caps, QEMU_VHOST_USER_FS_FEATURE_SEPARATE_OPTIONS))
virCommandAddArgList(cmd, "--log-level", "debug", NULL);
--
2.45.2
2
1
[PATCH] vmx: Be even more lax when trying to comprehend serial ports
by Martin Kletzander 16 Jul '24
by Martin Kletzander 16 Jul '24
16 Jul '24
So much can happen in the fileName field of the VMX that the easiest
thing is to silently report a serial type="null".
This effectively reverts commits de81bdb8d4cd and 62c53db0421a, but
keeps the test files to show the fix is still in place.
There is one instance where an error gets reset, but since that is a
rare case on its own and on top of that does not happen in any of our
long-running daemons with a logfile that might get monitored it should
be fine to leave it there.
Resolves: https://issues.redhat.com/browse/RHEL-32182
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/vmx/vmx.c | 30 +++++++++++++-----------------
1 file changed, 13 insertions(+), 17 deletions(-)
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index e5bc2d793c66..227744d06258 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -2975,9 +2975,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port,
char fileName_name[48] = "";
g_autofree char *fileName = NULL;
- char vspc_name[48] = "";
- g_autofree char *vspc = NULL;
-
char network_endPoint_name[48] = "";
g_autofree char *network_endPoint = NULL;
@@ -3000,7 +2997,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port,
VMX_BUILD_NAME(startConnected);
VMX_BUILD_NAME(fileType);
VMX_BUILD_NAME(fileName);
- VMX_BUILD_NAME(vspc);
VMX_BUILD_NAME_EXTRA(network_endPoint, "network.endPoint");
/* vmx:present */
@@ -3030,10 +3026,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port,
if (virVMXGetConfigString(conf, fileName_name, &fileName, true) < 0)
goto cleanup;
- /* vmx:fileName -> def:data.file.path */
- if (virVMXGetConfigString(conf, vspc_name, &vspc, true) < 0)
- goto cleanup;
-
/* vmx:network.endPoint -> def:data.tcp.listen */
if (virVMXGetConfigString(conf, network_endPoint_name, &network_endPoint,
true) < 0) {
@@ -3065,21 +3057,25 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port,
(*def)->target.port = port;
(*def)->source->type = VIR_DOMAIN_CHR_TYPE_PIPE;
(*def)->source->data.file.path = g_steal_pointer(&fileName);
- } else if (STRCASEEQ(fileType, "network") && (vspc || !fileName || STREQ(fileName, ""))) {
- (*def)->target.port = port;
- (*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL;
} else if (STRCASEEQ(fileType, "network")) {
(*def)->target.port = port;
(*def)->source->type = VIR_DOMAIN_CHR_TYPE_TCP;
- if (!(parsedUri = virURIParse(fileName)))
- goto cleanup;
+ if (!(parsedUri = virURIParse(fileName))) {
+ /*
+ * Ignore anything we cannot parse since there are many variations
+ * that could lead to unusable or non-representable serial ports
+ * which are very commonly seen and the main consumer of this driver
+ * (virt-v2v) ignores them anyway, so let's at least not error out.
+ */
+ virResetLastError();
+ (*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL;
+ return 0;
+ }
if (parsedUri->port == 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("VMX entry '%1$s' doesn't contain a port part"),
- fileName_name);
- goto cleanup;
+ (*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL;
+ return 0;
}
(*def)->source->data.tcp.host = g_strdup(parsedUri->server);
--
2.45.1
2
1
This is supposed to unstuck FreeBSD as it switched to
Python-3.11.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
ci/cirrus/freebsd-13.vars | 2 +-
ci/cirrus/freebsd-14.vars | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/ci/cirrus/freebsd-13.vars b/ci/cirrus/freebsd-13.vars
index 278b5834f6..f24b921300 100644
--- a/ci/cirrus/freebsd-13.vars
+++ b/ci/cirrus/freebsd-13.vars
@@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake'
NINJA='/usr/local/bin/ninja'
PACKAGING_COMMAND='pkg'
PIP3='/usr/local/bin/pip-3.8'
-PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py39-black py39-docutils py39-flake8 py39-pytest python3 qemu readline yajl'
+PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py311-black py311-docutils py311-flake8 py311-pytest python3 qemu readline yajl'
PYPI_PKGS=''
PYTHON='/usr/local/bin/python3'
diff --git a/ci/cirrus/freebsd-14.vars b/ci/cirrus/freebsd-14.vars
index 278b5834f6..f24b921300 100644
--- a/ci/cirrus/freebsd-14.vars
+++ b/ci/cirrus/freebsd-14.vars
@@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake'
NINJA='/usr/local/bin/ninja'
PACKAGING_COMMAND='pkg'
PIP3='/usr/local/bin/pip-3.8'
-PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py39-black py39-docutils py39-flake8 py39-pytest python3 qemu readline yajl'
+PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py311-black py311-docutils py311-flake8 py311-pytest python3 qemu readline yajl'
PYPI_PKGS=''
PYTHON='/usr/local/bin/python3'
--
2.44.2
2
1
Andrea Bolognani (2):
cpu_map: Add pauth Arm CPU feature
tests: Add coverage for pauth Arm CPU feature
src/cpu_map/arm_features.xml | 3 ++
...aarch64-features-pauth.aarch64-latest.args | 31 +++++++++++++++++++
.../aarch64-features-pauth.aarch64-latest.xml | 28 +++++++++++++++++
.../aarch64-features-pauth.xml | 17 ++++++++++
tests/qemuxmlconftest.c | 1 +
5 files changed, 80 insertions(+)
create mode 100644 tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.args
create mode 100644 tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.xml
create mode 100644 tests/qemuxmlconfdata/aarch64-features-pauth.xml
--
2.45.2
2
7
15 Jul '24
User feedback has shown that the examples are not clear enough
to illustrate the cli passthrough concept in action.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
docs/drvqemu.rst | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/docs/drvqemu.rst b/docs/drvqemu.rst
index 1ee4b1e366..e52d9ffd47 100644
--- a/docs/drvqemu.rst
+++ b/docs/drvqemu.rst
@@ -595,8 +595,11 @@ Example:
<emulator>/usr/bin/qemu-system-x86_64</emulator>
</devices>
<qemu:commandline>
- <qemu:arg value='-newarg'/>
- <qemu:env name='QEMU_ENV' value='VAL'/>
+ <qemu:arg value='-device'/>
+ <qemu:arg value='ipmi-bmc-sim,id=bmc0'/>
+ <qemu:arg value='-device'/>
+ <qemu:arg value='smbus-impi,bmc=bmc0'/>
+ <qemu:env name='QEMU_MODULE_DIR' value='/usr/lib64/qemu'/>
</qemu:commandline>
</domain>
--
2.45.1
2
1
[PATCH v3 00/17] hw/sd/sdcard: Accumulation of cleanups and fixes
by Philippe Mathieu-Daudé 11 Jul '24
by Philippe Mathieu-Daudé 11 Jul '24
11 Jul '24
Since v2:
- Tested-by from Cédric recorded
- more patches added :S
Since v1:
- various patches merged, few more added
Various SD card cleanups and fixes accumulated over
the years. Various have been useful to help integrating
eMMC support (which will come later).
Full series for testing:
https://gitlab.com/philmd/qemu/-/tags/emmc-v4
Cédric Le Goater (1):
hw/sd/sdcard: Introduce definitions for EXT_CSD register
Philippe Mathieu-Daudé (16):
hw/sd/sdcard: Deprecate support for spec v1.10
hw/sd/sdcard: Use spec v3.01 by default
hw/sd/sdcard: Track last command used to help logging
hw/sd/sdcard: Trace block offset in READ/WRITE data accesses
hw/sd/sdcard: Trace requested address computed by sd_req_get_address()
hw/sd/sdcard: Do not store vendor data on block drive (CMD56)
hw/sd/sdcard: Send WRITE_PROT bits MSB first (CMD30)
hw/sd/sdcard: Send NUM_WR_BLOCKS bits MSB first (ACMD22)
hw/sd/sdcard: Use READY_FOR_DATA definition instead of magic value
hw/sd/sdcard: Assign SDCardStates enum values
hw/sd/sdcard: Simplify sd_inactive_state handling
hw/sd/sdcard: Restrict SWITCH_FUNCTION to sd_transfer_state (CMD6)
hw/sd/sdcard: Add direct reference to SDProto in SDState
hw/sd/sdcard: Extract sd_blk_len() helper
tests/qtest: Disable npcm7xx_sdhci tests using hardcoded RCA
hw/sd/sdcard: Generate random RCA value
docs/about/deprecated.rst | 6 ++
hw/sd/sdmmc-internal.h | 97 +++++++++++++++++++++
hw/sd/sd.c | 145 ++++++++++++++++++-------------
tests/qtest/npcm7xx_sdhci-test.c | 7 ++
hw/sd/trace-events | 6 +-
5 files changed, 199 insertions(+), 62 deletions(-)
--
2.41.0
4
34
11 Jul '24
Recent commit v10.4.0-87-gd9935a5c4f made a reasonable change to only
reset beingDestroyed back to false when vm->def->id is reset to make
sure other code can detect a domain is (about to become) inactive. It
even added a comment saying any caller of qemuProcessBeginStopJob is
supposed to call qemuProcessStop to clear beingDestroyed. But not every
caller really does so because they first call qemuProcessBeginStopJob
and then check whether a domain is still running. If not the
qemuProcessStop call is skipped leaving beingDestroyed=true. In case of
a persistent domain this may block incoming migrations of such domain as
the migration code would think the domain died unexpectedly (even though
it's still running).
The qemuProcessBeginStopJob function is a wrapper around
virDomainObjBeginJob, but virDomainObjEndJob was used directly for
cleanup. This patch introduces a new qemuProcessEndStopJob wrapper
around virDomainObjEndJob to properly undo everything
qemuProcessBeginStopJob did.
https://issues.redhat.com/browse/RHEL-43309
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_driver.c | 4 ++--
src/qemu/qemu_process.c | 20 ++++++++++++++++----
src/qemu/qemu_process.h | 1 +
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f898d85667..9f3013e231 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2102,7 +2102,7 @@ qemuDomainDestroyFlags(virDomainPtr dom,
endjob:
if (ret == 0)
qemuDomainRemoveInactive(driver, vm, 0, false);
- virDomainObjEndJob(vm);
+ qemuProcessEndStopJob(vm);
cleanup:
virDomainObjEndAPI(&vm);
@@ -3888,7 +3888,7 @@ processMonitorEOFEvent(virQEMUDriver *driver,
endjob:
qemuDomainRemoveInactive(driver, vm, 0, false);
- virDomainObjEndJob(vm);
+ qemuProcessEndStopJob(vm);
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 7cbe521a6e..25dfd04272 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8421,7 +8421,8 @@ qemuProcessKill(virDomainObj *vm, unsigned int flags)
* qemuProcessBeginStopJob:
*
* Stop all current jobs by killing the domain and start a new one for
- * qemuProcessStop.
+ * qemuProcessStop. The caller has to make sure qemuProcessEndStopJob is
+ * called to properly cleanup the job.
*/
int
qemuProcessBeginStopJob(virDomainObj *vm,
@@ -8448,8 +8449,9 @@ qemuProcessBeginStopJob(virDomainObj *vm,
goto error;
/* priv->beingDestroyed is deliberately left set to 'true' here. Caller
- * is supposed to call qemuProcessStop, which will reset it after
- * 'vm->def->id' is set to -1 */
+ * is supposed to call qemuProcessStop (which will reset it after
+ * 'vm->def->id' is set to -1) and/or qemuProcessEndStopJob to do proper
+ * cleanup. */
return 0;
error:
@@ -8458,6 +8460,16 @@ qemuProcessBeginStopJob(virDomainObj *vm,
}
+void
+qemuProcessEndStopJob(virDomainObj *vm)
+{
+ if (!virDomainObjIsActive(vm))
+ QEMU_DOMAIN_PRIVATE(vm)->beingDestroyed = false;
+
+ virDomainObjEndJob(vm);
+}
+
+
void qemuProcessStop(virQEMUDriver *driver,
virDomainObj *vm,
virDomainShutoffReason reason,
@@ -8800,7 +8812,7 @@ qemuProcessAutoDestroy(virDomainObj *dom,
qemuDomainRemoveInactive(driver, dom, 0, false);
- virDomainObjEndJob(dom);
+ qemuProcessEndStopJob(dom);
virObjectEventStateQueue(driver->domainEventState, event);
}
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index c1ea949215..cb67bfcd2d 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -169,6 +169,7 @@ typedef enum {
int qemuProcessBeginStopJob(virDomainObj *vm,
virDomainJob job,
bool forceKill);
+void qemuProcessEndStopJob(virDomainObj *vm);
void qemuProcessStop(virQEMUDriver *driver,
virDomainObj *vm,
virDomainShutoffReason reason,
--
2.45.2
2
1
11 Jul '24
It all started with me looking at the --help output which also
printed "bhyve" as supported hypervisor type. Well, it's not on
my Linux machine. To resolve this, I'm just creating a static
array of { "$driver", callback() } pairs and iterating over it.
The array is then initialized at compile time with supported
drivers.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tools/virt-host-validate.c | 80 +++++++++++++++++++++-----------------
1 file changed, 45 insertions(+), 35 deletions(-)
diff --git a/tools/virt-host-validate.c b/tools/virt-host-validate.c
index 426648a5d3..365b8acd92 100644
--- a/tools/virt-host-validate.c
+++ b/tools/virt-host-validate.c
@@ -29,6 +29,7 @@
#include "internal.h"
#include "virerror.h"
#include "virgettext.h"
+#include "virglibutil.h"
#include "virt-host-validate-common.h"
#if WITH_QEMU
@@ -44,26 +45,58 @@
# include "virt-host-validate-ch.h"
#endif
+typedef struct _virValidateCallbacks virValidateCallbacks;
+struct _virValidateCallbacks {
+ const char *name;
+ int (*callback)(void);
+};
+
+static virValidateCallbacks validateCallbacks[] = {
+#if WITH_QEMU
+ { "qemu", virHostValidateQEMU },
+#endif
+#if WITH_LXC
+ { "lxc", virHostValidateLXC },
+#endif
+#if WITH_BHYVE
+ { "bhyve", virHostValidateBhyve },
+#endif
+#if WITH_CH
+ { "ch", virHostValidateCh },
+#endif
+};
+
static void
show_help(FILE *out, const char *argv0)
{
+ g_autofree char *hvs = NULL;
+ char *hvs_list[G_N_ELEMENTS(validateCallbacks) + 1] = { };
+ size_t i;
+
+ for (i = 0; i < G_N_ELEMENTS(validateCallbacks); i++) {
+ hvs_list[i] = g_strdup_printf(" - %1$s", validateCallbacks[i].name);
+ }
+
+ hvs = g_strjoinv("\n", hvs_list);
+
+ for (i = 0; i < G_N_ELEMENTS(validateCallbacks); i++) {
+ g_free(hvs_list[i]);
+ }
+
fprintf(out,
_("\n"
"syntax: %1$s [OPTIONS] [HVTYPE]\n"
"\n"
" Hypervisor types:\n"
"\n"
- " - qemu\n"
- " - lxc\n"
- " - bhyve\n"
- " - ch\n"
+ "%2$s\n"
"\n"
" Options:\n"
" -h, --help Display command line help\n"
" -v, --version Display command version\n"
" -q, --quiet Don't display progress information\n"
"\n"),
- argv0);
+ argv0, hvs);
}
static void
@@ -87,6 +120,7 @@ main(int argc, char **argv)
int ret = EXIT_SUCCESS;
bool quiet = false;
bool usedHvname = false;
+ size_t i;
if (virGettextInitialize() < 0 ||
virErrorInitialize() < 0) {
@@ -126,37 +160,13 @@ main(int argc, char **argv)
virValidateSetQuiet(quiet);
-#if WITH_QEMU
- if (!hvname || STREQ(hvname, "qemu")) {
- usedHvname = true;
- if (virHostValidateQEMU() < 0)
- ret = EXIT_FAILURE;
+ for (i = 0; i < G_N_ELEMENTS(validateCallbacks); i++) {
+ if (!hvname || STREQ(hvname, validateCallbacks[i].name)) {
+ usedHvname = true;
+ if (validateCallbacks[i].callback() < 0)
+ ret = EXIT_FAILURE;
+ }
}
-#endif
-
-#if WITH_LXC
- if (!hvname || STREQ(hvname, "lxc")) {
- usedHvname = true;
- if (virHostValidateLXC() < 0)
- ret = EXIT_FAILURE;
- }
-#endif
-
-#if WITH_BHYVE
- if (!hvname || STREQ(hvname, "bhyve")) {
- usedHvname = true;
- if (virHostValidateBhyve() < 0)
- ret = EXIT_FAILURE;
- }
-#endif
-
-#if WITH_CH
- if (!hvname || STREQ(hvname, "ch")) {
- usedHvname = true;
- if (virHostValidateCh() < 0)
- ret = EXIT_FAILURE;
- }
-#endif
if (hvname && !usedHvname) {
fprintf(stderr, _("%1$s: unsupported hypervisor name %2$s\n"),
--
2.44.2
2
1
If virt-host-validate is ran on a SEV-SNP capable machine, an
extra "PASS" is printed out. This is because
virHostValidateAMDSev() prints "PASS" and then returns 1
(indicating success) which in turn makes the caller
(virHostValidateSecureGuests()) print "PASS" again. Just drop the
extra printing in the caller and let virHostValidateAMDSev() do
all the printing.
Fixes: 1a8f646f291775d2423ce4e4df62ad69f06ab827
Resolves: https://issues.redhat.com/browse/RHEL-46868
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tools/virt-host-validate-common.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index a29a5b6d5f..86db4815c3 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -488,11 +488,7 @@ int virHostValidateSecureGuests(const char *hvname,
return VIR_VALIDATE_FAILURE(level);
}
} else if (hasAMDSev) {
- int rc = virHostValidateAMDSev(hvname, level);
-
- if (rc > 0)
- virValidatePass();
- return rc;
+ return virHostValidateAMDSev(hvname, level);
}
virValidateFail(level,
--
2.44.2
2
1
Hi,
This is a solution to add support for data transferred by Vfio devices
during the Live Migration in Libvirt.
Currently libvirt only supports a few essential stats like memory
transferred, dirty rate and number of iteration etc. returned as
part of virDomainGetJobStats for each iteration. However it does
not return stats for Vfio devices like data transferred by the
device during the migration
With this change virDomainGetJobStats will be able to support
Vfio stats.
Regards
Kshitij Jha
Kshitij Jha (1):
Include support for Vfio stats during Migration
include/libvirt/libvirt-domain.h | 9 +++++++++
src/qemu/qemu_domainjob.c | 6 ++++++
src/qemu/qemu_monitor.h | 1 +
src/qemu/qemu_monitor_json.c | 12 ++++++++++++
4 files changed, 28 insertions(+)
--
2.22.3
2
2
The "modify" command allows to replace an existing record (its
text value). The primary key is the name of the record. If
duplicity or missing record detected, throw error.
Tests in networkxml2xmlupdatetest.c contain replacements of an
existing DNS-text record and failure due to non-existing record.
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/639
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/conf/network_conf.c | 18 ++++++++-----
.../dns-txt-record-modify-fail.xml | 1 +
.../dns-txt-record-modify-success.xml | 1 +
.../nat-network-dns-txt-modify-ok.xml | 26 +++++++++++++++++++
tests/networkxml2xmlupdatetest.c | 9 +++++++
5 files changed, 49 insertions(+), 6 deletions(-)
create mode 100644 tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml
create mode 100644 tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml
create mode 100644 tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index fc387f9566..dd362b6ab2 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -3351,12 +3351,6 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def,
bool isAdd = (command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST ||
command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST);
- if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("DNS TXT records cannot be modified, only added or deleted"));
- goto cleanup;
- }
-
if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "txt") < 0)
goto cleanup;
@@ -3395,6 +3389,18 @@ virNetworkDefUpdateDNSTxt(virNetworkDef *def,
virNetworkDNSTxtDefClear(&dns->txts[foundIdx]);
VIR_DELETE_ELEMENT(dns->txts, foundIdx, dns->ntxts);
+ } else if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
+
+ if (foundIdx == dns->ntxts) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("couldn't locate a matching DNS TXT record in network %1$s"),
+ def->name);
+ goto cleanup;
+ }
+
+ VIR_FREE(dns->txts[foundIdx].value);
+ dns->txts[foundIdx].value = g_strdup(txt.value);
+
} else {
virNetworkDefUpdateUnknownCommand(command);
goto cleanup;
diff --git a/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml b/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml
new file mode 100644
index 0000000000..75ed475fe1
--- /dev/null
+++ b/tests/networkxml2xmlupdatein/dns-txt-record-modify-fail.xml
@@ -0,0 +1 @@
+<txt name='notexisted' value='modified example'/>
diff --git a/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml b/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml
new file mode 100644
index 0000000000..e16c352253
--- /dev/null
+++ b/tests/networkxml2xmlupdatein/dns-txt-record-modify-success.xml
@@ -0,0 +1 @@
+<txt name='example' value='modified example'/>
diff --git a/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml b/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml
new file mode 100644
index 0000000000..4b4dda094a
--- /dev/null
+++ b/tests/networkxml2xmlupdateout/nat-network-dns-txt-modify-ok.xml
@@ -0,0 +1,26 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+ <forward dev='eth1' mode='nat'>
+ <interface dev='eth1'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0'/>
+ <dns>
+ <txt name='example' value='modified example'/>
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ <dhcp>
+ <range start='192.168.122.2' end='192.168.122.254'/>
+ <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10'/>
+ <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11'/>
+ </dhcp>
+ </ip>
+ <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+ </ip>
+ <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+ </ip>
+ <ip family='ipv4' address='10.24.10.1'>
+ </ip>
+</network>
diff --git a/tests/networkxml2xmlupdatetest.c b/tests/networkxml2xmlupdatetest.c
index 59e6ce98e5..875cede035 100644
--- a/tests/networkxml2xmlupdatetest.c
+++ b/tests/networkxml2xmlupdatetest.c
@@ -306,6 +306,15 @@ mymain(void)
"dns-txt-record-snowman",
"nat-network-dns-txt-record",
VIR_NETWORK_UPDATE_COMMAND_DELETE);
+ DO_TEST("modify-dns-txt-record",
+ "dns-txt-record-modify-success",
+ "nat-network-dns-txt-record",
+ "nat-network-dns-txt-modify-ok",
+ VIR_NETWORK_UPDATE_COMMAND_MODIFY);
+ DO_TEST_FAIL("modify-missing-dns-txt-record",
+ "dns-txt-record-modify-fail",
+ "nat-network-dns-txt-record",
+ VIR_NETWORK_UPDATE_COMMAND_MODIFY);
section = VIR_NETWORK_SECTION_DNS_SRV;
--
2.45.2
2
1
The "modify" command allows you to replace an existing record
(its hostname, sub-elements). IP address acts as the primary key.
If it is not found, the attempt ends with an error message. If
the XML contains a duplicate address, it will select the last
one.
Tests in networkxml2xmlupdatetest.c contain replacements of an
existing DNS-Host record and failure due to non-existing record.
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/639
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/conf/network_conf.c | 28 ++++++++++++++-----
.../dns-host-modify-not-existing.xml | 4 +++
.../dns-host-modify.xml | 5 ++++
.../nat-network-dns-hosts-modified.xml | 28 +++++++++++++++++++
tests/networkxml2xmlupdatetest.c | 9 ++++++
5 files changed, 67 insertions(+), 7 deletions(-)
create mode 100644 tests/networkxml2xmlupdatein/dns-host-modify-not-existing.xml
create mode 100644 tests/networkxml2xmlupdatein/dns-host-modify.xml
create mode 100644 tests/networkxml2xmlupdateout/nat-network-dns-hosts-modified.xml
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index f5ccf4bd12..2a541cd5b0 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -3138,19 +3138,13 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def,
unsigned int fflags G_GNUC_UNUSED)
{
size_t i, j, k;
- int foundIdx = -1, ret = -1;
+ int foundIdx = -1, ret = -1, foundIdxModify = -1;
virNetworkDNSDef *dns = &def->dns;
virNetworkDNSHostDef host = { 0 };
bool isAdd = (command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST ||
command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST);
int foundCt = 0;
- if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("DNS HOST records cannot be modified, only added or deleted"));
- goto cleanup;
- }
-
if (virNetworkDefUpdateCheckElementName(def, ctxt->node, "host") < 0)
goto cleanup;
@@ -3163,6 +3157,12 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def,
if (virSocketAddrEqual(&host.ip, &dns->hosts[i].ip))
foundThisTime = true;
+ /* modify option required index of matching ip-address, the loop under
+ * this comment could affect results of found index foundThisTime,
+ * so the foundIdxModify is there used instead */
+ if (foundThisTime)
+ foundIdxModify = i;
+
/* when adding we want to only check duplicates of address since having
* multiple addresses with the same hostname is a legitimate configuration */
if (!isAdd) {
@@ -3213,6 +3213,20 @@ virNetworkDefUpdateDNSHost(virNetworkDef *def,
virNetworkDNSHostDefClear(&dns->hosts[foundIdx]);
VIR_DELETE_ELEMENT(dns->hosts, foundIdx, dns->nhosts);
+ } else if (command == VIR_NETWORK_UPDATE_COMMAND_MODIFY) {
+
+ if (foundCt == 0) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("couldn't locate a matching DNS HOST record in network %1$s"),
+ def->name);
+ goto cleanup;
+ }
+
+ virNetworkDNSHostDefClear(&dns->hosts[foundIdxModify]);
+
+ memcpy(&dns->hosts[foundIdxModify], &host, sizeof(virNetworkDNSHostDef));
+ memset(&host, 0, sizeof(virNetworkDNSHostDef));
+
} else {
virNetworkDefUpdateUnknownCommand(command);
goto cleanup;
diff --git a/tests/networkxml2xmlupdatein/dns-host-modify-not-existing.xml b/tests/networkxml2xmlupdatein/dns-host-modify-not-existing.xml
new file mode 100644
index 0000000000..357fccd110
--- /dev/null
+++ b/tests/networkxml2xmlupdatein/dns-host-modify-not-existing.xml
@@ -0,0 +1,4 @@
+<host ip='192.168.122.333'>
+ <hostname>shared</hostname>
+ <hostname>names</hostname>
+</host>
diff --git a/tests/networkxml2xmlupdatein/dns-host-modify.xml b/tests/networkxml2xmlupdatein/dns-host-modify.xml
new file mode 100644
index 0000000000..78b9fd88a6
--- /dev/null
+++ b/tests/networkxml2xmlupdatein/dns-host-modify.xml
@@ -0,0 +1,5 @@
+<host ip='192.168.122.2'>
+ <hostname>Another</hostname>
+ <hostname>decent</hostname>
+ <hostname>names</hostname>
+</host>
diff --git a/tests/networkxml2xmlupdateout/nat-network-dns-hosts-modified.xml b/tests/networkxml2xmlupdateout/nat-network-dns-hosts-modified.xml
new file mode 100644
index 0000000000..8fcaad15d1
--- /dev/null
+++ b/tests/networkxml2xmlupdateout/nat-network-dns-hosts-modified.xml
@@ -0,0 +1,28 @@
+<network>
+ <name>default</name>
+ <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9c</uuid>
+ <forward dev='eth0' mode='nat'>
+ <interface dev='eth0'/>
+ </forward>
+ <bridge name='virbr0' stp='on' delay='0'/>
+ <dns forwardPlainNames='no'>
+ <host ip='192.168.122.122'>
+ <hostname>pudding</hostname>
+ </host>
+ <host ip='192.168.122.1'>
+ <hostname>host</hostname>
+ <hostname>gateway</hostname>
+ </host>
+ <host ip='192.168.122.2'>
+ <hostname>Another</hostname>
+ <hostname>decent</hostname>
+ <hostname>names</hostname>
+ </host>
+ <host ip='fd8f:1391:3a82:150::c0a8:9603'>
+ <hostname>shared</hostname>
+ <hostname>names</hostname>
+ </host>
+ </dns>
+ <ip address='192.168.122.1' netmask='255.255.255.0'>
+ </ip>
+</network>
diff --git a/tests/networkxml2xmlupdatetest.c b/tests/networkxml2xmlupdatetest.c
index afe2b1f574..383cbf85ce 100644
--- a/tests/networkxml2xmlupdatetest.c
+++ b/tests/networkxml2xmlupdatetest.c
@@ -276,6 +276,15 @@ mymain(void)
"nat-network-dns-hosts",
"nat-network-no-hosts",
VIR_NETWORK_UPDATE_COMMAND_DELETE);
+ DO_TEST("modify-dns-host",
+ "dns-host-modify",
+ "nat-network-dns-hosts",
+ "nat-network-dns-hosts-modified",
+ VIR_NETWORK_UPDATE_COMMAND_MODIFY);
+ DO_TEST_FAIL("modify-dns-host-not-existing",
+ "dns-host-modify-not-existing",
+ "nat-network-dns-hosts",
+ VIR_NETWORK_UPDATE_COMMAND_MODIFY);
section = VIR_NETWORK_SECTION_DNS_TXT;
--
2.45.2
2
1
The outdated comment refers to a non-existent member in the
virDomainObj structure.
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/conf/domain_conf.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7033b4e9fe..115862bbde 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -4449,7 +4449,7 @@ virDomainObjGetDefs(virDomainObj *vm,
* @live: set to true if live config was returned (may be omitted)
*
* Helper function to resolve @flags and return the correct domain pointer
- * object. This function returns one of @vm->def or @vm->persistentDef
+ * object. This function returns one of @vm->def or @vm->newDef
* according to @flags. @live is set to true if the live vm config will be
* returned. This helper should be used only in APIs that guarantee
* that @flags contains exactly one of VIR_DOMAIN_AFFECT_LIVE or
@@ -4489,7 +4489,7 @@ virDomainObjGetOneDefState(virDomainObj *vm,
* @flags: for virDomainModificationImpact
*
* Helper function to resolve @flags and return the correct domain pointer
- * object. This function returns one of @vm->def or @vm->persistentDef
+ * object. This function returns one of @vm->def or @vm->newDef
* according to @flags. This helper should be used only in APIs that guarantee
* that @flags contains exactly one of VIR_DOMAIN_AFFECT_LIVE or
* VIR_DOMAIN_AFFECT_CONFIG and not both.
--
2.45.2
2
1
When generating paths for a domain specific AppArmor profile each
path undergoes a validation where it's matched against an array
of well known prefixes (among other things). Now, for
OVMF/AAVMF/... images we have a list and some entries have
comments to which type of image the entry belongs to. For
instance:
"/usr/share/OVMF/", /* for OVMF images */
"/usr/share/AAVMF/", /* for AAVMF images */
But these comments are pretty useless. The path itself already
gives away the image type. Drop them.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/security/virt-aa-helper.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index a3f85d26b0..c1e89dc6cf 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -475,15 +475,15 @@ valid_path(const char *path, const bool readonly)
"/initrd",
"/initrd.img",
"/usr/share/edk2/",
- "/usr/share/edk2-ovmf/", /* for OVMF images */
- "/usr/share/OVMF/", /* for OVMF images */
- "/usr/share/ovmf/", /* for OVMF images */
- "/usr/share/AAVMF/", /* for AAVMF images */
+ "/usr/share/edk2-ovmf/",
+ "/usr/share/OVMF/",
+ "/usr/share/ovmf/",
+ "/usr/share/AAVMF/",
"/usr/share/qemu-efi/", /* for AAVMF images */
- "/usr/share/qemu-efi-aarch64/", /* for AAVMF images */
+ "/usr/share/qemu-efi-aarch64/",
"/usr/share/qemu/", /* SUSE path for OVMF and AAVMF images */
- "/usr/lib/u-boot/", /* u-boot loaders for qemu */
- "/usr/lib/riscv64-linux-gnu/opensbi" /* RISC-V SBI implementation */
+ "/usr/lib/u-boot/",
+ "/usr/lib/riscv64-linux-gnu/opensbi",
};
/* override the above with these */
const char * const override[] = {
--
2.44.2
2
1
[libvirt PATCHv2 0/5] qemu: do not use deprecated options for new virtiofsd (virtiofs epopee)
by Ján Tomko 09 Jul '24
by Ján Tomko 09 Jul '24
09 Jul '24
Also, allow migration if we think we can.
Ján Tomko (5):
tests: vhostuser: add virtiofsd json descriptor
tests: qemuxmlconf: adjust test case to new virtiofsd
qemu: fill capabilities for virtiofsd
qemu: do not use deprecated options for new virtiofsd
qemu: migration: allow migration for virtiofs
src/conf/domain_conf.h | 1 +
src/qemu/qemu_migration.c | 9 +-
src/qemu/qemu_vhost_user.c | 60 ++++++++++++
src/qemu/qemu_vhost_user.h | 12 +++
src/qemu/qemu_virtiofs.c | 92 +++++++++++++------
.../libexec/qemu/vhost-user/test-virtiofsd | 10 ++
.../qemu/vhost-user/50-qemu-virtiofsd.json | 5 +
tests/qemuvhostusertest.c | 1 +
.../vhost-user-fs-fd-memory.xml | 3 +-
9 files changed, 161 insertions(+), 32 deletions(-)
create mode 100755 tests/qemuvhostuserdata/usr/libexec/qemu/vhost-user/test-virtiofsd
create mode 100644 tests/qemuvhostuserdata/usr/share/qemu/vhost-user/50-qemu-virtiofsd.json
--
2.45.2
2
7
[PATCH v3 0/2] security_manager: Fix security manager deadlock after libvirtd fork()
by hongmianquan 09 Jul '24
by hongmianquan 09 Jul '24
09 Jul '24
We have the stack security driver, which internally manages other security drivers,
just call them "top" and "nested".
We call virSecurityStackPreFork() to lock the top one, and it also locks
and then unlocks the nested drivers prior to fork. Then in qemuSecurityPostFork(),
it unlocks the top one, but not the nested ones. Thus, if one of the nested
drivers ("dac" or "selinux") is still locked, it will cause a deadlock. If we always
surround nested locks with top lock, it is always secure. Because we have got top lock
before fork child libvirtd.
However, it is not always the case in the current code, We discovered this case:
the nested list obtained through the qemuSecurityGetNested() will be locked directly
for subsequent use, such as in virQEMUDriverCreateCapabilities(), where the nested list
is locked using qemuSecurityGetDOI, but the top one is not locked beforehand.
The problem stack is as follows:
libvirtd thread1 libvirtd thread2 child libvirtd
| | |
| | |
virsh capabilities qemuProcessLanuch |
| | |
| lock top |
| | |
lock nested | |
| | |
| fork------------------->|(nested lock held by thread1)
| | |
| | |
unlock nested unlock top unlock top
|
|
qemuSecuritySetSocketLabel
|
|
lock nested (deadlock)
v3 changes:
Made modifications based on Michal's comments
- ensured matching qemuSecurityStackLock() and qemuSecurityStackUnlock()
- modify the correct order in libvirt_private.syms
- split the code streamlining part into a separate patch
hongmianquan (2):
security_manager: Ensure top lock is acquired before nested locks
security_manager: Remove redundant qemuSecurityGetNested() call
src/libvirt_private.syms | 2 ++
src/qemu/qemu_conf.c | 13 +++++++++++--
src/qemu/qemu_driver.c | 21 +++++++++++++--------
src/qemu/qemu_security.h | 2 ++
src/security/security_manager.c | 22 ++++++++++++++++++++++
src/security/security_manager.h | 2 ++
6 files changed, 52 insertions(+), 10 deletions(-)
--
2.20.1
3
5
[PATCH 0/1] qemuDomainChangeNet: check virtio options for non-virtio models
by Miroslav Los 09 Jul '24
by Miroslav Los 09 Jul '24
09 Jul '24
Hi,
in our project, we create all of our domain interfaces regardless of model
with a <driver><host csum='off'/></driver>. The documentation is not clear
as to which models support offloading or not, and the domain validates.
In libvirtd, since <driver> is present, this causes each network device
to have its virDomainVirtioOptions *virtio to be non-NULL, with all members
ABSENT, which is also deemed valid.
However, clients receive the interface elements without the driver. When
the modified value is sent back via updateDeviceFlags, the candidate's
virtio attribute is thus NULL.
The validation in qemuDomainChangeNet requires both structs to be equal
or both NULL, which is violated by such a request. This can be seen also
with how virsh domif-setlink operates:
virsh # domiflist 5
Interface Type Source Model MAC
--------------------------------------------------------
- udp - e1000 52:54:00:1c:10:42
- udp - e1000 52:54:00:09:29:9c
- udp - e1000 52:54:00:1d:a6:8d
- udp - e1000 52:54:00:07:4a:83
52:54:00:1c:10:42 up
virsh # domif-setlink 5 52:54:00:1c:10:42 down
error: Failed to update interface link state
error: Operation not supported: cannot modify virtio network device driver options
A workaround is to add an empty <driver> in the update request, which works
until libvirt is restarted. The driver element on a non-virtio interface is not
present when the domain is reloaded, thus the pointer is NULL in olddev, causing
the inverse issue and same error.
Our current workaround is to retry with the empty driver element only if the first
call fails, but we think libvirt should handle this struct more consistently.
This patch expands the check to the non-virtio case, where the olddev is assumed
to be valid, and newdev's virtio options are validated to be NULL or all-ABSENT.
Since the driver element is normally preserved for virtio models, the stricter
equality condition is left unchanged in that case.
I did not investigate further if the discrepancy between NULL and all-ABSENT values
for virDomainVirtioOptions can cause a problem elsewhere, or in other device kinds.
Though I do wonder if the options handling should be improved.
One possibility is that non-virtio devices keep the value NULL, e.g. after
validating that the driver element does not contain any of the options, whereas
virtio devices always create the struct even with no driver element present on input.
Another option is that NULL pointer is treated the same as all-ABSENT struct, e.g.
in virDomainCheckVirtioOptionsAreAbsent and virDomainVirtioOptionsCheckABIStability;
the former does that while the latter does not. These functions would also need
to become callable from the qemu driver.
Miroslav Los (1):
qemuDomainChangeNet: check virtio options for non-virtio models
src/qemu/qemu_hotplug.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
--
2.25.1
2
2
09 Jul '24
When binary version of edk2 is distributed, the files reside
under /usr/share/edk2-ovmf as can be seen from Gentoo's ebuild
[1]. Allow virt-aa-helper to generate paths under that dir.
1: https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-firmware/edk2-ovmf-bin/e…
Resolves: https://bugs.gentoo.org/911786
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/security/virt-aa-helper.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index 402cbd9602..076b98a1d7 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -475,6 +475,7 @@ valid_path(const char *path, const bool readonly)
"/initrd",
"/initrd.img",
"/usr/share/edk2/",
+ "/usr/share/edk2-ovmf/",
"/usr/share/OVMF/", /* for OVMF images */
"/usr/share/ovmf/", /* for OVMF images */
"/usr/share/AAVMF/", /* for AAVMF images */
--
2.44.2
3
2
Andrea Bolognani (6):
tests: Update firmware descriptors
tests: Add more firmware selection coverage
qemu: Filter firmware images by type
qemu: ROM firmware images are always readonly
tests: Add firmware descriptor for edk2 on riscv64
tests: Add test for UEFI autoselection on riscv64
src/qemu/qemu_firmware.c | 17 +++++++++
.../qemu_5.2.0-tcg-virt.riscv64.xml | 4 ++-
.../qemu_5.2.0-virt.riscv64.xml | 4 ++-
.../qemu_8.0.0-tcg-virt.riscv64.xml | 4 ++-
.../qemu_8.0.0-virt.riscv64.xml | 4 ++-
.../firmware/60-edk2-ovmf-x64-inteltdx.json | 10 +++---
.../qemu/firmware/50-edk2-riscv-qcow2.json | 33 +++++++++++++++++
.../firmware/60-edk2-ovmf-x64-inteltdx.json | 10 +++---
tests/qemufirmwaretest.c | 7 +++-
...efi-riscv64.riscv64-latest.abi-update.args | 34 ++++++++++++++++++
...-efi-riscv64.riscv64-latest.abi-update.xml | 28 +++++++++++++++
.../firmware-auto-efi-riscv64.xml | 14 ++++++++
...ware-auto-efi-rw-pflash.x86_64-latest.err} | 0
...mware-auto-efi-rw-pflash.x86_64-latest.xml | 35 +++++++++++++++++++
.../firmware-auto-efi-rw-pflash.xml | 18 ++++++++++
tests/qemuxmlconftest.c | 3 +-
16 files changed, 207 insertions(+), 18 deletions(-)
create mode 100644 tests/qemufirmwaredata/usr/share/qemu/firmware/50-edk2-riscv-qcow2.json
create mode 100644 tests/qemuxmlconfdata/firmware-auto-efi-riscv64.riscv64-latest.abi-update.args
create mode 100644 tests/qemuxmlconfdata/firmware-auto-efi-riscv64.riscv64-latest.abi-update.xml
create mode 100644 tests/qemuxmlconfdata/firmware-auto-efi-riscv64.xml
rename tests/qemuxmlconfdata/{firmware-auto-efi-rw.x86_64-latest.abi-update.err => firmware-auto-efi-rw-pflash.x86_64-latest.err} (100%)
create mode 100644 tests/qemuxmlconfdata/firmware-auto-efi-rw-pflash.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/firmware-auto-efi-rw-pflash.xml
--
2.45.2
2
7
[PATCH] vmx: Do not require all ID data for VMWare Distributed Switch
by Martin Kletzander 08 Jul '24
by Martin Kletzander 08 Jul '24
08 Jul '24
Similarly to commit 2482801608b8 we can safely ignore connectionId,
portId and portgroupId in both XML and VMX as they are only a blind
pass-through between XML and VMX and an ethernet without such parameters
was spotted in the wild. On top of that even our documentation says the
whole VMWare Distrubuted Switch configuration is a best-effort.
Resolves: https://issues.redhat.com/browse/RHEL-46099
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/conf/domain_conf.c | 11 ++++-----
src/conf/schemas/domaincommon.rng | 24 ++++++++++++-------
src/vmx/vmx.c | 24 ++++++++++++-------
...-portid.vmx => ethernet-vds-no-params.vmx} | 2 --
...-portid.xml => ethernet-vds-no-params.xml} | 2 +-
5 files changed, 37 insertions(+), 26 deletions(-)
rename tests/vmx2xmldata/{ethernet-vds-no-portid.vmx => ethernet-vds-no-params.vmx} (76%)
rename tests/vmx2xmldata/{ethernet-vds-no-portid.xml => ethernet-vds-no-params.xml} (82%)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6080f4f90a54..bfef89e1beae 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9593,15 +9593,14 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
def->data.vds.switch_id) < 0)
return NULL;
- if (virXMLPropLongLong(source_node, "portid", 0, VIR_XML_PROP_REQUIRED,
- &def->data.vds.port_id, def->data.vds.port_id) < 0)
+ if (virXMLPropLongLong(source_node, "portid", 0, VIR_XML_PROP_NONE,
+ &def->data.vds.port_id, 0) < 0)
return NULL;
- if (!(def->data.vds.portgroup_id = virXMLPropStringRequired(source_node, "portgroupid")))
- return NULL;
+ def->data.vds.portgroup_id = virXMLPropString(source_node, "portgroupid");
- if (virXMLPropLongLong(source_node, "connectionid", 0, VIR_XML_PROP_REQUIRED,
- &def->data.vds.connection_id, def->data.vds.connection_id) < 0)
+ if (virXMLPropLongLong(source_node, "connectionid", 0, VIR_XML_PROP_NONE,
+ &def->data.vds.connection_id, 0) < 0)
return NULL;
break;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index b163e4eece09..2d23fcf12375 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -3684,15 +3684,21 @@
<attribute name="switchid">
<ref name="UUID"/>
</attribute>
- <attribute name="portid">
- <data type="long"/>
- </attribute>
- <attribute name="portgroupid">
- <data type="string"/>
- </attribute>
- <attribute name="connectionid">
- <data type="long"/>
- </attribute>
+ <optional>
+ <attribute name="portid">
+ <data type="long"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="portgroupid">
+ <data type="string"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="connectionid">
+ <data type="long"/>
+ </attribute>
+ </optional>
</element>
<ref name="interface-options"/>
</interleave>
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index d082a0766010..e5bc2d793c66 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -2896,7 +2896,7 @@ virVMXParseEthernet(virConf *conf, int controller, virDomainNetDef **def)
if (virVMXGetConfigString(conf,
portgroupId_name,
&(*def)->data.vds.portgroup_id,
- false) < 0 ||
+ true) < 0 ||
virVMXGetConfigLong(conf,
portId_name,
&(*def)->data.vds.port_id,
@@ -2906,7 +2906,7 @@ virVMXParseEthernet(virConf *conf, int controller, virDomainNetDef **def)
connectionId_name,
&(*def)->data.vds.connection_id,
0,
- false) < 0)
+ true) < 0)
goto cleanup;
} else if (connectionType == NULL && networkName == NULL) {
(*def)->type = VIR_DOMAIN_NET_TYPE_NULL;
@@ -4038,14 +4038,22 @@ virVMXFormatEthernet(virDomainNetDef *def, int controller,
uuid[5], uuid[6], uuid[7], uuid[8], uuid[9], uuid[10],
uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
- virBufferAsprintf(buffer, "ethernet%d.dvs.portId = \"%lld\"\n",
- controller, def->data.vds.port_id);
+ if (def->data.vds.port_id) {
+ virBufferAsprintf(buffer, "ethernet%d.dvs.portId = \"%lld\"\n",
+ controller, def->data.vds.port_id);
+ }
+
+ if (def->data.vds.portgroup_id) {
+ virBufferAsprintf(buffer, "ethernet%d.dvs.", controller);
+ virBufferEscapeString(buffer, "portgroupId = \"%s\"\n",
+ def->data.vds.portgroup_id);
+ }
- virBufferAsprintf(buffer, "ethernet%d.dvs.", controller);
- virBufferEscapeString(buffer, "portgroupId = \"%s\"\n", def->data.vds.portgroup_id);
+ if (def->data.vds.connection_id) {
+ virBufferAsprintf(buffer, "ethernet%d.dvs.connectionId = \"%lld\"\n",
+ controller, def->data.vds.connection_id);
+ }
- virBufferAsprintf(buffer, "ethernet%d.dvs.connectionId = \"%lld\"\n",
- controller, def->data.vds.connection_id);
break;
}
diff --git a/tests/vmx2xmldata/ethernet-vds-no-portid.vmx b/tests/vmx2xmldata/ethernet-vds-no-params.vmx
similarity index 76%
rename from tests/vmx2xmldata/ethernet-vds-no-portid.vmx
rename to tests/vmx2xmldata/ethernet-vds-no-params.vmx
index 7761accb3abc..90afbdac30cd 100644
--- a/tests/vmx2xmldata/ethernet-vds-no-portid.vmx
+++ b/tests/vmx2xmldata/ethernet-vds-no-params.vmx
@@ -5,6 +5,4 @@ ethernet0.virtualDev = "e1000e"
ethernet0.addressType = "vpx"
ethernet0.generatedAddress = "00:50:56:87:65:43"
ethernet0.dvs.switchId = "50 34 26 b2 94 e9 3b 16-1d 68 87 bf ff 4a 54 40"
-ethernet0.dvs.portgroupId = "dvportgroup-1285"
-ethernet0.dvs.connectionId = "408217997"
displayName = "test"
diff --git a/tests/vmx2xmldata/ethernet-vds-no-portid.xml b/tests/vmx2xmldata/ethernet-vds-no-params.xml
similarity index 82%
rename from tests/vmx2xmldata/ethernet-vds-no-portid.xml
rename to tests/vmx2xmldata/ethernet-vds-no-params.xml
index 60fd9c99feb9..0011ba471a50 100644
--- a/tests/vmx2xmldata/ethernet-vds-no-portid.xml
+++ b/tests/vmx2xmldata/ethernet-vds-no-params.xml
@@ -14,7 +14,7 @@
<devices>
<interface type='vds'>
<mac address='00:50:56:87:65:43' type='generated'/>
- <source switchid='503426b2-94e9-3b16-1d68-87bfff4a5440' portid='0' portgroupid='dvportgroup-1285' connectionid='408217997'/>
+ <source switchid='503426b2-94e9-3b16-1d68-87bfff4a5440'/>
<model type='e1000e'/>
</interface>
<video>
--
2.45.1
2
1
[PATCH] test_driver: support VIR_DOMAIN_AFFECT_LIVE in testUpdateDeviceFlags()
by John Levon 04 Jul '24
by John Levon 04 Jul '24
04 Jul '24
Pick up some more of the qemu_driver.c code so this function supports
both CONFIG and LIVE updates.
Note that qemuDomainUpdateDeviceFlags() passed vm->def to
virDomainDeviceDefParse() for the VIR_DOMAIN_AFFECT_CONFIG case, which
is technically incorrect; in the test driver code we'll fix this.
Signed-off-by: John Levon <john.levon(a)nutanix.com>
---
src/test/test_driver.c | 54 +++++++++++++++++++++++++++++-------------
1 file changed, 37 insertions(+), 17 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 712bb20563..da682da9ad 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -10239,10 +10239,10 @@ testDomainAttachDevice(virDomainPtr domain, const char *xml)
static int
-testDomainUpdateDeviceConfig(virDomainDef *vmdef,
- virDomainDeviceDef *dev,
- unsigned int parse_flags,
- virDomainXMLOption *xmlopt)
+testDomainUpdateDevice(virDomainDef *vmdef,
+ virDomainDeviceDef *dev,
+ unsigned int parse_flags,
+ virDomainXMLOption *xmlopt)
{
virDomainDiskDef *newDisk;
virDomainDeviceDef oldDev = { .type = dev->type };
@@ -10316,12 +10316,16 @@ testDomainUpdateDeviceFlags(virDomainPtr dom,
testDriver *driver = dom->conn->privateData;
virDomainObj *vm = NULL;
virObjectEvent *event = NULL;
+ virDomainDef *def = NULL;
+ virDomainDef *persistentDef = NULL;
g_autoptr(virDomainDef) vmdef = NULL;
- g_autoptr(virDomainDeviceDef) dev = NULL;
+ g_autoptr(virDomainDeviceDef) dev_live = NULL;
+ g_autoptr(virDomainDeviceDef) dev_config = NULL;
int ret = -1;
unsigned int parse_flags = 0;
- virCheckFlags(VIR_DOMAIN_AFFECT_CONFIG, -1);
+ virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+ VIR_DOMAIN_AFFECT_CONFIG, -1);
if (!(vm = testDomObjFromDomain(dom)))
goto cleanup;
@@ -10337,9 +10341,24 @@ testDomainUpdateDeviceFlags(virDomainPtr dom,
parse_flags |= VIR_DOMAIN_DEF_PARSE_INACTIVE;
}
- if (!(dev = virDomainDeviceDefParse(xml, vm->def, driver->xmlopt,
- NULL, parse_flags))) {
- goto endjob;
+ /*
+ * NB: this has diverged from qemuDomainUpdateDeviceFlags(), which uses
+ * vm->def in both cases; technically the qemu driver should do the same.
+ */
+ if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
+ goto cleanup;
+
+ if (def) {
+ if (!(dev_live = virDomainDeviceDefParse(xml, def, driver->xmlopt,
+ NULL, parse_flags)))
+ goto endjob;
+ }
+
+ if (persistentDef) {
+ if (!(dev_config = virDomainDeviceDefParse(xml, persistentDef,
+ driver->xmlopt, NULL,
+ parse_flags)))
+ goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
@@ -10350,18 +10369,19 @@ testDomainUpdateDeviceFlags(virDomainPtr dom,
/* virDomainDefCompatibleDevice call is delayed until we know the
* device we're going to update. */
- if ((ret = testDomainUpdateDeviceConfig(vmdef, dev,
- parse_flags,
- driver->xmlopt)) < 0)
+ if ((ret = testDomainUpdateDevice(vmdef, dev_config,
+ parse_flags,
+ driver->xmlopt)) < 0)
goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- ret = -1;
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("live update of device '%1$s' is not supported"),
- virDomainDeviceTypeToString(dev->type));
- goto endjob;
+ /* virDomainDefCompatibleDevice call is delayed until we know the
+ * device we're going to update. */
+ if ((ret = testDomainUpdateDevice(def, dev_live,
+ parse_flags,
+ driver->xmlopt)) < 0)
+ goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
--
2.34.1
2
1
[PATCH] conf: Fix out-of-bounds write during cleanup of virDomainNumaDefNodeDistanceParseXML
by Rayhan Faizel 04 Jul '24
by Rayhan Faizel 04 Jul '24
04 Jul '24
mem_nodes[i].ndistances is written outside the loop causing an out-of-bounds
write leading to heap corruption.
While we are at it, the entire cleanup portion can be removed as it can be
handled in virDomainNumaFree. One instance of VIR_FREE is also removed and
replaced with g_autofree.
This patch also adds a testcase which would be picked up by ASAN, if this
portion regresses.
Fixes: 742494eed8dbdde8b1d05a306032334e6226beea
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
src/conf/numa_conf.c | 30 ++++++-------------
...ance-nonexistent-sibling.x86_64-latest.err | 1 +
.../cpu-numa-distance-nonexistent-sibling.xml | 29 ++++++++++++++++++
tests/qemuxmlconftest.c | 1 +
4 files changed, 40 insertions(+), 21 deletions(-)
create mode 100644 tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index d8120de6d2..0a0e2911f7 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -343,8 +343,7 @@ virDomainNumaFree(virDomainNuma *numa)
virBitmapFree(numa->mem_nodes[i].cpumask);
virBitmapFree(numa->mem_nodes[i].nodeset);
- if (numa->mem_nodes[i].ndistances > 0)
- g_free(numa->mem_nodes[i].distances);
+ g_free(numa->mem_nodes[i].distances);
g_free(numa->mem_nodes[i].caches);
}
@@ -685,9 +684,8 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
xmlXPathContextPtr ctxt,
unsigned int cur_cell)
{
- int ret = -1;
int sibling;
- xmlNodePtr *nodes = NULL;
+ g_autofree xmlNodePtr *nodes = NULL;
size_t i, ndistances = def->nmem_nodes;
if (ndistances == 0)
@@ -698,12 +696,12 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
return 0;
if ((sibling = virXPathNodeSet("./distances[1]/sibling", ctxt, &nodes)) < 0)
- goto cleanup;
+ return -1;
if (sibling == 0) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("NUMA distances defined without siblings"));
- goto cleanup;
+ return -1;
}
for (i = 0; i < sibling; i++) {
@@ -713,19 +711,19 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
if (virXMLPropUInt(nodes[i], "id", 10, VIR_XML_PROP_REQUIRED,
&sibling_id) < 0)
- goto cleanup;
+ return -1;
/* The "id" needs to be within numa/cell range */
if (sibling_id >= ndistances) {
virReportError(VIR_ERR_XML_ERROR,
_("'sibling_id %1$d' does not refer to a valid cell within NUMA 'cell id %2$d'"),
sibling_id, cur_cell);
- goto cleanup;
+ return -1;
}
if (virXMLPropUInt(nodes[i], "value", 10, VIR_XML_PROP_REQUIRED,
&sibling_value) < 0)
- goto cleanup;
+ return -1;
/* Assure LOCAL_DISTANCE <= "value" <= UNREACHABLE
* and correct LOCAL_DISTANCE setting if such applies.
@@ -739,7 +737,7 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
virReportError(VIR_ERR_XML_ERROR,
_("'value %1$d' is invalid for 'sibling id %2$d' under NUMA 'cell id %3$d'"),
sibling_value, sibling_id, cur_cell);
- goto cleanup;
+ return -1;
}
/* Apply the local / remote distance */
@@ -770,17 +768,7 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
rdist[cur_cell].value = sibling_value;
}
- ret = 0;
-
- cleanup:
- if (ret < 0) {
- for (i = 0; i < ndistances; i++)
- VIR_FREE(def->mem_nodes[i].distances);
- def->mem_nodes[i].ndistances = 0;
- }
- VIR_FREE(nodes);
-
- return ret;
+ return 0;
}
diff --git a/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
new file mode 100644
index 0000000000..4866ff5e80
--- /dev/null
+++ b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: 'sibling_id 2' does not refer to a valid cell within NUMA 'cell id 1'
diff --git a/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
new file mode 100644
index 0000000000..62a6c32fbe
--- /dev/null
+++ b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
@@ -0,0 +1,29 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>16</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu>
+ <topology sockets='2' dies='1' cores='4' threads='2'/>
+ <numa>
+ <cell id='1' cpus='8-15' memory='109550' unit='KiB'>
+ <distances>
+ <sibling id='2' value='10'/>
+ </distances>
+ </cell>
+ <cell id='0' cpus='0-7' memory='109550' unit='KiB'/>
+ </numa>
+ </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>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 4a711fceeb..af49934c33 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2160,6 +2160,7 @@ mymain(void)
DO_TEST_CAPS_LATEST_PARSE_ERROR("cpu-numa3");
DO_TEST_CAPS_LATEST("cpu-numa-disjoint");
DO_TEST_CAPS_LATEST("cpu-numa-memshared");
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("cpu-numa-distance-nonexistent-sibling");
/* host-model cpu expansion depends on the cpu reported by qemu and thus
* we invoke it for all real capability dumps we have */
--
2.34.1
2
1
When debugging guest problems with TPMs it is helpful to be able to
have full swtpm logging. This isn't possible currently and manually
restarting the swtpm process of a running guest is disruptive.
Daniel P. Berrangé (2):
conf: add support for 'debug' parameter on TPM emulator
qemu: set swtpm log level parameter
docs/formatdomain.rst | 6 ++++--
src/conf/domain_conf.c | 7 +++++++
src/conf/domain_conf.h | 1 +
src/conf/schemas/domaincommon.rng | 5 +++++
src/qemu/qemu_tpm.c | 6 +++++-
tests/qemuxmlconfdata/tpm-emulator-tpm2.xml | 2 +-
6 files changed, 23 insertions(+), 4 deletions(-)
--
2.45.1
2
3
04 Jul '24
Current ch driver supports restore only for domains without any network
configuration defined. This was because libvirt explicitly passes network fds
and CH did not had support to restore with new net FDS. This support has been
added recently, https://github.com/cloud-hypervisor/cloud-hypervisor/pull/6402
The changes in this patch series includes moving to socket communication for
restore api, create new net fds and pass them via SCM_RIGHTS to CH.
New changes in v2:
* Reword of few commints
* Add version checks in save/restore validations
* Add use_timeout in chSocketRecv
* Address Praveen Paladugu's comments
v1: https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/PT77…
Purna Pavan Chandra (8):
ch: report response message instead of just code
ch: Pass net ids explicitly during vm creation
ch: refactor chProcessAddNetworkDevices
ch: support poll with -1 in chSocketRecv
ch: use monitor socket fd to send restore request
ch: refactor virCHMonitorSaveVM
ch: support restore with net devices
ch: kill CH process if restore fails
src/ch/ch_capabilities.c | 6 +
src/ch/ch_capabilities.h | 1 +
src/ch/ch_driver.c | 29 +++--
src/ch/ch_monitor.c | 62 +++++++----
src/ch/ch_monitor.h | 6 +-
src/ch/ch_process.c | 233 +++++++++++++++++++++++++++++++--------
6 files changed, 254 insertions(+), 83 deletions(-)
--
2.34.1
1
8
[PATCH] conf: Fix out-of-bounds write during cleanup of virDomainNumaDefNodeDistanceParseXML
by Rayhan Faizel 04 Jul '24
by Rayhan Faizel 04 Jul '24
04 Jul '24
mem_nodes[i].ndistances is written outside the loop causing an out-of-bounds
write leading to heap corruption.
While we are at it, the entire cleanup portion can be removed as it can be
handled in virDomainNumaFree. One instance of VIR_FREE is also removed and
replaced with g_autofree.
This patch also adds a testcase which would be picked up by ASAN, if this
portion regresses.
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
src/conf/numa_conf.c | 30 ++++++-------------
...ance-nonexistent-sibling.x86_64-latest.err | 1 +
.../cpu-numa-distance-nonexistent-sibling.xml | 29 ++++++++++++++++++
tests/qemuxmlconftest.c | 1 +
4 files changed, 40 insertions(+), 21 deletions(-)
create mode 100644 tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index d8120de6d2..0a0e2911f7 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -343,8 +343,7 @@ virDomainNumaFree(virDomainNuma *numa)
virBitmapFree(numa->mem_nodes[i].cpumask);
virBitmapFree(numa->mem_nodes[i].nodeset);
- if (numa->mem_nodes[i].ndistances > 0)
- g_free(numa->mem_nodes[i].distances);
+ g_free(numa->mem_nodes[i].distances);
g_free(numa->mem_nodes[i].caches);
}
@@ -685,9 +684,8 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
xmlXPathContextPtr ctxt,
unsigned int cur_cell)
{
- int ret = -1;
int sibling;
- xmlNodePtr *nodes = NULL;
+ g_autofree xmlNodePtr *nodes = NULL;
size_t i, ndistances = def->nmem_nodes;
if (ndistances == 0)
@@ -698,12 +696,12 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
return 0;
if ((sibling = virXPathNodeSet("./distances[1]/sibling", ctxt, &nodes)) < 0)
- goto cleanup;
+ return -1;
if (sibling == 0) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("NUMA distances defined without siblings"));
- goto cleanup;
+ return -1;
}
for (i = 0; i < sibling; i++) {
@@ -713,19 +711,19 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
if (virXMLPropUInt(nodes[i], "id", 10, VIR_XML_PROP_REQUIRED,
&sibling_id) < 0)
- goto cleanup;
+ return -1;
/* The "id" needs to be within numa/cell range */
if (sibling_id >= ndistances) {
virReportError(VIR_ERR_XML_ERROR,
_("'sibling_id %1$d' does not refer to a valid cell within NUMA 'cell id %2$d'"),
sibling_id, cur_cell);
- goto cleanup;
+ return -1;
}
if (virXMLPropUInt(nodes[i], "value", 10, VIR_XML_PROP_REQUIRED,
&sibling_value) < 0)
- goto cleanup;
+ return -1;
/* Assure LOCAL_DISTANCE <= "value" <= UNREACHABLE
* and correct LOCAL_DISTANCE setting if such applies.
@@ -739,7 +737,7 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
virReportError(VIR_ERR_XML_ERROR,
_("'value %1$d' is invalid for 'sibling id %2$d' under NUMA 'cell id %3$d'"),
sibling_value, sibling_id, cur_cell);
- goto cleanup;
+ return -1;
}
/* Apply the local / remote distance */
@@ -770,17 +768,7 @@ virDomainNumaDefNodeDistanceParseXML(virDomainNuma *def,
rdist[cur_cell].value = sibling_value;
}
- ret = 0;
-
- cleanup:
- if (ret < 0) {
- for (i = 0; i < ndistances; i++)
- VIR_FREE(def->mem_nodes[i].distances);
- def->mem_nodes[i].ndistances = 0;
- }
- VIR_FREE(nodes);
-
- return ret;
+ return 0;
}
diff --git a/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
new file mode 100644
index 0000000000..4866ff5e80
--- /dev/null
+++ b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: 'sibling_id 2' does not refer to a valid cell within NUMA 'cell id 1'
diff --git a/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
new file mode 100644
index 0000000000..62a6c32fbe
--- /dev/null
+++ b/tests/qemuxmlconfdata/cpu-numa-distance-nonexistent-sibling.xml
@@ -0,0 +1,29 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>16</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='network'/>
+ </os>
+ <cpu>
+ <topology sockets='2' dies='1' cores='4' threads='2'/>
+ <numa>
+ <cell id='1' cpus='8-15' memory='109550' unit='KiB'>
+ <distances>
+ <sibling id='2' value='10'/>
+ </distances>
+ </cell>
+ <cell id='0' cpus='0-7' memory='109550' unit='KiB'/>
+ </numa>
+ </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>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 4a711fceeb..af49934c33 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2160,6 +2160,7 @@ mymain(void)
DO_TEST_CAPS_LATEST_PARSE_ERROR("cpu-numa3");
DO_TEST_CAPS_LATEST("cpu-numa-disjoint");
DO_TEST_CAPS_LATEST("cpu-numa-memshared");
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("cpu-numa-distance-nonexistent-sibling");
/* host-model cpu expansion depends on the cpu reported by qemu and thus
* we invoke it for all real capability dumps we have */
--
2.34.1
1
1
Add basic coverage of device update; for now, only support disk updates
until other types are needed or tested.
Signed-off-by: John Levon <john.levon(a)nutanix.com>
---
src/test/test_driver.c | 127 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 127 insertions(+)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 40fb8a467d..213fbdbccb 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -41,6 +41,7 @@
#include "domain_conf.h"
#include "domain_driver.h"
#include "domain_event.h"
+#include "domain_postparse.h"
#include "domain_validate.h"
#include "network_event.h"
#include "snapshot_conf.h"
@@ -10237,6 +10238,131 @@ testDomainAttachDevice(virDomainPtr domain, const char *xml)
}
+static int
+testDomainUpdateDeviceConfig(virDomainDef *vmdef,
+ virDomainDeviceDef *dev,
+ unsigned int parse_flags,
+ virDomainXMLOption *xmlopt)
+{
+ virDomainDiskDef *newDisk;
+ virDomainDeviceDef oldDev = { .type = dev->type };
+ int pos;
+
+ switch (dev->type) {
+ case VIR_DOMAIN_DEVICE_DISK:
+ newDisk = dev->data.disk;
+ if ((pos = virDomainDiskIndexByName(vmdef, newDisk->dst, false)) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("target %1$s doesn't exist."), newDisk->dst);
+ return -1;
+ }
+
+ oldDev.data.disk = vmdef->disks[pos];
+ if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ false) < 0)
+ return -1;
+
+ virDomainDiskDefFree(vmdef->disks[pos]);
+ vmdef->disks[pos] = newDisk;
+ dev->data.disk = NULL;
+ break;
+
+ // TODO: support these here once tested.
+ case VIR_DOMAIN_DEVICE_GRAPHICS:
+ case VIR_DOMAIN_DEVICE_NET:
+ case VIR_DOMAIN_DEVICE_MEMORY:
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("persistent update of device '%1$s' is not supported by test driver"),
+ virDomainDeviceTypeToString(dev->type));
+ return -1;
+
+ case VIR_DOMAIN_DEVICE_FS:
+ case VIR_DOMAIN_DEVICE_INPUT:
+ case VIR_DOMAIN_DEVICE_SOUND:
+ case VIR_DOMAIN_DEVICE_VIDEO:
+ case VIR_DOMAIN_DEVICE_WATCHDOG:
+ case VIR_DOMAIN_DEVICE_HUB:
+ case VIR_DOMAIN_DEVICE_SMARTCARD:
+ case VIR_DOMAIN_DEVICE_MEMBALLOON:
+ case VIR_DOMAIN_DEVICE_NVRAM:
+ case VIR_DOMAIN_DEVICE_RNG:
+ case VIR_DOMAIN_DEVICE_SHMEM:
+ case VIR_DOMAIN_DEVICE_LEASE:
+ case VIR_DOMAIN_DEVICE_HOSTDEV:
+ case VIR_DOMAIN_DEVICE_CONTROLLER:
+ case VIR_DOMAIN_DEVICE_REDIRDEV:
+ case VIR_DOMAIN_DEVICE_CHR:
+ case VIR_DOMAIN_DEVICE_NONE:
+ case VIR_DOMAIN_DEVICE_TPM:
+ case VIR_DOMAIN_DEVICE_PANIC:
+ case VIR_DOMAIN_DEVICE_IOMMU:
+ case VIR_DOMAIN_DEVICE_VSOCK:
+ case VIR_DOMAIN_DEVICE_AUDIO:
+ case VIR_DOMAIN_DEVICE_CRYPTO:
+ case VIR_DOMAIN_DEVICE_LAST:
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("persistent update of device '%1$s' is not supported"),
+ virDomainDeviceTypeToString(dev->type));
+ return -1;
+ }
+
+ if (virDomainDefPostParse(vmdef, parse_flags, xmlopt, NULL) < 0)
+ return -1;
+
+ return 0;
+}
+
+
+static int
+testDomainUpdateDeviceFlags(virDomainPtr dom,
+ const char *xml,
+ unsigned int flags)
+{
+ testDriver *driver = dom->conn->privateData;
+ virDomainObj *vm = NULL;
+ g_autoptr(virDomainDef) vmdef = NULL;
+ g_autoptr(virDomainDeviceDef) dev = NULL;
+ int ret = -1;
+ unsigned int parse_flags = 0;
+
+ virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+ VIR_DOMAIN_AFFECT_CONFIG |
+ VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
+
+ if (!(vm = testDomObjFromDomain(dom)))
+ goto cleanup;
+
+ if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+ goto cleanup;
+
+ if (virDomainObjUpdateModificationImpact(vm, &flags) < 0)
+ goto endjob;
+
+ if ((flags & VIR_DOMAIN_AFFECT_CONFIG) &&
+ !(flags & VIR_DOMAIN_AFFECT_LIVE))
+ parse_flags |= VIR_DOMAIN_DEF_PARSE_INACTIVE;
+
+ if (!(dev = virDomainDeviceDefParse(xml, vm->def, driver->xmlopt,
+ NULL, parse_flags)))
+ goto endjob;
+
+ /* virDomainDefCompatibleDevice call is delayed until we know the
+ * device we're going to update. */
+ if ((ret = testDomainUpdateDeviceConfig(vm->def, dev,
+ parse_flags,
+ driver->xmlopt)) < 0)
+ goto endjob;
+
+ endjob:
+ virDomainObjEndJob(vm);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+ return ret;
+}
+
+
/* search for a hostdev matching dev and detach it */
static int
testDomainDetachPrepHostdev(virDomainObj *vm,
@@ -10456,6 +10582,7 @@ static virHypervisorDriver testHypervisorDriver = {
.domainAttachDevice = testDomainAttachDevice, /* 10.0.0 */
.domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 10.0.0 */
.domainDetachDeviceAlias = testDomainDetachDeviceAlias, /* 10.0.0 */
+ .domainUpdateDeviceFlags = testDomainUpdateDeviceFlags, /* 10.6.0 */
.domainCreateXML = testDomainCreateXML, /* 0.1.4 */
.domainCreateXMLWithFiles = testDomainCreateXMLWithFiles, /* 5.7.0 */
.domainLookupByID = testDomainLookupByID, /* 0.1.1 */
--
2.34.1
2
6
[PATCH v2] tests: Move domainEventState initialization to qemuTestDriverInit
by Rayhan Faizel 04 Jul '24
by Rayhan Faizel 04 Jul '24
04 Jul '24
Under the test environment, driver->domainEventState is uninitialized. If a
disk gets dropped, it will attempt to queue an event which will cause a
segmentation fault. This crash does not occur during normal use.
This patch moves driver->domainEventState initialization from qemuhotplugtest
to qemuTestDriverInit in testutilsqemu (Credit goes to Michal Privoznik as he
had already provided the diff).
An additional test case is added to test dropping of disks with startupPolicy
set as optional.
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
As the patch title has completely changed,
v1: https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/4476…
[Changes in v2]
- Move domainEventState initialization instead of adding a NULL check
tests/qemuhotplugtest.c | 3 --
...tuppolicy-optional-drop.x86_64-latest.args | 33 ++++++++++++++++
...rtuppolicy-optional-drop.x86_64-latest.xml | 38 +++++++++++++++++++
.../disk-startuppolicy-optional-drop.xml | 23 +++++++++++
tests/qemuxmlconftest.c | 1 +
tests/testutilsqemu.c | 4 ++
6 files changed, 99 insertions(+), 3 deletions(-)
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c
index d935ad58ed..f707121c47 100644
--- a/tests/qemuhotplugtest.c
+++ b/tests/qemuhotplugtest.c
@@ -501,9 +501,6 @@ mymain(void)
virEventRegisterDefaultImpl();
- if (!(driver.domainEventState = virObjectEventStateNew()))
- return EXIT_FAILURE;
-
driver.lockManager = virLockManagerPluginNew("nop", "qemu",
driver.config->configBaseDir,
0);
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
new file mode 100644
index 0000000000..13ddbc1a5d
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
@@ -0,0 +1,33 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=219136k \
+-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-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":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
+-device '{"driver":"lsi","id":"scsi0","bus":"pci.0","addr":"0x2"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
new file mode 100644
index 0000000000..27d0639109
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
@@ -0,0 +1,38 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='volume' device='disk'>
+ <driver name='qemu'/>
+ <source pool='inactive' volume='inactive' startupPolicy='optional'/>
+ <target dev='sda' bus='scsi'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='scsi' index='0' model='lsilogic'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
new file mode 100644
index 0000000000..c6c59978c6
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='volume' device='disk'>
+ <source pool='inactive' volume='inactive' startupPolicy='optional'/>
+ <target dev='sda'/>
+ </disk>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 4a711fceeb..2a495cc892 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2947,6 +2947,7 @@ mymain(void)
DO_TEST_CAPS_LATEST_FAILURE("disk-network-iscsi-zero-hosts-invalid")
DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-rawio-invalid")
DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-sgio-invalid")
+ DO_TEST_CAPS_LATEST("disk-startuppolicy-optional-drop")
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index d70850cb5d..ee6cae218a 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -236,6 +236,7 @@ void qemuTestDriverFree(virQEMUDriver *driver)
virObjectUnref(driver->caps);
virObjectUnref(driver->config);
virObjectUnref(driver->securityManager);
+ virObjectUnref(driver->domainEventState);
g_clear_object(&driver->nbdkitCapsCache);
virCPUDefFree(cpuDefault);
@@ -369,6 +370,9 @@ int qemuTestDriverInit(virQEMUDriver *driver)
if (!(driver->securityManager = virSecurityManagerNewStack(mgr)))
goto error;
+ if (!(driver->domainEventState = virObjectEventStateNew()))
+ goto error;
+
qemuTestSetHostCPU(driver, driver->hostarch, NULL);
VIR_FREE(cfg->vncTLSx509certdir);
--
2.34.1
2
1
[PATCH v1] security_manager: Ensure top lock is acquired before nested locks
by hongmianquan 04 Jul '24
by hongmianquan 04 Jul '24
04 Jul '24
We need to ensure top lock is acquired before nested lock. Otherwise deadlock
issues may arise. We have the stack security driver, which internally manages
other security drivers, we call them "top" and "nested".
We call virSecurityStackPreFork() to lock the top one, and it also locks
and then unlocks the nested drivers prior to fork. Then in qemuSecurityPostFork(),
it unlocks the top one, but not the nested ones. Thus, if one of the nested
drivers ("dac" or "selinux") is still locked, it will cause a deadlock.
We discovered this case: the nested list obtained through the qemuSecurityGetNested()
will be locked for subsequent use, such as in virQEMUDriverCreateCapabilities(),
where the nested list is locked using qemuSecurityGetDOI, but the top one is not locked beforehand.
The problem stack is as follows:
libvirtd thread1 libvirtd thread2 child libvirtd
| | |
| | |
virsh capabilities qemuProcessLanuch |
| | |
| lock top |
| | |
lock nested | |
| | |
| fork------------------->|(held nested lock)
| | |
| | |
unlock nested unlock top unlock top
|
|
qemuSecuritySetSocketLabel
|
|
lock nested (deadlock)
In this commit, we ensure that the top lock is acquired before the nested lock,
so during fork, it's not possible for another task to acquire the nested lock.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1303031
Signed-off-by: hongmianquan <hongmianquan(a)bytedance.com>
---
src/libvirt_private.syms | 3 ++-
src/qemu/qemu_conf.c | 9 ++++++++-
src/qemu/qemu_driver.c | 16 +++++++++-------
src/qemu/qemu_security.h | 2 ++
src/security/security_manager.c | 22 ++++++++++++++++++++++
src/security/security_manager.h | 2 ++
6 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index bac4a8a366..39cdb90772 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1806,7 +1806,8 @@ virSecurityManagerTransactionAbort;
virSecurityManagerTransactionCommit;
virSecurityManagerTransactionStart;
virSecurityManagerVerify;
-
+virSecurityManagerStackLock;
+virSecurityManagerStackUnlock;
# security/security_util.h
virSecurityXATTRNamespaceDefined;
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 4050a82341..21f0739fd5 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1380,6 +1380,9 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
return NULL;
}
+ /* Ensure top lock is acquired before nested locks */
+ qemuSecurityStackLock(driver->securityManager);
+
/* access sec drivers and create a sec model for each one */
if (!(sec_managers = qemuSecurityGetNested(driver->securityManager)))
return NULL;
@@ -1402,8 +1405,10 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
lbl = qemuSecurityGetBaseLabel(sec_managers[i], virtTypes[j]);
type = virDomainVirtTypeToString(virtTypes[j]);
if (lbl &&
- virCapabilitiesHostSecModelAddBaseLabel(sm, type, lbl) < 0)
+ virCapabilitiesHostSecModelAddBaseLabel(sm, type, lbl) < 0) {
+ qemuSecurityStackUnlock(driver->securityManager);
return NULL;
+ }
}
VIR_DEBUG("Initialized caps for security driver \"%s\" with "
@@ -1412,6 +1417,8 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
caps->host.numa = virCapabilitiesHostNUMANewHost();
caps->host.cpu = virQEMUDriverGetHostCPU(driver);
+
+ qemuSecurityStackUnlock(driver->securityManager);
return g_steal_pointer(&caps);
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fc1704f4fc..c980a0990f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -560,7 +560,6 @@ qemuStateInitialize(bool privileged,
bool autostart = true;
size_t i;
const char *defsecmodel = NULL;
- g_autofree virSecurityManager **sec_managers = NULL;
g_autoptr(virIdentity) identity = virIdentityGetCurrent();
qemu_driver = g_new0(virQEMUDriver, 1);
@@ -835,11 +834,8 @@ qemuStateInitialize(bool privileged,
if (!qemu_driver->qemuCapsCache)
goto error;
- if (!(sec_managers = qemuSecurityGetNested(qemu_driver->securityManager)))
- goto error;
-
- if (sec_managers[0] != NULL)
- defsecmodel = qemuSecurityGetModel(sec_managers[0]);
+ if (qemu_driver->securityManager != NULL)
+ defsecmodel = qemuSecurityGetModel(qemu_driver->securityManager);
if (!(qemu_driver->xmlopt = virQEMUDriverCreateXMLConf(qemu_driver,
defsecmodel)))
@@ -5663,7 +5659,12 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom,
ret = 0;
} else {
int len = 0;
- virSecurityManager ** mgrs = qemuSecurityGetNested(driver->securityManager);
+ virSecurityManager ** mgrs = NULL;
+
+ /* Ensure top lock is acquired before nested locks */
+ qemuSecurityStackLock(driver->securityManager);
+
+ mgrs = qemuSecurityGetNested(driver->securityManager);
if (!mgrs)
goto cleanup;
@@ -5688,6 +5689,7 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom,
}
cleanup:
+ qemuSecurityStackUnlock(driver->securityManager);
virDomainObjEndAPI(&vm);
return ret;
}
diff --git a/src/qemu/qemu_security.h b/src/qemu/qemu_security.h
index 41da33debc..19fcb3c939 100644
--- a/src/qemu/qemu_security.h
+++ b/src/qemu/qemu_security.h
@@ -151,3 +151,5 @@ int qemuSecurityCommandRun(virQEMUDriver *driver,
#define qemuSecuritySetTapFDLabel virSecurityManagerSetTapFDLabel
#define qemuSecurityStackAddNested virSecurityManagerStackAddNested
#define qemuSecurityVerify virSecurityManagerVerify
+#define qemuSecurityStackLock virSecurityManagerStackLock
+#define qemuSecurityStackUnlock virSecurityManagerStackUnlock
\ No newline at end of file
diff --git a/src/security/security_manager.c b/src/security/security_manager.c
index 24f2f3d3dc..c49c4f708f 100644
--- a/src/security/security_manager.c
+++ b/src/security/security_manager.c
@@ -989,6 +989,28 @@ virSecurityManagerGetNested(virSecurityManager *mgr)
return list;
}
+/*
+ * Usually called before virSecurityManagerGetNested().
+ * We need to ensure locking the stack security manager before
+ * locking the nested security manager to maintain the correct
+ * synchronization state.
+ * It must be followed by a call virSecurityManagerStackUnlock().
+ */
+void
+virSecurityManagerStackLock(virSecurityManager *mgr)
+{
+ if (STREQ("stack", mgr->drv->name))
+ virObjectLock(mgr);
+}
+
+
+void
+virSecurityManagerStackUnlock(virSecurityManager *mgr)
+{
+ if (STREQ("stack", mgr->drv->name))
+ virObjectUnlock(mgr);
+}
+
/**
* virSecurityManagerDomainSetPathLabel:
diff --git a/src/security/security_manager.h b/src/security/security_manager.h
index a416af3215..bb6d22bc31 100644
--- a/src/security/security_manager.h
+++ b/src/security/security_manager.h
@@ -158,6 +158,8 @@ int virSecurityManagerSetTapFDLabel(virSecurityManager *mgr,
char *virSecurityManagerGetMountOptions(virSecurityManager *mgr,
virDomainDef *vm);
virSecurityManager ** virSecurityManagerGetNested(virSecurityManager *mgr);
+void virSecurityManagerStackLock(virSecurityManager *mgr);
+void virSecurityManagerStackUnlock(virSecurityManager *mgr);
typedef enum {
VIR_SECURITY_DOMAIN_IMAGE_LABEL_BACKING_CHAIN = 1 << 0,
--
2.11.0
3
4
Re: [PATCH v1] security_manager: Ensure top lock is acquired before
nested locks
by ByteDance 03 Jul '24
by ByteDance 03 Jul '24
03 Jul '24
Yes, we have recently encountered this issue, and it is exactly the same as the scenario described in the bug report. We investigated the code and found this potential problem. The issue occurs when collecting information through the ‘virsh capabilities' while concurrently creating vm. The higher the frequency and concurrency, the more likely the issue will reproduce. We believe this is a very rare bug; our environment has been running for three years, and we've only encountered this issue once. To successfully reproduce the problem, we constructed a test case by adding a sleep between the lock nested and unlock. But we still need to try to fix this issue, even though the probability is very low.
1
0
03 Jul '24
The current hostdev parsing logic sets rawio or sgio even if the hostdev type
is not 'scsi'. The rawio field in virDomainHostdevSubsysSCSI overlaps with
wwpn field in virDomainHostdevSubsysSCSIVHost, consequently setting a bogus
pointer value such as 0x1 or 0x2 from virDomainHostdevSubsysSCSIVHost's
point of view. This leads to a segmentation fault when it attempts to free
wwpn.
While setting sgio does not appear to crash, it shares the same flawed logic
as setting rawio.
Instead, we ensure these are set only after the hostdev type check succeeds.
This patch also adds two test cases to exercise both scenarios.
Fixes: bdb95b520c53f9bacc6504fc51381bac4813be38
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
[Changes in v2]
- Reworked fix to use temporary variables instead of xpath queries.
- Added comments for future reference.
- Mention fixed commit.
src/conf/domain_conf.c | 26 +++++++++---
...scsi-vhost-rawio-invalid.x86_64-latest.err | 1 +
.../hostdev-scsi-vhost-rawio-invalid.xml | 41 +++++++++++++++++++
...-scsi-vhost-sgio-invalid.x86_64-latest.err | 1 +
.../hostdev-scsi-vhost-sgio-invalid.xml | 41 +++++++++++++++++++
tests/qemuxmlconftest.c | 2 +
6 files changed, 106 insertions(+), 6 deletions(-)
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 334152c4ff..7033b4e9fe 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6220,6 +6220,8 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
virDomainHostdevSubsysMediatedDev *mdevsrc = &def->source.subsys.u.mdev;
virTristateBool managed;
g_autofree char *model = NULL;
+ virDomainDeviceSGIO sgio;
+ virTristateBool rawio;
int rv;
/* @managed can be read from the xml document - it is always an
@@ -6259,7 +6261,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
if ((rv = virXMLPropEnum(node, "sgio",
virDomainDeviceSGIOTypeFromString,
VIR_XML_PROP_NONZERO,
- &scsisrc->sgio)) < 0) {
+ &sgio)) < 0) {
return -1;
}
@@ -6269,18 +6271,30 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
_("sgio is only supported for scsi host device"));
return -1;
}
+
+ /* Set sgio only after checking if hostdev type is 'scsi' to avoid
+ * clobbering other union structures.
+ */
+ scsisrc->sgio = sgio;
}
if ((rv = virXMLPropTristateBool(node, "rawio",
VIR_XML_PROP_NONE,
- &scsisrc->rawio)) < 0) {
+ &rawio)) < 0) {
return -1;
}
- if (rv > 0 && def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("rawio is only supported for scsi host device"));
- return -1;
+ if (rv > 0) {
+ if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("rawio is only supported for scsi host device"));
+ return -1;
+ }
+
+ /* Set rawio only after checking if hostdev type is 'scsi' to avoid
+ * clobbering other union structures.
+ */
+ scsisrc->rawio = rawio;
}
if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
new file mode 100644
index 0000000000..ddaf449658
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: rawio is only supported for scsi host device
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
new file mode 100644
index 0000000000..80760ab941
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <hostdev mode='subsystem' type='scsi_host' rawio='yes'>
+ <source protocol='vhost' wwpn='naa.5123456789abcde0'/>
+ </hostdev>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
new file mode 100644
index 0000000000..32256aad1c
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: sgio is only supported for scsi host device
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
new file mode 100644
index 0000000000..c549bddc1d
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <hostdev mode='subsystem' type='scsi_host' sgio='filtered'>
+ <source protocol='vhost' wwpn='naa.5123456789abcde0'/>
+ </hostdev>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 8e0d47c6fd..1236ed5df1 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2993,6 +2993,8 @@ mymain(void)
DO_TEST_CAPS_LATEST("sound-device-virtio")
DO_TEST_CAPS_LATEST_FAILURE("disk-network-iscsi-zero-hosts-invalid")
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-rawio-invalid")
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-sgio-invalid")
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
--
2.34.1
2
1
Changing the postgroup attribute caused unexpected behavior.
Although it can be implemented, it has a non-trivial solution.
No requirement or use has yet been found for implementing this
feature, so it has been disabled for hot-plug.
Resolves: https://issues.redhat.com/browse/RHEL-7299
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 4a3f4f657e..08ca7ab973 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3937,6 +3937,13 @@ qemuDomainChangeNet(virQEMUDriver *driver,
else
needBridgeChange = true;
}
+
+ if (STRNEQ_NULLABLE(olddev->data.network.portgroup, newdev->data.network.portgroup)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("cannot modify network device portgroup attribute"));
+ goto cleanup;
+ }
+
/* other things handled in common code directly below this switch */
break;
--
2.45.2
2
1
03 Jul '24
Under the test environment, driver->domainEventState is uninitialized. If a
disk gets dropped, it will attempt to queue an event which will cause a
segmentation fault. This crash does not occur during normal use.
This patch adds a quick check to ensure driver->domainEventState is not NULL
along with a testcase exercising the dropping of disks with startupPolicy set
as 'optional'.
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
src/qemu/qemu_domain.c | 3 +-
...tuppolicy-optional-drop.x86_64-latest.args | 33 ++++++++++++++++
...rtuppolicy-optional-drop.x86_64-latest.xml | 38 +++++++++++++++++++
.../disk-startuppolicy-optional-drop.xml | 23 +++++++++++
tests/qemuxmlconftest.c | 2 +
5 files changed, 98 insertions(+), 1 deletion(-)
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 7ba2ea4a5e..109c5bbd52 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7592,7 +7592,8 @@ qemuDomainCheckRemoveOptionalDisk(virQEMUDriver *driver,
virDomainDiskDefFree(disk);
}
- virObjectEventStateQueue(driver->domainEventState, event);
+ if (driver->domainEventState)
+ virObjectEventStateQueue(driver->domainEventState, event);
}
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
new file mode 100644
index 0000000000..13ddbc1a5d
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.args
@@ -0,0 +1,33 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=219136k \
+-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-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":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
+-device '{"driver":"lsi","id":"scsi0","bus":"pci.0","addr":"0x2"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
new file mode 100644
index 0000000000..27d0639109
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.x86_64-latest.xml
@@ -0,0 +1,38 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='volume' device='disk'>
+ <driver name='qemu'/>
+ <source pool='inactive' volume='inactive' startupPolicy='optional'/>
+ <target dev='sda' bus='scsi'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='scsi' index='0' model='lsilogic'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
new file mode 100644
index 0000000000..c6c59978c6
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-startuppolicy-optional-drop.xml
@@ -0,0 +1,23 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='volume' device='disk'>
+ <source pool='inactive' volume='inactive' startupPolicy='optional'/>
+ <target dev='sda'/>
+ </disk>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 5700ea314f..16ecc1b7e4 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2986,6 +2986,8 @@ mymain(void)
DO_TEST_CAPS_LATEST("net-usb")
DO_TEST_CAPS_LATEST("sound-device-virtio")
+ DO_TEST_CAPS_LATEST("disk-startuppolicy-optional-drop")
+
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
ret = -1;
--
2.34.1
2
2
Re: [PATCH v2] security_manager: Ensure top lock is acquired before
nested locks
by ByteDance 03 Jul '24
by ByteDance 03 Jul '24
03 Jul '24
Hello, Mr. Krempa. I apologize for the interruption. I came across your discussion on Bugzilla regarding https://bugzilla.redhat.com/show_bug.cgi?id=1303031, we have encountered the same issue in our usage and have identified a potential occurrence path. I hope to discuss this further with you. Thank you for your time.
1
0
02 Jul '24
The current hostdev parsing logic sets rawio or sgio even if the hostdev type
is not 'scsi'. The rawio field in virDomainHostdevSubsysSCSI overlaps with
wwpn field in virDomainHostdevSubsysSCSIVHost, consequently setting a bogus
pointer value such as 0x1 or 0x2 from virDomainHostdevSubsysSCSIVHost's
point of view. This leads to a segmentation fault when it attempts to free
wwpn.
While setting sgio does not appear to crash, it shares the same flawed logic
as setting rawio.
Instead, we test the presence of their xpaths along with the hostdev type
before setting either attributes. This patch also adds two test cases to
exercise both scenarios.
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
src/conf/domain_conf.c | 33 ++++++++-------
...scsi-vhost-rawio-invalid.x86_64-latest.err | 1 +
.../hostdev-scsi-vhost-rawio-invalid.xml | 41 +++++++++++++++++++
...-scsi-vhost-sgio-invalid.x86_64-latest.err | 1 +
.../hostdev-scsi-vhost-sgio-invalid.xml | 41 +++++++++++++++++++
tests/qemuxmlconftest.c | 2 +
6 files changed, 102 insertions(+), 17 deletions(-)
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 334152c4ff..5f8c6f2672 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6220,7 +6220,6 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
virDomainHostdevSubsysMediatedDev *mdevsrc = &def->source.subsys.u.mdev;
virTristateBool managed;
g_autofree char *model = NULL;
- int rv;
/* @managed can be read from the xml document - it is always an
* attribute of the toplevel element, no matter what type of
@@ -6256,33 +6255,33 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
return -1;
}
- if ((rv = virXMLPropEnum(node, "sgio",
- virDomainDeviceSGIOTypeFromString,
- VIR_XML_PROP_NONZERO,
- &scsisrc->sgio)) < 0) {
+ if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
+ virXPathBoolean("boolean(./@sgio)", ctxt)) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("sgio is only supported for scsi host device"));
return -1;
}
- if (rv > 0) {
- if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("sgio is only supported for scsi host device"));
- return -1;
- }
- }
-
- if ((rv = virXMLPropTristateBool(node, "rawio",
- VIR_XML_PROP_NONE,
- &scsisrc->rawio)) < 0) {
+ if (virXMLPropEnum(node, "sgio",
+ virDomainDeviceSGIOTypeFromString,
+ VIR_XML_PROP_NONZERO,
+ &scsisrc->sgio) < 0) {
return -1;
}
- if (rv > 0 && def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
+ if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
+ virXPathBoolean("boolean(./@rawio)", ctxt)) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("rawio is only supported for scsi host device"));
return -1;
}
+ if (virXMLPropTristateBool(node, "rawio",
+ VIR_XML_PROP_NONE,
+ &scsisrc->rawio) < 0) {
+ return -1;
+ }
+
if (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST) {
if (model) {
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
new file mode 100644
index 0000000000..ddaf449658
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: rawio is only supported for scsi host device
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
new file mode 100644
index 0000000000..80760ab941
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-rawio-invalid.xml
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <hostdev mode='subsystem' type='scsi_host' rawio='yes'>
+ <source protocol='vhost' wwpn='naa.5123456789abcde0'/>
+ </hostdev>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
new file mode 100644
index 0000000000..32256aad1c
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.x86_64-latest.err
@@ -0,0 +1 @@
+XML error: sgio is only supported for scsi host device
diff --git a/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
new file mode 100644
index 0000000000..c549bddc1d
--- /dev/null
+++ b/tests/qemuxmlconfdata/hostdev-scsi-vhost-sgio-invalid.xml
@@ -0,0 +1,41 @@
+<domain type='qemu'>
+ <name>QEMUGuest2</name>
+ <uuid>c7a5fdbd-edaf-9466-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219100</memory>
+ <currentMemory unit='KiB'>219100</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='block' device='disk'>
+ <source dev='/dev/HostVG/QEMUGuest2'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='scsi' index='0' model='virtio-scsi'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+ </controller>
+ <controller type='usb' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <hostdev mode='subsystem' type='scsi_host' sgio='filtered'>
+ <source protocol='vhost' wwpn='naa.5123456789abcde0'/>
+ </hostdev>
+ <memballoon model='virtio'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </memballoon>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 8e0d47c6fd..1236ed5df1 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2993,6 +2993,8 @@ mymain(void)
DO_TEST_CAPS_LATEST("sound-device-virtio")
DO_TEST_CAPS_LATEST_FAILURE("disk-network-iscsi-zero-hosts-invalid")
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-rawio-invalid")
+ DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-scsi-vhost-sgio-invalid")
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
--
2.34.1
3
3
This is a rebased version of:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/VWR6…
which doesn't apply cleanly anymore due to recent changes to
qemu_capabilities.c.
Michal Prívozník (5):
qemu_capabilities: Introduce QEMU_CAPS_DEVICE_ACPI_ERST
conf: Introduce pstore device
qemu: Build cmd line for pstore device
security: Set seclabels for pstore device
NEWS: Document pstore device addition
NEWS.rst | 7 +
docs/formatdomain.rst | 32 ++++
src/ch/ch_domain.c | 1 +
src/conf/domain_conf.c | 153 ++++++++++++++++++
src/conf/domain_conf.h | 19 +++
src/conf/domain_postparse.c | 1 +
src/conf/domain_validate.c | 30 ++++
src/conf/schemas/domaincommon.rng | 25 +++
src/conf/virconftypes.h | 2 +
src/hyperv/hyperv_driver.c | 1 +
src/libvirt_private.syms | 2 +
src/libxl/libxl_driver.c | 6 +
src/lxc/lxc_driver.c | 6 +
src/qemu/qemu_alias.c | 10 ++
src/qemu/qemu_capabilities.c | 2 +
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 52 ++++++
src/qemu/qemu_domain.c | 3 +
src/qemu/qemu_domain_address.c | 11 ++
src/qemu/qemu_driver.c | 3 +
src/qemu/qemu_hotplug.c | 5 +
src/qemu/qemu_validate.c | 26 +++
src/security/security_dac.c | 10 ++
src/security/security_selinux.c | 9 ++
src/security/virt-aa-helper.c | 4 +
.../caps_7.0.0_aarch64+hvf.xml | 1 +
.../caps_7.0.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 +
.../caps_7.0.0_x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 +
.../caps_7.1.0_x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 +
.../caps_7.2.0_x86_64+hvf.xml | 1 +
.../caps_7.2.0_x86_64.xml | 1 +
.../caps_8.0.0_x86_64.xml | 1 +
.../caps_8.1.0_x86_64.xml | 1 +
.../caps_8.2.0_aarch64.xml | 1 +
.../caps_8.2.0_armv7l.xml | 1 +
.../caps_8.2.0_loongarch64.xml | 1 +
.../caps_8.2.0_x86_64.xml | 1 +
.../caps_9.0.0_x86_64.xml | 1 +
.../caps_9.1.0_x86_64.xml | 1 +
.../pstore-acpi-erst.x86_64-latest.args | 38 +++++
.../pstore-acpi-erst.x86_64-latest.xml | 1 +
tests/qemuxmlconfdata/pstore-acpi-erst.xml | 53 ++++++
tests/qemuxmlconftest.c | 1 +
46 files changed, 531 insertions(+)
create mode 100644 tests/qemuxmlconfdata/pstore-acpi-erst.x86_64-latest.args
create mode 120000 tests/qemuxmlconfdata/pstore-acpi-erst.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/pstore-acpi-erst.xml
--
2.44.2
1
5
[PATCH v2 00/14] hw: define and enforce a standard lifecycle for versioned machines
by Daniel P. Berrangé 01 Jul '24
by Daniel P. Berrangé 01 Jul '24
01 Jul '24
Thomas proposed a new deprecation and removal policy for versioned
machine types that would see them liable for deletion after 6 years:
https://lists.nongnu.org/archive/html/qemu-devel/2024-04/msg04683.html
This suggest was met with broad approval, however, I suggested that we
could take it further and actually mark them deprecated sooner, at the
3 year timeframe, and also fully automate the enablement of the runtime
deprecation warning without developer intervention on every release
cycle.
This series implements my suggestions.
The first patch introduces some helper macros and documents a standard
code pattern for defining versioned machine types across targets.
The next 6 patches convert existing targets with versioned machine
types (arm, s390x, ppc, m68k, i386) to use the new helper macros and
code patterns.
A further patch introduces some helper macros for automating the
handling of deprecation and deletion of versioned machine types.
Two more patches then enable the deprecation and deletion logic
across all versioned machines
Finally we do some cleanup and document the new policy.
........a tangent about VERSION file handling.......
One oddity here, is that during the development and release
candidate phases the automatic logic in this series has an off-by-1
error.
This is because when we, for example, add the "9.1" machine type
versions, the VERSION file is still reporting '9.0.50', and then
'9.0.9{1,2,3,4}'.
IOW, during development and in rc candidates, we fail to deprecate
and delete 1 machine type. We should already have deprecated the
6.1 machine types, but the most recently deprecated is 6.0.
This is pretty harmless since the final release does the right
thing.
I wonder, however, whether we would benefit from changing how we
update the VERSION file.
eg instead of re-using the micro digit to indicate a dev or rc
snapshot, represent those explicitly. eg "9.1.0-dev" and
"9.1.0-rc1", "9.1.0-rc2", etc in VERSION.
We don't use the full QEMU_VERSION in the code in all that many
places. It appears in some help messages for command line tools,
and in QMP query-version response, and in a few other misc places.
At a glance it appears all of those places would easily handle a
tagged version.
For release candidates in particular I think it would be saner
to show the user the actual version the release is about to become,
rather than the previous release's version. This would make the
reported version match the rc tarball naming too which would be
nice.
Anyway, this isn't a blocker for this machine type versioning
proposal, just a thought....
Changed in v2:
- Various docs improvements and minor fixes from original
review
- Rebased and resolved conflicts with Philippe's merged
series
Daniel P. Berrangé (14):
include/hw: add helpers for defining versioned machine types
hw/arm: convert 'virt' machine definitions to use new macros
hw/s390x: convert 'ccw' machine definitions to use new macros
hw/ppc: convert 'spapr' machine definitions to use new macros
hw/m68k: convert 'virt' machine definitions to use new macros
hw/i386: convert 'i440fx' machine definitions to use new macros
hw/i386: convert 'q35' machine definitions to use new macros
include/hw: add macros for deprecation & removal of versioned machines
include/hw: temporarily disable deletion of versioned machine types
hw: set deprecation info for all versioned machine types
hw: skip registration of outdated versioned machine types
hw/ppc: remove obsolete manual deprecation reason string of spapr
machines
hw/i386: remove obsolete manual deprecation reason string of i440fx
machines
docs: document special exception for machine type deprecation &
removal
docs/about/deprecated.rst | 13 ++
hw/arm/virt.c | 30 ++--
hw/i386/pc_piix.c | 220 ++++++++++++---------------
hw/i386/pc_q35.c | 215 +++++++++++---------------
hw/m68k/virt.c | 53 ++++---
hw/ppc/spapr.c | 96 ++++++------
hw/s390x/s390-virtio-ccw.c | 98 ++++++------
include/hw/boards.h | 298 +++++++++++++++++++++++++++++++++++++
include/hw/i386/pc.h | 28 ++++
9 files changed, 681 insertions(+), 370 deletions(-)
--
2.43.0
3
29
*** BLURB HERE ***
Michal Prívozník (9):
qemucapabilitiesdata: Rename sparc capabilities
qemusecuritytest: drop disk-network-tlsx509-vxhs test case
qemuxmlconfdata: Drop tests relying on <qemu-5.2.0
qemucapabilitiesdata: Drop tests relying on <qemu-5.2.0
qemu_capabilities: Require QEMU-5.2.0 or newer
qemu_capabilities: Drop version check for QEMU_CAPS_ENABLE_FIPS and
QEMU_CAPS_NETDEV_USER
qemu_capabilities: Retire QEMU_CAPS_ENABLE_FIPS
qemu_capabilities: Retire QEMU_CAPS_VXHS
qemu: Drop _virQEMUDriver::hostFips
src/qemu/qemu_capabilities.c | 20 +-
src/qemu/qemu_capabilities.h | 4 +-
src/qemu/qemu_command.c | 15 -
src/qemu/qemu_conf.h | 1 -
src/qemu/qemu_driver.c | 9 -
src/qemu/qemu_process.c | 3 +-
...u_5.1.0.sparc.xml => qemu_5.2.0.sparc.xml} | 0
.../caps_4.2.0_aarch64.replies | 21813 ------------
.../caps_4.2.0_aarch64.xml | 373 -
.../caps_4.2.0_ppc64.replies | 24301 -------------
.../qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1051 -
.../caps_4.2.0_s390x.replies | 22315 ------------
.../qemucapabilitiesdata/caps_4.2.0_s390x.xml | 3187 --
.../caps_4.2.0_x86_64.replies | 26761 --------------
.../caps_4.2.0_x86_64.xml | 2529 --
.../caps_5.0.0_aarch64.replies | 23211 ------------
.../caps_5.0.0_aarch64.xml | 397 -
.../caps_5.0.0_ppc64.replies | 26212 --------------
.../qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1072 -
.../caps_5.0.0_riscv64.replies | 19500 ----------
.../caps_5.0.0_riscv64.xml | 127 -
.../caps_5.0.0_x86_64.replies | 28425 ---------------
.../caps_5.0.0_x86_64.xml | 2834 --
.../caps_5.1.0_x86_64.replies | 29546 ----------------
.../caps_5.1.0_x86_64.xml | 3104 --
...sparc.replies => caps_5.2.0_sparc.replies} | 4 +-
...s_5.1.0_sparc.xml => caps_5.2.0_sparc.xml} | 5 +-
tests/qemusecuritytest.c | 1 -
.../aarch64-gic-default.aarch64-4.2.0.args | 31 -
.../aarch64-gic-default.aarch64-4.2.0.xml | 26 -
.../aarch64-gic-none.aarch64-4.2.0.args | 31 -
.../aarch64-gic-none.aarch64-4.2.0.xml | 26 -
.../aarch64-virt-virtio.aarch64-4.2.0.args | 54 -
.../aarch64-virt-virtio.aarch64-4.2.0.xml | 94 -
.../audio-default-sdl.x86_64-4.2.0.args | 37 -
.../audio-default-sdl.x86_64-4.2.0.xml | 44 -
.../audio-default-spice.x86_64-4.2.0.args | 36 -
.../audio-default-spice.x86_64-4.2.0.xml | 46 -
.../audio-default-vnc.x86_64-4.2.0.args | 36 -
.../audio-default-vnc.x86_64-4.2.0.xml | 46 -
...-host-model-fallback-kvm.x86_64-4.2.0.args | 33 -
...u-host-model-fallback-kvm.x86_64-4.2.0.xml | 29 -
...-host-model-fallback-kvm.x86_64-5.0.0.args | 33 -
...u-host-model-fallback-kvm.x86_64-5.0.0.xml | 29 -
...-host-model-fallback-kvm.x86_64-5.1.0.args | 33 -
...u-host-model-fallback-kvm.x86_64-5.1.0.xml | 29 -
...-host-model-fallback-tcg.x86_64-4.2.0.args | 33 -
...u-host-model-fallback-tcg.x86_64-4.2.0.xml | 29 -
...-host-model-fallback-tcg.x86_64-5.0.0.args | 33 -
...u-host-model-fallback-tcg.x86_64-5.0.0.xml | 29 -
...-host-model-fallback-tcg.x86_64-5.1.0.args | 33 -
...u-host-model-fallback-tcg.x86_64-5.1.0.xml | 29 -
.../cpu-host-model-kvm.x86_64-4.2.0.args | 38 -
.../cpu-host-model-kvm.x86_64-4.2.0.xml | 48 -
.../cpu-host-model-kvm.x86_64-5.0.0.args | 38 -
.../cpu-host-model-kvm.x86_64-5.0.0.xml | 48 -
.../cpu-host-model-kvm.x86_64-5.1.0.args | 38 -
.../cpu-host-model-kvm.x86_64-5.1.0.xml | 48 -
...ost-model-nofallback-kvm.x86_64-4.2.0.args | 33 -
...host-model-nofallback-kvm.x86_64-4.2.0.xml | 29 -
...ost-model-nofallback-kvm.x86_64-5.0.0.args | 33 -
...host-model-nofallback-kvm.x86_64-5.0.0.xml | 29 -
...ost-model-nofallback-kvm.x86_64-5.1.0.args | 33 -
...host-model-nofallback-kvm.x86_64-5.1.0.xml | 29 -
...ost-model-nofallback-tcg.x86_64-4.2.0.args | 33 -
...host-model-nofallback-tcg.x86_64-4.2.0.xml | 29 -
...ost-model-nofallback-tcg.x86_64-5.0.0.args | 33 -
...host-model-nofallback-tcg.x86_64-5.0.0.xml | 29 -
...ost-model-nofallback-tcg.x86_64-5.1.0.args | 33 -
...host-model-nofallback-tcg.x86_64-5.1.0.xml | 29 -
.../cpu-host-model-tcg.x86_64-4.2.0.args | 38 -
.../cpu-host-model-tcg.x86_64-4.2.0.xml | 48 -
.../cpu-host-model-tcg.x86_64-5.0.0.args | 38 -
.../cpu-host-model-tcg.x86_64-5.0.0.xml | 48 -
.../cpu-host-model-tcg.x86_64-5.1.0.args | 38 -
.../cpu-host-model-tcg.x86_64-5.1.0.xml | 48 -
...isk-network-tlsx509-vxhs.x86_64-5.0.0.args | 45 -
...disk-network-tlsx509-vxhs.x86_64-5.0.0.xml | 56 -
.../disk-network-tlsx509-vxhs.xml | 50 -
.../disk-network-vxhs.x86_64-5.0.0.args | 35 -
.../disk-network-vxhs.x86_64-5.0.0.xml | 38 -
tests/qemuxmlconfdata/disk-network-vxhs.xml | 32 -
.../disk-vhostuser-numa.x86_64-4.2.0.args | 39 -
.../disk-vhostuser-numa.x86_64-4.2.0.xml | 48 -
.../fips-enabled.x86_64-5.1.0.args | 37 -
.../fips-enabled.x86_64-5.1.0.xml | 40 -
...dev-scsi-vhost-scsi-pcie.x86_64-4.2.0.args | 36 -
...tdev-scsi-vhost-scsi-pcie.x86_64-4.2.0.xml | 45 -
.../hugepages-memaccess3.x86_64-5.1.0.err | 1 -
...iothreads-disk-virtio-ccw.s390x-4.2.0.args | 39 -
.../iothreads-disk-virtio-ccw.s390x-4.2.0.xml | 41 -
.../iothreads-disk-virtio-ccw.xml | 34 -
...acpi-root-hotplug-disable.x86_64-5.1.0.err | 1 -
...-acpi-root-hotplug-enable.x86_64-5.1.0.err | 1 -
.../pseries-features.ppc64-4.2.0.args | 30 -
.../pseries-features.ppc64-4.2.0.xml | 40 -
...q35-default-devices-only.x86_64-4.2.0.args | 38 -
.../q35-default-devices-only.x86_64-4.2.0.xml | 50 -
.../q35-multifunction.x86_64-4.2.0.args | 53 -
.../q35-multifunction.x86_64-4.2.0.xml | 125 -
.../q35-pcie-autoadd.x86_64-4.2.0.args | 67 -
.../q35-pcie-autoadd.x86_64-4.2.0.xml | 154 -
.../q35-pcie.x86_64-4.2.0.args | 68 -
.../qemuxmlconfdata/q35-pcie.x86_64-4.2.0.xml | 158 -
.../q35-virt-manager-basic.x86_64-4.2.0.args | 63 -
.../q35-virt-manager-basic.x86_64-4.2.0.xml | 128 -
.../sound-device.x86_64-4.2.0.args | 49 -
.../sound-device.x86_64-4.2.0.xml | 61 -
...alloon-freepage-reporting.x86_64-5.0.0.err | 1 -
tests/qemuxmlconftest.c | 47 -
110 files changed, 11 insertions(+), 240326 deletions(-)
rename tests/domaincapsdata/{qemu_5.1.0.sparc.xml => qemu_5.2.0.sparc.xml} (100%)
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_aarch64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_ppc64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_s390x.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_s390x.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_x86_64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_aarch64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_ppc64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_riscv64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_x86_64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml
delete mode 100644 tests/qemucapabilitiesdata/caps_5.1.0_x86_64.replies
delete mode 100644 tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml
rename tests/qemucapabilitiesdata/{caps_5.1.0_sparc.replies => caps_5.2.0_sparc.replies} (99%)
rename tests/qemucapabilitiesdata/{caps_5.1.0_sparc.xml => caps_5.2.0_sparc.xml} (96%)
delete mode 100644 tests/qemuxmlconfdata/aarch64-gic-default.aarch64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/aarch64-gic-default.aarch64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/aarch64-gic-none.aarch64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/aarch64-gic-none.aarch64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/aarch64-virt-virtio.aarch64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/aarch64-virt-virtio.aarch64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/audio-default-sdl.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/audio-default-sdl.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/audio-default-spice.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/audio-default-spice.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/audio-default-vnc.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/audio-default-vnc.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-kvm.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-fallback-tcg.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-kvm.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-kvm.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-nofallback-tcg.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/cpu-host-model-tcg.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/disk-network-tlsx509-vxhs.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/disk-network-tlsx509-vxhs.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/disk-network-tlsx509-vxhs.xml
delete mode 100644 tests/qemuxmlconfdata/disk-network-vxhs.x86_64-5.0.0.args
delete mode 100644 tests/qemuxmlconfdata/disk-network-vxhs.x86_64-5.0.0.xml
delete mode 100644 tests/qemuxmlconfdata/disk-network-vxhs.xml
delete mode 100644 tests/qemuxmlconfdata/disk-vhostuser-numa.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/disk-vhostuser-numa.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/fips-enabled.x86_64-5.1.0.args
delete mode 100644 tests/qemuxmlconfdata/fips-enabled.x86_64-5.1.0.xml
delete mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-scsi-pcie.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/hostdev-scsi-vhost-scsi-pcie.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/hugepages-memaccess3.x86_64-5.1.0.err
delete mode 100644 tests/qemuxmlconfdata/iothreads-disk-virtio-ccw.s390x-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/iothreads-disk-virtio-ccw.s390x-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/iothreads-disk-virtio-ccw.xml
delete mode 100644 tests/qemuxmlconfdata/pc-i440fx-acpi-root-hotplug-disable.x86_64-5.1.0.err
delete mode 100644 tests/qemuxmlconfdata/pc-i440fx-acpi-root-hotplug-enable.x86_64-5.1.0.err
delete mode 100644 tests/qemuxmlconfdata/pseries-features.ppc64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/pseries-features.ppc64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/q35-default-devices-only.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/q35-default-devices-only.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/q35-multifunction.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/q35-multifunction.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/q35-pcie-autoadd.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/q35-pcie-autoadd.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/q35-pcie.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/q35-pcie.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/q35-virt-manager-basic.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/q35-virt-manager-basic.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/sound-device.x86_64-4.2.0.args
delete mode 100644 tests/qemuxmlconfdata/sound-device.x86_64-4.2.0.xml
delete mode 100644 tests/qemuxmlconfdata/virtio-options-memballoon-freepage-reporting.x86_64-5.0.0.err
--
2.44.2
2
18
[PATCH] qemucapabilitiestest: Add 'qemu_9.0.0.sparc' capabilities from TCG
by Peter Krempa 01 Jul '24
by Peter Krempa 01 Jul '24
01 Jul '24
As I don't have a sparc machine handy add emulated capabilities.
This patch is in preparation for bumping minimum qemu version beyond the
oldest 'sparc' caps we currently have.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
tests/domaincapsdata/qemu_9.0.0.sparc.xml | 144 +
.../caps_9.0.0_sparc.replies | 26229 ++++++++++++++++
.../qemucapabilitiesdata/caps_9.0.0_sparc.xml | 96 +
.../sparc-minimal.sparc-latest.args | 12 +-
4 files changed, 26475 insertions(+), 6 deletions(-)
create mode 100644 tests/domaincapsdata/qemu_9.0.0.sparc.xml
create mode 100644 tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies
create mode 100644 tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
diff --git a/tests/domaincapsdata/qemu_9.0.0.sparc.xml b/tests/domaincapsdata/qemu_9.0.0.sparc.xml
new file mode 100644
index 0000000000..7e9f66fd25
--- /dev/null
+++ b/tests/domaincapsdata/qemu_9.0.0.sparc.xml
@@ -0,0 +1,144 @@
+<domainCapabilities>
+ <path>/usr/bin/qemu-system-sparc</path>
+ <domain>kvm</domain>
+ <machine>SS-5</machine>
+ <arch>sparc</arch>
+ <iothreads supported='yes'/>
+ <os supported='yes'>
+ <enum name='firmware'/>
+ <loader supported='yes'>
+ <value>/obviously/fake/firmware1.fd</value>
+ <value>/obviously/fake/firmware2.fd</value>
+ <enum name='type'>
+ <value>rom</value>
+ <value>pflash</value>
+ </enum>
+ <enum name='readonly'>
+ <value>yes</value>
+ <value>no</value>
+ </enum>
+ <enum name='secure'>
+ <value>no</value>
+ </enum>
+ </loader>
+ </os>
+ <cpu>
+ <mode name='host-passthrough' supported='yes'>
+ <enum name='hostPassthroughMigratable'>
+ <value>off</value>
+ </enum>
+ </mode>
+ <mode name='maximum' supported='no'/>
+ <mode name='host-model' supported='no'/>
+ <mode name='custom' supported='no'/>
+ </cpu>
+ <memoryBacking supported='yes'>
+ <enum name='sourceType'>
+ <value>file</value>
+ <value>anonymous</value>
+ <value>memfd</value>
+ </enum>
+ </memoryBacking>
+ <devices>
+ <disk supported='yes'>
+ <enum name='diskDevice'>
+ <value>disk</value>
+ <value>cdrom</value>
+ <value>floppy</value>
+ <value>lun</value>
+ </enum>
+ <enum name='bus'>
+ <value>fdc</value>
+ <value>scsi</value>
+ <value>virtio</value>
+ </enum>
+ <enum name='model'>
+ <value>virtio</value>
+ </enum>
+ </disk>
+ <graphics supported='yes'>
+ <enum name='type'>
+ <value>sdl</value>
+ <value>vnc</value>
+ <value>spice</value>
+ <value>egl-headless</value>
+ <value>dbus</value>
+ </enum>
+ </graphics>
+ <video supported='yes'>
+ <enum name='modelType'>
+ <value>none</value>
+ </enum>
+ </video>
+ <hostdev supported='yes'>
+ <enum name='mode'>
+ <value>subsystem</value>
+ </enum>
+ <enum name='startupPolicy'>
+ <value>default</value>
+ <value>mandatory</value>
+ <value>requisite</value>
+ <value>optional</value>
+ </enum>
+ <enum name='subsysType'>
+ <value>pci</value>
+ <value>scsi</value>
+ </enum>
+ <enum name='capsType'/>
+ <enum name='pciBackend'>
+ <value>default</value>
+ <value>vfio</value>
+ </enum>
+ </hostdev>
+ <rng supported='yes'>
+ <enum name='model'/>
+ <enum name='backendModel'>
+ <value>random</value>
+ <value>egd</value>
+ <value>builtin</value>
+ </enum>
+ </rng>
+ <filesystem supported='yes'>
+ <enum name='driverType'>
+ <value>path</value>
+ <value>handle</value>
+ </enum>
+ </filesystem>
+ <tpm supported='no'/>
+ <redirdev supported='no'/>
+ <channel supported='yes'>
+ <enum name='type'>
+ <value>pty</value>
+ <value>unix</value>
+ <value>spicevmc</value>
+ </enum>
+ </channel>
+ <crypto supported='yes'>
+ <enum name='model'/>
+ <enum name='type'>
+ <value>qemu</value>
+ </enum>
+ <enum name='backendModel'>
+ <value>builtin</value>
+ <value>lkcf</value>
+ </enum>
+ </crypto>
+ <interface supported='yes'>
+ <enum name='backendType'>
+ <value>default</value>
+ <value>passt</value>
+ </enum>
+ </interface>
+ </devices>
+ <features>
+ <gic supported='no'/>
+ <vmcoreinfo supported='no'/>
+ <genid supported='no'/>
+ <backingStoreInput supported='yes'/>
+ <backup supported='yes'/>
+ <async-teardown supported='yes'/>
+ <sev supported='no'/>
+ <sgx supported='no'/>
+ <launchSecurity supported='no'/>
+ </features>
+</domainCapabilities>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies
new file mode 100644
index 0000000000..9ddfcfae21
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.replies
@@ -0,0 +1,26229 @@
+{
+ "execute": "qmp_capabilities",
+ "id": "libvirt-1"
+}
+
+{
+ "return": {},
+ "id": "libvirt-1"
+}
+
+{
+ "execute": "query-version",
+ "id": "libvirt-2"
+}
+
+{
+ "return": {
+ "qemu": {
+ "micro": 0,
+ "minor": 0,
+ "major": 9
+ },
+ "package": "qemu-9.0.0-1.fc40"
+ },
+ "id": "libvirt-2"
+}
+
+{
+ "execute": "query-target",
+ "id": "libvirt-3"
+}
+
+{
+ "return": {
+ "arch": "sparc"
+ },
+ "id": "libvirt-3"
+}
+
+{
+ "execute": "query-qmp-schema",
+ "id": "libvirt-4"
+}
+
+{
+ "return": [
+ {
+ "name": "query-status",
+ "ret-type": "1",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "SHUTDOWN",
+ "meta-type": "event",
+ "arg-type": "2"
+ },
+ {
+ "name": "POWERDOWN",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "RESET",
+ "meta-type": "event",
+ "arg-type": "3"
+ },
+ {
+ "name": "STOP",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "RESUME",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "SUSPEND",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "SUSPEND_DISK",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "WAKEUP",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "WATCHDOG",
+ "meta-type": "event",
+ "arg-type": "4"
+ },
+ {
+ "name": "watchdog-set-action",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "5"
+ },
+ {
+ "name": "set-action",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "6"
+ },
+ {
+ "name": "GUEST_PANICKED",
+ "meta-type": "event",
+ "arg-type": "7"
+ },
+ {
+ "name": "GUEST_CRASHLOADED",
+ "meta-type": "event",
+ "arg-type": "8"
+ },
+ {
+ "name": "MEMORY_FAILURE",
+ "meta-type": "event",
+ "arg-type": "9"
+ },
+ {
+ "name": "JOB_STATUS_CHANGE",
+ "meta-type": "event",
+ "arg-type": "10"
+ },
+ {
+ "name": "job-pause",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "11"
+ },
+ {
+ "name": "job-resume",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "12"
+ },
+ {
+ "name": "job-cancel",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "13"
+ },
+ {
+ "name": "job-complete",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "14"
+ },
+ {
+ "name": "job-dismiss",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "15"
+ },
+ {
+ "name": "job-finalize",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "16"
+ },
+ {
+ "name": "query-jobs",
+ "ret-type": "[17]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-pr-managers",
+ "ret-type": "[18]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "eject",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "19"
+ },
+ {
+ "name": "blockdev-open-tray",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "20"
+ },
+ {
+ "name": "blockdev-close-tray",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "21"
+ },
+ {
+ "name": "blockdev-remove-medium",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "22"
+ },
+ {
+ "name": "blockdev-insert-medium",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "23"
+ },
+ {
+ "name": "blockdev-change-medium",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "24"
+ },
+ {
+ "name": "DEVICE_TRAY_MOVED",
+ "meta-type": "event",
+ "arg-type": "25"
+ },
+ {
+ "name": "PR_MANAGER_STATUS_CHANGED",
+ "meta-type": "event",
+ "arg-type": "26"
+ },
+ {
+ "name": "block_set_io_throttle",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "27"
+ },
+ {
+ "name": "block-latency-histogram-set",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "28"
+ },
+ {
+ "name": "query-block",
+ "ret-type": "[29]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-blockstats",
+ "ret-type": "[31]",
+ "meta-type": "command",
+ "arg-type": "30"
+ },
+ {
+ "name": "query-block-jobs",
+ "ret-type": "[32]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "block_resize",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "33"
+ },
+ {
+ "name": "blockdev-snapshot-sync",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "34"
+ },
+ {
+ "name": "blockdev-snapshot",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "35",
+ "features": [
+ "allow-write-only-overlay"
+ ]
+ },
+ {
+ "name": "change-backing-file",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "36"
+ },
+ {
+ "name": "block-commit",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "37"
+ },
+ {
+ "name": "drive-backup",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "38",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "blockdev-backup",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "39"
+ },
+ {
+ "name": "query-named-block-nodes",
+ "ret-type": "[41]",
+ "meta-type": "command",
+ "arg-type": "40"
+ },
+ {
+ "name": "x-debug-query-block-graph",
+ "ret-type": "42",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "drive-mirror",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "43"
+ },
+ {
+ "name": "block-dirty-bitmap-add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "44"
+ },
+ {
+ "name": "block-dirty-bitmap-remove",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "45"
+ },
+ {
+ "name": "block-dirty-bitmap-clear",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "45"
+ },
+ {
+ "name": "block-dirty-bitmap-enable",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "45"
+ },
+ {
+ "name": "block-dirty-bitmap-disable",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "45"
+ },
+ {
+ "name": "block-dirty-bitmap-merge",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "46"
+ },
+ {
+ "name": "x-debug-block-dirty-bitmap-sha256",
+ "ret-type": "47",
+ "meta-type": "command",
+ "arg-type": "45",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "blockdev-mirror",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "48"
+ },
+ {
+ "name": "block-stream",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "49"
+ },
+ {
+ "name": "block-job-set-speed",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "50"
+ },
+ {
+ "name": "block-job-cancel",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "51"
+ },
+ {
+ "name": "block-job-pause",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "52"
+ },
+ {
+ "name": "block-job-resume",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "53"
+ },
+ {
+ "name": "block-job-complete",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "54"
+ },
+ {
+ "name": "block-job-dismiss",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "55"
+ },
+ {
+ "name": "block-job-finalize",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "56"
+ },
+ {
+ "name": "block-job-change",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "57"
+ },
+ {
+ "name": "blockdev-add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "58"
+ },
+ {
+ "name": "blockdev-reopen",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "59"
+ },
+ {
+ "name": "blockdev-del",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "60"
+ },
+ {
+ "name": "blockdev-create",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "61"
+ },
+ {
+ "name": "x-blockdev-amend",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "62",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "BLOCK_IMAGE_CORRUPTED",
+ "meta-type": "event",
+ "arg-type": "63"
+ },
+ {
+ "name": "BLOCK_IO_ERROR",
+ "meta-type": "event",
+ "arg-type": "64"
+ },
+ {
+ "name": "BLOCK_JOB_COMPLETED",
+ "meta-type": "event",
+ "arg-type": "65"
+ },
+ {
+ "name": "BLOCK_JOB_CANCELLED",
+ "meta-type": "event",
+ "arg-type": "66"
+ },
+ {
+ "name": "BLOCK_JOB_ERROR",
+ "meta-type": "event",
+ "arg-type": "67"
+ },
+ {
+ "name": "BLOCK_JOB_READY",
+ "meta-type": "event",
+ "arg-type": "68"
+ },
+ {
+ "name": "BLOCK_JOB_PENDING",
+ "meta-type": "event",
+ "arg-type": "69"
+ },
+ {
+ "name": "BLOCK_WRITE_THRESHOLD",
+ "meta-type": "event",
+ "arg-type": "70"
+ },
+ {
+ "name": "block-set-write-threshold",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "71"
+ },
+ {
+ "name": "x-blockdev-change",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "72",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-blockdev-set-iothread",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "73",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "QUORUM_FAILURE",
+ "meta-type": "event",
+ "arg-type": "74"
+ },
+ {
+ "name": "QUORUM_REPORT_BAD",
+ "meta-type": "event",
+ "arg-type": "75"
+ },
+ {
+ "name": "blockdev-snapshot-internal-sync",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "76"
+ },
+ {
+ "name": "blockdev-snapshot-delete-internal-sync",
+ "ret-type": "78",
+ "meta-type": "command",
+ "arg-type": "77"
+ },
+ {
+ "name": "nbd-server-start",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "79"
+ },
+ {
+ "name": "nbd-server-add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "80",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "nbd-server-remove",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "81",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "nbd-server-stop",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "block-export-add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "82"
+ },
+ {
+ "name": "block-export-del",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "83"
+ },
+ {
+ "name": "BLOCK_EXPORT_DELETED",
+ "meta-type": "event",
+ "arg-type": "84"
+ },
+ {
+ "name": "query-block-exports",
+ "ret-type": "[85]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-chardev",
+ "ret-type": "[86]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-chardev-backends",
+ "ret-type": "[87]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "ringbuf-write",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "88"
+ },
+ {
+ "name": "ringbuf-read",
+ "ret-type": "str",
+ "meta-type": "command",
+ "arg-type": "89"
+ },
+ {
+ "name": "chardev-add",
+ "ret-type": "91",
+ "meta-type": "command",
+ "arg-type": "90"
+ },
+ {
+ "name": "chardev-change",
+ "ret-type": "91",
+ "meta-type": "command",
+ "arg-type": "92"
+ },
+ {
+ "name": "chardev-remove",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "93"
+ },
+ {
+ "name": "chardev-send-break",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "94"
+ },
+ {
+ "name": "VSERPORT_CHANGE",
+ "meta-type": "event",
+ "arg-type": "95"
+ },
+ {
+ "name": "dump-guest-memory",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "96"
+ },
+ {
+ "name": "query-dump",
+ "ret-type": "97",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "DUMP_COMPLETED",
+ "meta-type": "event",
+ "arg-type": "98"
+ },
+ {
+ "name": "query-dump-guest-memory-capability",
+ "ret-type": "99",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "set_link",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "100"
+ },
+ {
+ "name": "netdev_add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "101"
+ },
+ {
+ "name": "netdev_del",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "102"
+ },
+ {
+ "name": "query-rx-filter",
+ "ret-type": "[104]",
+ "meta-type": "command",
+ "arg-type": "103"
+ },
+ {
+ "name": "NIC_RX_FILTER_CHANGED",
+ "meta-type": "event",
+ "arg-type": "105"
+ },
+ {
+ "name": "announce-self",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "106"
+ },
+ {
+ "name": "FAILOVER_NEGOTIATED",
+ "meta-type": "event",
+ "arg-type": "107"
+ },
+ {
+ "name": "NETDEV_STREAM_CONNECTED",
+ "meta-type": "event",
+ "arg-type": "108"
+ },
+ {
+ "name": "NETDEV_STREAM_DISCONNECTED",
+ "meta-type": "event",
+ "arg-type": "109"
+ },
+ {
+ "name": "request-ebpf",
+ "ret-type": "111",
+ "meta-type": "command",
+ "arg-type": "110"
+ },
+ {
+ "name": "RDMA_GID_STATUS_CHANGED",
+ "meta-type": "event",
+ "arg-type": "112"
+ },
+ {
+ "name": "query-rocker",
+ "ret-type": "114",
+ "meta-type": "command",
+ "arg-type": "113"
+ },
+ {
+ "name": "query-rocker-ports",
+ "ret-type": "[116]",
+ "meta-type": "command",
+ "arg-type": "115"
+ },
+ {
+ "name": "query-rocker-of-dpa-flows",
+ "ret-type": "[118]",
+ "meta-type": "command",
+ "arg-type": "117"
+ },
+ {
+ "name": "query-rocker-of-dpa-groups",
+ "ret-type": "[120]",
+ "meta-type": "command",
+ "arg-type": "119"
+ },
+ {
+ "name": "query-tpm-models",
+ "ret-type": "[121]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-tpm-types",
+ "ret-type": "[122]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-tpm",
+ "ret-type": "[123]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "set_password",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "124"
+ },
+ {
+ "name": "expire_password",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "125"
+ },
+ {
+ "name": "screendump",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "126"
+ },
+ {
+ "name": "query-spice",
+ "ret-type": "127",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "SPICE_CONNECTED",
+ "meta-type": "event",
+ "arg-type": "128"
+ },
+ {
+ "name": "SPICE_INITIALIZED",
+ "meta-type": "event",
+ "arg-type": "129"
+ },
+ {
+ "name": "SPICE_DISCONNECTED",
+ "meta-type": "event",
+ "arg-type": "130"
+ },
+ {
+ "name": "SPICE_MIGRATE_COMPLETED",
+ "meta-type": "event",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-vnc",
+ "ret-type": "131",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-vnc-servers",
+ "ret-type": "[132]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "change-vnc-password",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "133"
+ },
+ {
+ "name": "VNC_CONNECTED",
+ "meta-type": "event",
+ "arg-type": "134"
+ },
+ {
+ "name": "VNC_INITIALIZED",
+ "meta-type": "event",
+ "arg-type": "135"
+ },
+ {
+ "name": "VNC_DISCONNECTED",
+ "meta-type": "event",
+ "arg-type": "136"
+ },
+ {
+ "name": "query-mice",
+ "ret-type": "[137]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "send-key",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "138"
+ },
+ {
+ "name": "input-send-event",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "139"
+ },
+ {
+ "name": "query-display-options",
+ "ret-type": "140",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "display-reload",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "141"
+ },
+ {
+ "name": "display-update",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "142"
+ },
+ {
+ "name": "client_migrate_info",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "143"
+ },
+ {
+ "name": "query-migrate",
+ "ret-type": "144",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "migrate-set-capabilities",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "145"
+ },
+ {
+ "name": "query-migrate-capabilities",
+ "ret-type": "[146]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "migrate-set-parameters",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "147"
+ },
+ {
+ "name": "query-migrate-parameters",
+ "ret-type": "148",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "migrate-start-postcopy",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "MIGRATION",
+ "meta-type": "event",
+ "arg-type": "149"
+ },
+ {
+ "name": "MIGRATION_PASS",
+ "meta-type": "event",
+ "arg-type": "150"
+ },
+ {
+ "name": "COLO_EXIT",
+ "meta-type": "event",
+ "arg-type": "151"
+ },
+ {
+ "name": "x-colo-lost-heartbeat",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "migrate_cancel",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "migrate-continue",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "152"
+ },
+ {
+ "name": "migrate",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "153"
+ },
+ {
+ "name": "migrate-incoming",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "154"
+ },
+ {
+ "name": "xen-save-devices-state",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "155"
+ },
+ {
+ "name": "xen-set-global-dirty-log",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "156"
+ },
+ {
+ "name": "xen-load-devices-state",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "157"
+ },
+ {
+ "name": "xen-set-replication",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "158"
+ },
+ {
+ "name": "query-xen-replication-status",
+ "ret-type": "159",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "xen-colo-do-checkpoint",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-colo-status",
+ "ret-type": "160",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "migrate-recover",
+ "ret-type": "0",
+ "allow-oob": true,
+ "meta-type": "command",
+ "arg-type": "161"
+ },
+ {
+ "name": "migrate-pause",
+ "ret-type": "0",
+ "allow-oob": true,
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "UNPLUG_PRIMARY",
+ "meta-type": "event",
+ "arg-type": "162"
+ },
+ {
+ "name": "calc-dirty-rate",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "163"
+ },
+ {
+ "name": "query-dirty-rate",
+ "ret-type": "165",
+ "meta-type": "command",
+ "arg-type": "164"
+ },
+ {
+ "name": "set-vcpu-dirty-limit",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "166"
+ },
+ {
+ "name": "cancel-vcpu-dirty-limit",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "167"
+ },
+ {
+ "name": "query-vcpu-dirty-limit",
+ "ret-type": "[168]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-migrationthreads",
+ "ret-type": "[169]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "snapshot-save",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "170"
+ },
+ {
+ "name": "snapshot-load",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "171"
+ },
+ {
+ "name": "snapshot-delete",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "172"
+ },
+ {
+ "name": "transaction",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "173"
+ },
+ {
+ "name": "trace-event-get-state",
+ "ret-type": "[175]",
+ "meta-type": "command",
+ "arg-type": "174"
+ },
+ {
+ "name": "trace-event-set-state",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "176"
+ },
+ {
+ "name": "qmp_capabilities",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "177"
+ },
+ {
+ "name": "query-version",
+ "ret-type": "178",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-commands",
+ "ret-type": "[179]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "quit",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-qmp-schema",
+ "ret-type": "[180]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "qom-list",
+ "ret-type": "[182]",
+ "meta-type": "command",
+ "arg-type": "181"
+ },
+ {
+ "name": "qom-get",
+ "ret-type": "any",
+ "meta-type": "command",
+ "arg-type": "183"
+ },
+ {
+ "name": "qom-set",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "184"
+ },
+ {
+ "name": "qom-list-types",
+ "ret-type": "[186]",
+ "meta-type": "command",
+ "arg-type": "185"
+ },
+ {
+ "name": "qom-list-properties",
+ "ret-type": "[182]",
+ "meta-type": "command",
+ "arg-type": "187"
+ },
+ {
+ "name": "object-add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "188"
+ },
+ {
+ "name": "object-del",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "189"
+ },
+ {
+ "name": "device-list-properties",
+ "ret-type": "[182]",
+ "meta-type": "command",
+ "arg-type": "190"
+ },
+ {
+ "name": "device_add",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "191",
+ "features": [
+ "json-cli",
+ "json-cli-hotplug"
+ ]
+ },
+ {
+ "name": "device_del",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "192"
+ },
+ {
+ "name": "DEVICE_DELETED",
+ "meta-type": "event",
+ "arg-type": "193"
+ },
+ {
+ "name": "DEVICE_UNPLUG_GUEST_ERROR",
+ "meta-type": "event",
+ "arg-type": "194"
+ },
+ {
+ "name": "query-cpus-fast",
+ "ret-type": "[195]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-machines",
+ "ret-type": "[196]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-current-machine",
+ "ret-type": "197",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-target",
+ "ret-type": "198",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-uuid",
+ "ret-type": "199",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-vm-generation-id",
+ "ret-type": "200",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "system_reset",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "system_powerdown",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "system_wakeup",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "inject-nmi",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-kvm",
+ "ret-type": "201",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "memsave",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "202"
+ },
+ {
+ "name": "pmemsave",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "203"
+ },
+ {
+ "name": "query-memdev",
+ "ret-type": "[204]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-hotpluggable-cpus",
+ "ret-type": "[205]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "set-numa-node",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "206"
+ },
+ {
+ "name": "balloon",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "207"
+ },
+ {
+ "name": "query-balloon",
+ "ret-type": "208",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "BALLOON_CHANGE",
+ "meta-type": "event",
+ "arg-type": "209"
+ },
+ {
+ "name": "query-hv-balloon-status-report",
+ "ret-type": "210",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "HV_BALLOON_STATUS_REPORT",
+ "meta-type": "event",
+ "arg-type": "210"
+ },
+ {
+ "name": "query-memory-size-summary",
+ "ret-type": "211",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-memory-devices",
+ "ret-type": "[212]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "MEMORY_DEVICE_SIZE_CHANGE",
+ "meta-type": "event",
+ "arg-type": "213"
+ },
+ {
+ "name": "MEM_UNPLUG_ERROR",
+ "meta-type": "event",
+ "arg-type": "214",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "x-query-irq",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-jit",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-numa",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-opcount",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-ramblock",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-rdma",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-roms",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-usb",
+ "ret-type": "215",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "dumpdtb",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "216"
+ },
+ {
+ "name": "query-replay",
+ "ret-type": "227",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "replay-break",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "228"
+ },
+ {
+ "name": "replay-delete-break",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "replay-seek",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "229"
+ },
+ {
+ "name": "yank",
+ "ret-type": "0",
+ "allow-oob": true,
+ "meta-type": "command",
+ "arg-type": "230"
+ },
+ {
+ "name": "query-yank",
+ "ret-type": "[231]",
+ "allow-oob": true,
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "add_client",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "232"
+ },
+ {
+ "name": "query-name",
+ "ret-type": "233",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-iothreads",
+ "ret-type": "[234]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "stop",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "cont",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "x-exit-preconfig",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "human-monitor-command",
+ "ret-type": "str",
+ "meta-type": "command",
+ "arg-type": "235",
+ "features": [
+ "savevm-monitor-nodes"
+ ]
+ },
+ {
+ "name": "getfd",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "236"
+ },
+ {
+ "name": "closefd",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "238"
+ },
+ {
+ "name": "add-fd",
+ "ret-type": "240",
+ "meta-type": "command",
+ "arg-type": "239"
+ },
+ {
+ "name": "remove-fd",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "241"
+ },
+ {
+ "name": "query-fdsets",
+ "ret-type": "[242]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-command-line-options",
+ "ret-type": "[244]",
+ "meta-type": "command",
+ "arg-type": "243"
+ },
+ {
+ "name": "RTC_CHANGE",
+ "meta-type": "event",
+ "arg-type": "245"
+ },
+ {
+ "name": "VFU_CLIENT_HANGUP",
+ "meta-type": "event",
+ "arg-type": "246"
+ },
+ {
+ "name": "query-audiodevs",
+ "ret-type": "[258]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-acpi-ospm-status",
+ "ret-type": "[259]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "ACPI_DEVICE_OST",
+ "meta-type": "event",
+ "arg-type": "260"
+ },
+ {
+ "name": "query-pci",
+ "ret-type": "[261]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "query-stats",
+ "ret-type": "[263]",
+ "meta-type": "command",
+ "arg-type": "262"
+ },
+ {
+ "name": "query-stats-schemas",
+ "ret-type": "[265]",
+ "meta-type": "command",
+ "arg-type": "264"
+ },
+ {
+ "name": "x-query-virtio",
+ "ret-type": "[266]",
+ "meta-type": "command",
+ "arg-type": "0",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-virtio-status",
+ "ret-type": "268",
+ "meta-type": "command",
+ "arg-type": "267",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-virtio-queue-status",
+ "ret-type": "270",
+ "meta-type": "command",
+ "arg-type": "269",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-virtio-vhost-queue-status",
+ "ret-type": "272",
+ "meta-type": "command",
+ "arg-type": "271",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-query-virtio-queue-element",
+ "ret-type": "274",
+ "meta-type": "command",
+ "arg-type": "273",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "query-cryptodev",
+ "ret-type": "[275]",
+ "meta-type": "command",
+ "arg-type": "0"
+ },
+ {
+ "name": "cxl-inject-general-media-event",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "276"
+ },
+ {
+ "name": "cxl-inject-dram-event",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "277"
+ },
+ {
+ "name": "cxl-inject-memory-module-event",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "278"
+ },
+ {
+ "name": "cxl-inject-poison",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "279"
+ },
+ {
+ "name": "cxl-inject-uncorrectable-errors",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "280"
+ },
+ {
+ "name": "cxl-inject-correctable-error",
+ "ret-type": "0",
+ "meta-type": "command",
+ "arg-type": "281"
+ },
+ {
+ "name": "0",
+ "members": [],
+ "meta-type": "object"
+ },
+ {
+ "name": "1",
+ "members": [
+ {
+ "name": "running",
+ "type": "bool"
+ },
+ {
+ "name": "status",
+ "type": "282"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "2",
+ "members": [
+ {
+ "name": "guest",
+ "type": "bool"
+ },
+ {
+ "name": "reason",
+ "type": "283"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "3",
+ "members": [
+ {
+ "name": "guest",
+ "type": "bool"
+ },
+ {
+ "name": "reason",
+ "type": "283"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "4",
+ "members": [
+ {
+ "name": "action",
+ "type": "284"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "5",
+ "members": [
+ {
+ "name": "action",
+ "type": "284"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "6",
+ "members": [
+ {
+ "name": "reboot",
+ "default": null,
+ "type": "285"
+ },
+ {
+ "name": "shutdown",
+ "default": null,
+ "type": "286"
+ },
+ {
+ "name": "panic",
+ "default": null,
+ "type": "287"
+ },
+ {
+ "name": "watchdog",
+ "default": null,
+ "type": "284"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "7",
+ "members": [
+ {
+ "name": "action",
+ "type": "288"
+ },
+ {
+ "name": "info",
+ "default": null,
+ "type": "289"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "8",
+ "members": [
+ {
+ "name": "action",
+ "type": "288"
+ },
+ {
+ "name": "info",
+ "default": null,
+ "type": "289"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "9",
+ "members": [
+ {
+ "name": "recipient",
+ "type": "290"
+ },
+ {
+ "name": "action",
+ "type": "291"
+ },
+ {
+ "name": "flags",
+ "type": "292"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "10",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "status",
+ "type": "293"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "11",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "12",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "13",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "14",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "15",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "16",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[17]",
+ "element-type": "17",
+ "meta-type": "array"
+ },
+ {
+ "name": "17",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "status",
+ "type": "293"
+ },
+ {
+ "name": "current-progress",
+ "type": "int"
+ },
+ {
+ "name": "total-progress",
+ "type": "int"
+ },
+ {
+ "name": "error",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[18]",
+ "element-type": "18",
+ "meta-type": "array"
+ },
+ {
+ "name": "18",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "connected",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "19",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "20",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "21",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "22",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "23",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "24",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "read-only-mode",
+ "default": null,
+ "type": "295"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "25",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "tray-open",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "26",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "connected",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "27",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "bps",
+ "type": "int"
+ },
+ {
+ "name": "bps_rd",
+ "type": "int"
+ },
+ {
+ "name": "bps_wr",
+ "type": "int"
+ },
+ {
+ "name": "iops",
+ "type": "int"
+ },
+ {
+ "name": "iops_rd",
+ "type": "int"
+ },
+ {
+ "name": "iops_wr",
+ "type": "int"
+ },
+ {
+ "name": "bps_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_rd_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_wr_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_rd_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_wr_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_rd_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_wr_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_rd_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_wr_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "28",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "boundaries",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "boundaries-read",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "boundaries-write",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "boundaries-zap",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "boundaries-flush",
+ "default": null,
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[29]",
+ "element-type": "29",
+ "meta-type": "array"
+ },
+ {
+ "name": "29",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "qdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ },
+ {
+ "name": "removable",
+ "type": "bool"
+ },
+ {
+ "name": "locked",
+ "type": "bool"
+ },
+ {
+ "name": "inserted",
+ "default": null,
+ "type": "41"
+ },
+ {
+ "name": "tray_open",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "io-status",
+ "default": null,
+ "type": "296"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "30",
+ "members": [
+ {
+ "name": "query-nodes",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[31]",
+ "element-type": "31",
+ "meta-type": "array"
+ },
+ {
+ "name": "31",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "qdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "stats",
+ "type": "297"
+ },
+ {
+ "name": "driver-specific",
+ "default": null,
+ "type": "298"
+ },
+ {
+ "name": "parent",
+ "default": null,
+ "type": "31"
+ },
+ {
+ "name": "backing",
+ "default": null,
+ "type": "31"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[32]",
+ "element-type": "32",
+ "meta-type": "array"
+ },
+ {
+ "name": "32",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "mirror",
+ "type": "299"
+ },
+ {
+ "case": "commit",
+ "type": "0"
+ },
+ {
+ "case": "stream",
+ "type": "0"
+ },
+ {
+ "case": "backup",
+ "type": "0"
+ },
+ {
+ "case": "create",
+ "type": "0"
+ },
+ {
+ "case": "amend",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-load",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-save",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-delete",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "len",
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "type": "int"
+ },
+ {
+ "name": "busy",
+ "type": "bool"
+ },
+ {
+ "name": "paused",
+ "type": "bool"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ },
+ {
+ "name": "io-status",
+ "type": "296"
+ },
+ {
+ "name": "ready",
+ "type": "bool"
+ },
+ {
+ "name": "status",
+ "type": "293"
+ },
+ {
+ "name": "auto-finalize",
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "type": "bool"
+ },
+ {
+ "name": "error",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "33",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "34",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "snapshot-file",
+ "type": "str"
+ },
+ {
+ "name": "snapshot-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "300"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "35",
+ "members": [
+ {
+ "name": "node",
+ "type": "str"
+ },
+ {
+ "name": "overlay",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "36",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "image-node-name",
+ "type": "str"
+ },
+ {
+ "name": "backing-file",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "37",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "base-node",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "base",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "top-node",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "top",
+ "default": null,
+ "type": "str",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-mask-protocol",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "on-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "filter-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "38",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "sync",
+ "type": "302"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bitmap",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "bitmap-mode",
+ "default": null,
+ "type": "303"
+ },
+ {
+ "name": "compress",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "on-source-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "on-target-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "filter-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "x-perf",
+ "default": null,
+ "type": "304",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "target",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "300"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "39",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "sync",
+ "type": "302"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bitmap",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "bitmap-mode",
+ "default": null,
+ "type": "303"
+ },
+ {
+ "name": "compress",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "on-source-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "on-target-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "filter-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "x-perf",
+ "default": null,
+ "type": "304",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "target",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "40",
+ "members": [
+ {
+ "name": "flat",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[41]",
+ "element-type": "41",
+ "meta-type": "array"
+ },
+ {
+ "name": "41",
+ "members": [
+ {
+ "name": "file",
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ro",
+ "type": "bool"
+ },
+ {
+ "name": "drv",
+ "type": "str"
+ },
+ {
+ "name": "backing_file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing_file_depth",
+ "type": "int"
+ },
+ {
+ "name": "encrypted",
+ "type": "bool"
+ },
+ {
+ "name": "detect_zeroes",
+ "type": "305"
+ },
+ {
+ "name": "bps",
+ "type": "int"
+ },
+ {
+ "name": "bps_rd",
+ "type": "int"
+ },
+ {
+ "name": "bps_wr",
+ "type": "int"
+ },
+ {
+ "name": "iops",
+ "type": "int"
+ },
+ {
+ "name": "iops_rd",
+ "type": "int"
+ },
+ {
+ "name": "iops_wr",
+ "type": "int"
+ },
+ {
+ "name": "image",
+ "type": "306"
+ },
+ {
+ "name": "bps_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_rd_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_wr_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_rd_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_wr_max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_rd_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps_wr_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_rd_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_wr_max_length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops_size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cache",
+ "type": "307"
+ },
+ {
+ "name": "write_threshold",
+ "type": "int"
+ },
+ {
+ "name": "dirty-bitmaps",
+ "default": null,
+ "type": "[308]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "42",
+ "members": [
+ {
+ "name": "nodes",
+ "type": "[309]"
+ },
+ {
+ "name": "edges",
+ "type": "[310]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "43",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "target",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "replaces",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sync",
+ "type": "302"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "300"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "granularity",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "buf-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "on-source-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "on-target-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "unmap",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "copy-mode",
+ "default": null,
+ "type": "311"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "44",
+ "members": [
+ {
+ "name": "node",
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "granularity",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "persistent",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "disabled",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "45",
+ "members": [
+ {
+ "name": "node",
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "46",
+ "members": [
+ {
+ "name": "node",
+ "type": "str"
+ },
+ {
+ "name": "target",
+ "type": "str"
+ },
+ {
+ "name": "bitmaps",
+ "type": "[312]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "47",
+ "members": [
+ {
+ "name": "sha256",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "48",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "target",
+ "type": "str"
+ },
+ {
+ "name": "replaces",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sync",
+ "type": "302"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "granularity",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "buf-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "on-source-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "on-target-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "filter-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "copy-mode",
+ "default": null,
+ "type": "311"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "49",
+ "members": [
+ {
+ "name": "job-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "base",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "base-node",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-mask-protocol",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "bottom",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "speed",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "on-error",
+ "default": null,
+ "type": "301"
+ },
+ {
+ "name": "filter-node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "auto-finalize",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-dismiss",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "50",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "51",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "52",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "53",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "54",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "55",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "56",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "57",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "mirror",
+ "type": "313"
+ },
+ {
+ "case": "commit",
+ "type": "0"
+ },
+ {
+ "case": "stream",
+ "type": "0"
+ },
+ {
+ "case": "backup",
+ "type": "0"
+ },
+ {
+ "case": "create",
+ "type": "0"
+ },
+ {
+ "case": "amend",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-load",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-save",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-delete",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "294"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "58",
+ "tag": "driver",
+ "variants": [
+ {
+ "case": "blkdebug",
+ "type": "317"
+ },
+ {
+ "case": "blklogwrites",
+ "type": "318"
+ },
+ {
+ "case": "blkverify",
+ "type": "319"
+ },
+ {
+ "case": "blkreplay",
+ "type": "320"
+ },
+ {
+ "case": "bochs",
+ "type": "321"
+ },
+ {
+ "case": "cloop",
+ "type": "321"
+ },
+ {
+ "case": "compress",
+ "type": "321"
+ },
+ {
+ "case": "copy-before-write",
+ "type": "322"
+ },
+ {
+ "case": "copy-on-read",
+ "type": "323"
+ },
+ {
+ "case": "dmg",
+ "type": "321"
+ },
+ {
+ "case": "file",
+ "type": "324"
+ },
+ {
+ "case": "ftp",
+ "type": "325"
+ },
+ {
+ "case": "ftps",
+ "type": "326"
+ },
+ {
+ "case": "gluster",
+ "type": "327"
+ },
+ {
+ "case": "host_cdrom",
+ "type": "324"
+ },
+ {
+ "case": "host_device",
+ "type": "324"
+ },
+ {
+ "case": "http",
+ "type": "328"
+ },
+ {
+ "case": "https",
+ "type": "329"
+ },
+ {
+ "case": "io_uring",
+ "type": "330"
+ },
+ {
+ "case": "iscsi",
+ "type": "331"
+ },
+ {
+ "case": "luks",
+ "type": "332"
+ },
+ {
+ "case": "nbd",
+ "type": "333"
+ },
+ {
+ "case": "nfs",
+ "type": "334"
+ },
+ {
+ "case": "null-aio",
+ "type": "335"
+ },
+ {
+ "case": "null-co",
+ "type": "335"
+ },
+ {
+ "case": "nvme",
+ "type": "336"
+ },
+ {
+ "case": "nvme-io_uring",
+ "type": "337"
+ },
+ {
+ "case": "parallels",
+ "type": "321"
+ },
+ {
+ "case": "preallocate",
+ "type": "338"
+ },
+ {
+ "case": "qcow2",
+ "type": "339"
+ },
+ {
+ "case": "qcow",
+ "type": "340"
+ },
+ {
+ "case": "qed",
+ "type": "341"
+ },
+ {
+ "case": "quorum",
+ "type": "342"
+ },
+ {
+ "case": "raw",
+ "type": "343"
+ },
+ {
+ "case": "rbd",
+ "type": "344"
+ },
+ {
+ "case": "replication",
+ "type": "345"
+ },
+ {
+ "case": "snapshot-access",
+ "type": "321"
+ },
+ {
+ "case": "ssh",
+ "type": "346"
+ },
+ {
+ "case": "throttle",
+ "type": "347"
+ },
+ {
+ "case": "vdi",
+ "type": "321"
+ },
+ {
+ "case": "vhdx",
+ "type": "321"
+ },
+ {
+ "case": "virtio-blk-vfio-pci",
+ "type": "348"
+ },
+ {
+ "case": "virtio-blk-vhost-user",
+ "type": "349"
+ },
+ {
+ "case": "virtio-blk-vhost-vdpa",
+ "type": "350"
+ },
+ {
+ "case": "vmdk",
+ "type": "341"
+ },
+ {
+ "case": "vpc",
+ "type": "321"
+ },
+ {
+ "case": "vvfat",
+ "type": "351"
+ }
+ ],
+ "members": [
+ {
+ "name": "driver",
+ "type": "314"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "discard",
+ "default": null,
+ "type": "315"
+ },
+ {
+ "name": "cache",
+ "default": null,
+ "type": "316"
+ },
+ {
+ "name": "read-only",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "auto-read-only",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "force-share",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "detect-zeroes",
+ "default": null,
+ "type": "305"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "59",
+ "members": [
+ {
+ "name": "options",
+ "type": "[58]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "60",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "61",
+ "members": [
+ {
+ "name": "job-id",
+ "type": "str"
+ },
+ {
+ "name": "options",
+ "type": "352"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "62",
+ "members": [
+ {
+ "name": "job-id",
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "options",
+ "type": "353"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "63",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "msg",
+ "type": "str"
+ },
+ {
+ "name": "offset",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "fatal",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "64",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "operation",
+ "type": "354"
+ },
+ {
+ "name": "action",
+ "type": "355"
+ },
+ {
+ "name": "nospace",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reason",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "65",
+ "members": [
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "len",
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "type": "int"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ },
+ {
+ "name": "error",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "66",
+ "members": [
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "len",
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "type": "int"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "67",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "operation",
+ "type": "354"
+ },
+ {
+ "name": "action",
+ "type": "355"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "68",
+ "members": [
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "len",
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "type": "int"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "69",
+ "members": [
+ {
+ "name": "type",
+ "type": "294"
+ },
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "70",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "amount-exceeded",
+ "type": "int"
+ },
+ {
+ "name": "write-threshold",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "71",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "write-threshold",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "72",
+ "members": [
+ {
+ "name": "parent",
+ "type": "str"
+ },
+ {
+ "name": "child",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "73",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "iothread",
+ "type": "356"
+ },
+ {
+ "name": "force",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "74",
+ "members": [
+ {
+ "name": "reference",
+ "type": "str"
+ },
+ {
+ "name": "sector-num",
+ "type": "int"
+ },
+ {
+ "name": "sectors-count",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "75",
+ "members": [
+ {
+ "name": "type",
+ "type": "357"
+ },
+ {
+ "name": "error",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "sector-num",
+ "type": "int"
+ },
+ {
+ "name": "sectors-count",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "76",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "77",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "78",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "vm-state-size",
+ "type": "int"
+ },
+ {
+ "name": "date-sec",
+ "type": "int"
+ },
+ {
+ "name": "date-nsec",
+ "type": "int"
+ },
+ {
+ "name": "vm-clock-sec",
+ "type": "int"
+ },
+ {
+ "name": "vm-clock-nsec",
+ "type": "int"
+ },
+ {
+ "name": "icount",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "79",
+ "members": [
+ {
+ "name": "addr",
+ "type": "358"
+ },
+ {
+ "name": "tls-creds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-authz",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "max-connections",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "80",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "description",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "writable",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "bitmap",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "81",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "359"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "82",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "nbd",
+ "type": "361"
+ },
+ {
+ "case": "vhost-user-blk",
+ "type": "362"
+ },
+ {
+ "case": "fuse",
+ "type": "363"
+ },
+ {
+ "case": "vduse-blk",
+ "type": "364"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "360"
+ },
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "fixed-iothread",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "iothread",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "writable",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "writethrough",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "83",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "359"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "84",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[85]",
+ "element-type": "85",
+ "meta-type": "array"
+ },
+ {
+ "name": "85",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "360"
+ },
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "shutting-down",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[86]",
+ "element-type": "86",
+ "meta-type": "array"
+ },
+ {
+ "name": "86",
+ "members": [
+ {
+ "name": "label",
+ "type": "str"
+ },
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "frontend-open",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[87]",
+ "element-type": "87",
+ "meta-type": "array"
+ },
+ {
+ "name": "87",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "88",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "data",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "365"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "89",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "365"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "str",
+ "json-type": "string",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "90",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "backend",
+ "type": "366"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "91",
+ "members": [
+ {
+ "name": "pty",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "92",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "backend",
+ "type": "366"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "93",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "94",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "95",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "open",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "96",
+ "members": [
+ {
+ "name": "paging",
+ "type": "bool"
+ },
+ {
+ "name": "protocol",
+ "type": "str"
+ },
+ {
+ "name": "detach",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "begin",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "367"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "97",
+ "members": [
+ {
+ "name": "status",
+ "type": "368"
+ },
+ {
+ "name": "completed",
+ "type": "int"
+ },
+ {
+ "name": "total",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "98",
+ "members": [
+ {
+ "name": "result",
+ "type": "97"
+ },
+ {
+ "name": "error",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "99",
+ "members": [
+ {
+ "name": "formats",
+ "type": "[367]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "100",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "up",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "101",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "nic",
+ "type": "370"
+ },
+ {
+ "case": "user",
+ "type": "371"
+ },
+ {
+ "case": "tap",
+ "type": "372"
+ },
+ {
+ "case": "l2tpv3",
+ "type": "373"
+ },
+ {
+ "case": "socket",
+ "type": "374"
+ },
+ {
+ "case": "stream",
+ "type": "375"
+ },
+ {
+ "case": "dgram",
+ "type": "376"
+ },
+ {
+ "case": "vde",
+ "type": "377"
+ },
+ {
+ "case": "bridge",
+ "type": "378"
+ },
+ {
+ "case": "hubport",
+ "type": "379"
+ },
+ {
+ "case": "netmap",
+ "type": "380"
+ },
+ {
+ "case": "af-xdp",
+ "type": "381"
+ },
+ {
+ "case": "vhost-user",
+ "type": "382"
+ },
+ {
+ "case": "vhost-vdpa",
+ "type": "383"
+ },
+ {
+ "case": "none",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "369"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "102",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "103",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[104]",
+ "element-type": "104",
+ "meta-type": "array"
+ },
+ {
+ "name": "104",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "promiscuous",
+ "type": "bool"
+ },
+ {
+ "name": "multicast",
+ "type": "387"
+ },
+ {
+ "name": "unicast",
+ "type": "387"
+ },
+ {
+ "name": "vlan",
+ "type": "387"
+ },
+ {
+ "name": "broadcast-allowed",
+ "type": "bool"
+ },
+ {
+ "name": "multicast-overflow",
+ "type": "bool"
+ },
+ {
+ "name": "unicast-overflow",
+ "type": "bool"
+ },
+ {
+ "name": "main-mac",
+ "type": "str"
+ },
+ {
+ "name": "vlan-table",
+ "type": "[int]"
+ },
+ {
+ "name": "unicast-table",
+ "type": "[str]"
+ },
+ {
+ "name": "multicast-table",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "105",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "106",
+ "members": [
+ {
+ "name": "initial",
+ "type": "int"
+ },
+ {
+ "name": "max",
+ "type": "int"
+ },
+ {
+ "name": "rounds",
+ "type": "int"
+ },
+ {
+ "name": "step",
+ "type": "int"
+ },
+ {
+ "name": "interfaces",
+ "default": null,
+ "type": "[str]"
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "107",
+ "members": [
+ {
+ "name": "device-id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "108",
+ "members": [
+ {
+ "name": "netdev-id",
+ "type": "str"
+ },
+ {
+ "name": "addr",
+ "type": "388"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "109",
+ "members": [
+ {
+ "name": "netdev-id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "110",
+ "members": [
+ {
+ "name": "id",
+ "type": "389"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "111",
+ "members": [
+ {
+ "name": "object",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "112",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "gid-status",
+ "type": "bool"
+ },
+ {
+ "name": "subnet-prefix",
+ "type": "int"
+ },
+ {
+ "name": "interface-id",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "113",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "114",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "id",
+ "type": "int"
+ },
+ {
+ "name": "ports",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "115",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[116]",
+ "element-type": "116",
+ "meta-type": "array"
+ },
+ {
+ "name": "116",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "enabled",
+ "type": "bool"
+ },
+ {
+ "name": "link-up",
+ "type": "bool"
+ },
+ {
+ "name": "speed",
+ "type": "int"
+ },
+ {
+ "name": "duplex",
+ "type": "390"
+ },
+ {
+ "name": "autoneg",
+ "type": "391"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "117",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "tbl-id",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[118]",
+ "element-type": "118",
+ "meta-type": "array"
+ },
+ {
+ "name": "118",
+ "members": [
+ {
+ "name": "cookie",
+ "type": "int"
+ },
+ {
+ "name": "hits",
+ "type": "int"
+ },
+ {
+ "name": "key",
+ "type": "392"
+ },
+ {
+ "name": "mask",
+ "type": "393"
+ },
+ {
+ "name": "action",
+ "type": "394"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "119",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[120]",
+ "element-type": "120",
+ "meta-type": "array"
+ },
+ {
+ "name": "120",
+ "members": [
+ {
+ "name": "id",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "int"
+ },
+ {
+ "name": "vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "pport",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "index",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "out-pport",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "set-vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "pop-vlan",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group-ids",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "set-eth-src",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "set-eth-dst",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ttl-check",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[121]",
+ "element-type": "121",
+ "meta-type": "array"
+ },
+ {
+ "name": "121",
+ "members": [
+ {
+ "name": "tpm-tis"
+ },
+ {
+ "name": "tpm-crb"
+ },
+ {
+ "name": "tpm-spapr"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "tpm-tis",
+ "tpm-crb",
+ "tpm-spapr"
+ ]
+ },
+ {
+ "name": "[122]",
+ "element-type": "122",
+ "meta-type": "array"
+ },
+ {
+ "name": "122",
+ "members": [
+ {
+ "name": "passthrough"
+ },
+ {
+ "name": "emulator"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "passthrough",
+ "emulator"
+ ]
+ },
+ {
+ "name": "[123]",
+ "element-type": "123",
+ "meta-type": "array"
+ },
+ {
+ "name": "123",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "model",
+ "type": "121"
+ },
+ {
+ "name": "options",
+ "type": "395"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "124",
+ "tag": "protocol",
+ "variants": [
+ {
+ "case": "vnc",
+ "type": "398"
+ },
+ {
+ "case": "spice",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "protocol",
+ "type": "396"
+ },
+ {
+ "name": "password",
+ "type": "str"
+ },
+ {
+ "name": "connected",
+ "default": null,
+ "type": "397"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "125",
+ "tag": "protocol",
+ "variants": [
+ {
+ "case": "vnc",
+ "type": "399"
+ },
+ {
+ "case": "spice",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "protocol",
+ "type": "396"
+ },
+ {
+ "name": "time",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "126",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "head",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "400"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "127",
+ "members": [
+ {
+ "name": "enabled",
+ "type": "bool"
+ },
+ {
+ "name": "migrated",
+ "type": "bool"
+ },
+ {
+ "name": "host",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tls-port",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "auth",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "compiled-version",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "mouse-mode",
+ "type": "401"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "[402]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "128",
+ "members": [
+ {
+ "name": "server",
+ "type": "403"
+ },
+ {
+ "name": "client",
+ "type": "403"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "129",
+ "members": [
+ {
+ "name": "server",
+ "type": "404"
+ },
+ {
+ "name": "client",
+ "type": "402"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "130",
+ "members": [
+ {
+ "name": "server",
+ "type": "403"
+ },
+ {
+ "name": "client",
+ "type": "403"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "131",
+ "members": [
+ {
+ "name": "enabled",
+ "type": "bool"
+ },
+ {
+ "name": "host",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "default": null,
+ "type": "405"
+ },
+ {
+ "name": "service",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "auth",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "clients",
+ "default": null,
+ "type": "[406]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[132]",
+ "element-type": "132",
+ "meta-type": "array"
+ },
+ {
+ "name": "132",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "server",
+ "type": "[407]"
+ },
+ {
+ "name": "clients",
+ "type": "[406]"
+ },
+ {
+ "name": "auth",
+ "type": "408"
+ },
+ {
+ "name": "vencrypt",
+ "default": null,
+ "type": "409"
+ },
+ {
+ "name": "display",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "133",
+ "members": [
+ {
+ "name": "password",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "134",
+ "members": [
+ {
+ "name": "server",
+ "type": "410"
+ },
+ {
+ "name": "client",
+ "type": "411"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "135",
+ "members": [
+ {
+ "name": "server",
+ "type": "410"
+ },
+ {
+ "name": "client",
+ "type": "406"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "136",
+ "members": [
+ {
+ "name": "server",
+ "type": "410"
+ },
+ {
+ "name": "client",
+ "type": "406"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[137]",
+ "element-type": "137",
+ "meta-type": "array"
+ },
+ {
+ "name": "137",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "index",
+ "type": "int"
+ },
+ {
+ "name": "current",
+ "type": "bool"
+ },
+ {
+ "name": "absolute",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "138",
+ "members": [
+ {
+ "name": "keys",
+ "type": "[412]"
+ },
+ {
+ "name": "hold-time",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "139",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "head",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "events",
+ "type": "[413]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "140",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "gtk",
+ "type": "416"
+ },
+ {
+ "case": "curses",
+ "type": "418"
+ },
+ {
+ "case": "egl-headless",
+ "type": "419"
+ },
+ {
+ "case": "dbus",
+ "type": "420"
+ },
+ {
+ "case": "sdl",
+ "type": "421"
+ },
+ {
+ "case": "default",
+ "type": "0"
+ },
+ {
+ "case": "none",
+ "type": "0"
+ },
+ {
+ "case": "spice-app",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "414"
+ },
+ {
+ "name": "full-screen",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "window-close",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "show-cursor",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "gl",
+ "default": null,
+ "type": "415"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "141",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "vnc",
+ "type": "423"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "422"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "142",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "vnc",
+ "type": "425"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "424"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "143",
+ "members": [
+ {
+ "name": "protocol",
+ "type": "str"
+ },
+ {
+ "name": "hostname",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tls-port",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cert-subject",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "144",
+ "members": [
+ {
+ "name": "status",
+ "default": null,
+ "type": "426"
+ },
+ {
+ "name": "ram",
+ "default": null,
+ "type": "427"
+ },
+ {
+ "name": "disk",
+ "default": null,
+ "type": "427",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "vfio",
+ "default": null,
+ "type": "428"
+ },
+ {
+ "name": "xbzrle-cache",
+ "default": null,
+ "type": "429"
+ },
+ {
+ "name": "total-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "expected-downtime",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "downtime",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "setup-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-percentage",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "error-desc",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "blocked-reasons",
+ "default": null,
+ "type": "[str]"
+ },
+ {
+ "name": "postcopy-blocktime",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "postcopy-vcpu-blocktime",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "compression",
+ "default": null,
+ "type": "430",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "socket-address",
+ "default": null,
+ "type": "[388]"
+ },
+ {
+ "name": "dirty-limit-throttle-time-per-round",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "dirty-limit-ring-full-time",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "145",
+ "members": [
+ {
+ "name": "capabilities",
+ "type": "[146]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[146]",
+ "element-type": "146",
+ "meta-type": "array"
+ },
+ {
+ "name": "146",
+ "members": [
+ {
+ "name": "capability",
+ "type": "431"
+ },
+ {
+ "name": "state",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "147",
+ "members": [
+ {
+ "name": "announce-initial",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-rounds",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-step",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "compress-level",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "compress-threads",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "compress-wait-thread",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "decompress-threads",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "throttle-trigger-threshold",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-initial",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-increment",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-tailslow",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "tls-creds",
+ "default": null,
+ "type": "356"
+ },
+ {
+ "name": "tls-hostname",
+ "default": null,
+ "type": "356"
+ },
+ {
+ "name": "tls-authz",
+ "default": null,
+ "type": "356"
+ },
+ {
+ "name": "max-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "avail-switchover-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "downtime-limit",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "x-checkpoint-delay",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "block-incremental",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "multifd-channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "xbzrle-cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-postcopy-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-cpu-throttle",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "multifd-compression",
+ "default": null,
+ "type": "432"
+ },
+ {
+ "name": "multifd-zlib-level",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "multifd-zstd-level",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "block-bitmap-mapping",
+ "default": null,
+ "type": "[433]"
+ },
+ {
+ "name": "x-vcpu-dirty-limit-period",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "vcpu-dirty-limit",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "434"
+ },
+ {
+ "name": "zero-page-detection",
+ "default": null,
+ "type": "435"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "148",
+ "members": [
+ {
+ "name": "announce-initial",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-rounds",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "announce-step",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "compress-level",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "compress-threads",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "compress-wait-thread",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "decompress-threads",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "throttle-trigger-threshold",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-initial",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-increment",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpu-throttle-tailslow",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "tls-creds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-hostname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-authz",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "max-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "avail-switchover-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "downtime-limit",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "x-checkpoint-delay",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "block-incremental",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "multifd-channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "xbzrle-cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-postcopy-bandwidth",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-cpu-throttle",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "multifd-compression",
+ "default": null,
+ "type": "432"
+ },
+ {
+ "name": "multifd-zlib-level",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "multifd-zstd-level",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "block-bitmap-mapping",
+ "default": null,
+ "type": "[433]"
+ },
+ {
+ "name": "x-vcpu-dirty-limit-period",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "vcpu-dirty-limit",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "434"
+ },
+ {
+ "name": "zero-page-detection",
+ "default": null,
+ "type": "435"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "149",
+ "members": [
+ {
+ "name": "status",
+ "type": "426"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "150",
+ "members": [
+ {
+ "name": "pass",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "151",
+ "members": [
+ {
+ "name": "mode",
+ "type": "436"
+ },
+ {
+ "name": "reason",
+ "type": "437"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "152",
+ "members": [
+ {
+ "name": "state",
+ "type": "426"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "153",
+ "members": [
+ {
+ "name": "uri",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "[438]"
+ },
+ {
+ "name": "blk",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "inc",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "detach",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "resume",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "154",
+ "members": [
+ {
+ "name": "uri",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "[438]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "155",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "live",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "156",
+ "members": [
+ {
+ "name": "enable",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "157",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "158",
+ "members": [
+ {
+ "name": "enable",
+ "type": "bool"
+ },
+ {
+ "name": "primary",
+ "type": "bool"
+ },
+ {
+ "name": "failover",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "159",
+ "members": [
+ {
+ "name": "error",
+ "type": "bool"
+ },
+ {
+ "name": "desc",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "160",
+ "members": [
+ {
+ "name": "mode",
+ "type": "436"
+ },
+ {
+ "name": "last-mode",
+ "type": "436"
+ },
+ {
+ "name": "reason",
+ "type": "437"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "161",
+ "members": [
+ {
+ "name": "uri",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "162",
+ "members": [
+ {
+ "name": "device-id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "163",
+ "members": [
+ {
+ "name": "calc-time",
+ "type": "int"
+ },
+ {
+ "name": "calc-time-unit",
+ "default": null,
+ "type": "439"
+ },
+ {
+ "name": "sample-pages",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "440"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "164",
+ "members": [
+ {
+ "name": "calc-time-unit",
+ "default": null,
+ "type": "439"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "165",
+ "members": [
+ {
+ "name": "dirty-rate",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "status",
+ "type": "441"
+ },
+ {
+ "name": "start-time",
+ "type": "int"
+ },
+ {
+ "name": "calc-time",
+ "type": "int"
+ },
+ {
+ "name": "calc-time-unit",
+ "type": "439"
+ },
+ {
+ "name": "sample-pages",
+ "type": "int"
+ },
+ {
+ "name": "mode",
+ "type": "440"
+ },
+ {
+ "name": "vcpu-dirty-rate",
+ "default": null,
+ "type": "[442]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "166",
+ "members": [
+ {
+ "name": "cpu-index",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "dirty-rate",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "167",
+ "members": [
+ {
+ "name": "cpu-index",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[168]",
+ "element-type": "168",
+ "meta-type": "array"
+ },
+ {
+ "name": "168",
+ "members": [
+ {
+ "name": "cpu-index",
+ "type": "int"
+ },
+ {
+ "name": "limit-rate",
+ "type": "int"
+ },
+ {
+ "name": "current-rate",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[169]",
+ "element-type": "169",
+ "meta-type": "array"
+ },
+ {
+ "name": "169",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "thread-id",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "170",
+ "members": [
+ {
+ "name": "job-id",
+ "type": "str"
+ },
+ {
+ "name": "tag",
+ "type": "str"
+ },
+ {
+ "name": "vmstate",
+ "type": "str"
+ },
+ {
+ "name": "devices",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "171",
+ "members": [
+ {
+ "name": "job-id",
+ "type": "str"
+ },
+ {
+ "name": "tag",
+ "type": "str"
+ },
+ {
+ "name": "vmstate",
+ "type": "str"
+ },
+ {
+ "name": "devices",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "172",
+ "members": [
+ {
+ "name": "job-id",
+ "type": "str"
+ },
+ {
+ "name": "tag",
+ "type": "str"
+ },
+ {
+ "name": "devices",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "173",
+ "members": [
+ {
+ "name": "actions",
+ "type": "[443]"
+ },
+ {
+ "name": "properties",
+ "default": null,
+ "type": "444"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "174",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "vcpu",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[175]",
+ "element-type": "175",
+ "meta-type": "array"
+ },
+ {
+ "name": "175",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "state",
+ "type": "445"
+ },
+ {
+ "name": "vcpu",
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "176",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "enable",
+ "type": "bool"
+ },
+ {
+ "name": "ignore-unavailable",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "vcpu",
+ "default": null,
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "177",
+ "members": [
+ {
+ "name": "enable",
+ "default": null,
+ "type": "[446]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "178",
+ "members": [
+ {
+ "name": "qemu",
+ "type": "447"
+ },
+ {
+ "name": "package",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[179]",
+ "element-type": "179",
+ "meta-type": "array"
+ },
+ {
+ "name": "179",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[180]",
+ "element-type": "180",
+ "meta-type": "array"
+ },
+ {
+ "name": "180",
+ "tag": "meta-type",
+ "variants": [
+ {
+ "case": "builtin",
+ "type": "449"
+ },
+ {
+ "case": "enum",
+ "type": "450"
+ },
+ {
+ "case": "array",
+ "type": "451"
+ },
+ {
+ "case": "object",
+ "type": "452"
+ },
+ {
+ "case": "alternate",
+ "type": "453"
+ },
+ {
+ "case": "command",
+ "type": "454"
+ },
+ {
+ "case": "event",
+ "type": "455"
+ }
+ ],
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "meta-type",
+ "type": "448"
+ },
+ {
+ "name": "features",
+ "default": null,
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "181",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[182]",
+ "element-type": "182",
+ "meta-type": "array"
+ },
+ {
+ "name": "182",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ },
+ {
+ "name": "description",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "default-value",
+ "default": null,
+ "type": "any"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "183",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "property",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "any",
+ "json-type": "value",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "184",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "property",
+ "type": "str"
+ },
+ {
+ "name": "value",
+ "type": "any"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "185",
+ "members": [
+ {
+ "name": "implements",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "abstract",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[186]",
+ "element-type": "186",
+ "meta-type": "array"
+ },
+ {
+ "name": "186",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "abstract",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "parent",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "187",
+ "members": [
+ {
+ "name": "typename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "188",
+ "tag": "qom-type",
+ "variants": [
+ {
+ "case": "acpi-generic-initiator",
+ "type": "457"
+ },
+ {
+ "case": "authz-list",
+ "type": "458"
+ },
+ {
+ "case": "authz-listfile",
+ "type": "459"
+ },
+ {
+ "case": "authz-pam",
+ "type": "460"
+ },
+ {
+ "case": "authz-simple",
+ "type": "461"
+ },
+ {
+ "case": "can-host-socketcan",
+ "type": "462"
+ },
+ {
+ "case": "colo-compare",
+ "type": "463"
+ },
+ {
+ "case": "cryptodev-backend",
+ "type": "464"
+ },
+ {
+ "case": "cryptodev-backend-builtin",
+ "type": "464"
+ },
+ {
+ "case": "cryptodev-backend-lkcf",
+ "type": "464"
+ },
+ {
+ "case": "cryptodev-vhost-user",
+ "type": "465"
+ },
+ {
+ "case": "dbus-vmstate",
+ "type": "466"
+ },
+ {
+ "case": "filter-buffer",
+ "type": "467"
+ },
+ {
+ "case": "filter-dump",
+ "type": "468"
+ },
+ {
+ "case": "filter-mirror",
+ "type": "469"
+ },
+ {
+ "case": "filter-redirector",
+ "type": "470"
+ },
+ {
+ "case": "filter-replay",
+ "type": "471"
+ },
+ {
+ "case": "filter-rewriter",
+ "type": "472"
+ },
+ {
+ "case": "input-barrier",
+ "type": "473"
+ },
+ {
+ "case": "input-linux",
+ "type": "474"
+ },
+ {
+ "case": "iommufd",
+ "type": "475"
+ },
+ {
+ "case": "iothread",
+ "type": "476"
+ },
+ {
+ "case": "main-loop",
+ "type": "477"
+ },
+ {
+ "case": "memory-backend-epc",
+ "type": "478"
+ },
+ {
+ "case": "memory-backend-file",
+ "type": "479"
+ },
+ {
+ "case": "memory-backend-memfd",
+ "type": "480"
+ },
+ {
+ "case": "memory-backend-ram",
+ "type": "481"
+ },
+ {
+ "case": "pr-manager-helper",
+ "type": "482"
+ },
+ {
+ "case": "qtest",
+ "type": "483"
+ },
+ {
+ "case": "rng-builtin",
+ "type": "484"
+ },
+ {
+ "case": "rng-egd",
+ "type": "485"
+ },
+ {
+ "case": "rng-random",
+ "type": "486"
+ },
+ {
+ "case": "secret",
+ "type": "487"
+ },
+ {
+ "case": "secret_keyring",
+ "type": "488"
+ },
+ {
+ "case": "sev-guest",
+ "type": "489"
+ },
+ {
+ "case": "thread-context",
+ "type": "490"
+ },
+ {
+ "case": "throttle-group",
+ "type": "491"
+ },
+ {
+ "case": "tls-creds-anon",
+ "type": "492"
+ },
+ {
+ "case": "tls-creds-psk",
+ "type": "493"
+ },
+ {
+ "case": "tls-creds-x509",
+ "type": "494"
+ },
+ {
+ "case": "tls-cipher-suites",
+ "type": "495"
+ },
+ {
+ "case": "x-remote-object",
+ "type": "496"
+ },
+ {
+ "case": "x-vfio-user-server",
+ "type": "497"
+ },
+ {
+ "case": "can-bus",
+ "type": "0"
+ },
+ {
+ "case": "pef-guest",
+ "type": "0"
+ },
+ {
+ "case": "s390-pv-guest",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "qom-type",
+ "type": "456"
+ },
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "189",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "190",
+ "members": [
+ {
+ "name": "typename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "191",
+ "members": [
+ {
+ "name": "driver",
+ "type": "str"
+ },
+ {
+ "name": "bus",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "192",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "193",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "194",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[195]",
+ "element-type": "195",
+ "meta-type": "array"
+ },
+ {
+ "name": "195",
+ "tag": "target",
+ "variants": [
+ {
+ "case": "s390x",
+ "type": "500"
+ },
+ {
+ "case": "aarch64",
+ "type": "0"
+ },
+ {
+ "case": "alpha",
+ "type": "0"
+ },
+ {
+ "case": "arm",
+ "type": "0"
+ },
+ {
+ "case": "avr",
+ "type": "0"
+ },
+ {
+ "case": "cris",
+ "type": "0"
+ },
+ {
+ "case": "hppa",
+ "type": "0"
+ },
+ {
+ "case": "i386",
+ "type": "0"
+ },
+ {
+ "case": "loongarch64",
+ "type": "0"
+ },
+ {
+ "case": "m68k",
+ "type": "0"
+ },
+ {
+ "case": "microblaze",
+ "type": "0"
+ },
+ {
+ "case": "microblazeel",
+ "type": "0"
+ },
+ {
+ "case": "mips",
+ "type": "0"
+ },
+ {
+ "case": "mips64",
+ "type": "0"
+ },
+ {
+ "case": "mips64el",
+ "type": "0"
+ },
+ {
+ "case": "mipsel",
+ "type": "0"
+ },
+ {
+ "case": "nios2",
+ "type": "0"
+ },
+ {
+ "case": "or1k",
+ "type": "0"
+ },
+ {
+ "case": "ppc",
+ "type": "0"
+ },
+ {
+ "case": "ppc64",
+ "type": "0"
+ },
+ {
+ "case": "riscv32",
+ "type": "0"
+ },
+ {
+ "case": "riscv64",
+ "type": "0"
+ },
+ {
+ "case": "rx",
+ "type": "0"
+ },
+ {
+ "case": "sh4",
+ "type": "0"
+ },
+ {
+ "case": "sh4eb",
+ "type": "0"
+ },
+ {
+ "case": "sparc",
+ "type": "0"
+ },
+ {
+ "case": "sparc64",
+ "type": "0"
+ },
+ {
+ "case": "tricore",
+ "type": "0"
+ },
+ {
+ "case": "x86_64",
+ "type": "0"
+ },
+ {
+ "case": "xtensa",
+ "type": "0"
+ },
+ {
+ "case": "xtensaeb",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "cpu-index",
+ "type": "int"
+ },
+ {
+ "name": "qom-path",
+ "type": "str"
+ },
+ {
+ "name": "thread-id",
+ "type": "int"
+ },
+ {
+ "name": "props",
+ "default": null,
+ "type": "498"
+ },
+ {
+ "name": "target",
+ "type": "499"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[196]",
+ "element-type": "196",
+ "meta-type": "array"
+ },
+ {
+ "name": "196",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "alias",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "is-default",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "cpu-max",
+ "type": "int"
+ },
+ {
+ "name": "hotpluggable-cpus",
+ "type": "bool"
+ },
+ {
+ "name": "numa-mem-supported",
+ "type": "bool"
+ },
+ {
+ "name": "deprecated",
+ "type": "bool"
+ },
+ {
+ "name": "default-cpu-type",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "default-ram-id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "acpi",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "197",
+ "members": [
+ {
+ "name": "wakeup-suspend-support",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "198",
+ "members": [
+ {
+ "name": "arch",
+ "type": "499"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "199",
+ "members": [
+ {
+ "name": "UUID",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "200",
+ "members": [
+ {
+ "name": "guid",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "201",
+ "members": [
+ {
+ "name": "enabled",
+ "type": "bool"
+ },
+ {
+ "name": "present",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "202",
+ "members": [
+ {
+ "name": "val",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "cpu-index",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "203",
+ "members": [
+ {
+ "name": "val",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "filename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[204]",
+ "element-type": "204",
+ "meta-type": "array"
+ },
+ {
+ "name": "204",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "merge",
+ "type": "bool"
+ },
+ {
+ "name": "dump",
+ "type": "bool"
+ },
+ {
+ "name": "prealloc",
+ "type": "bool"
+ },
+ {
+ "name": "share",
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "type": "[int]"
+ },
+ {
+ "name": "policy",
+ "type": "501"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[205]",
+ "element-type": "205",
+ "meta-type": "array"
+ },
+ {
+ "name": "205",
+ "members": [
+ {
+ "name": "type",
+ "type": "str"
+ },
+ {
+ "name": "vcpus-count",
+ "type": "int"
+ },
+ {
+ "name": "props",
+ "type": "498"
+ },
+ {
+ "name": "qom-path",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "206",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "node",
+ "type": "503"
+ },
+ {
+ "case": "dist",
+ "type": "504"
+ },
+ {
+ "case": "cpu",
+ "type": "505"
+ },
+ {
+ "case": "hmat-lb",
+ "type": "506"
+ },
+ {
+ "case": "hmat-cache",
+ "type": "507"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "502"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "207",
+ "members": [
+ {
+ "name": "value",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "208",
+ "members": [
+ {
+ "name": "actual",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "209",
+ "members": [
+ {
+ "name": "actual",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "210",
+ "members": [
+ {
+ "name": "committed",
+ "type": "int"
+ },
+ {
+ "name": "available",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "211",
+ "members": [
+ {
+ "name": "base-memory",
+ "type": "int"
+ },
+ {
+ "name": "plugged-memory",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[212]",
+ "element-type": "212",
+ "meta-type": "array"
+ },
+ {
+ "name": "212",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "dimm",
+ "type": "509"
+ },
+ {
+ "case": "nvdimm",
+ "type": "509"
+ },
+ {
+ "case": "virtio-pmem",
+ "type": "510"
+ },
+ {
+ "case": "virtio-mem",
+ "type": "511"
+ },
+ {
+ "case": "sgx-epc",
+ "type": "512"
+ },
+ {
+ "case": "hv-balloon",
+ "type": "513"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "508"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "213",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "qom-path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "214",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "msg",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "215",
+ "members": [
+ {
+ "name": "human-readable-text",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "216",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "227",
+ "members": [
+ {
+ "name": "mode",
+ "type": "519"
+ },
+ {
+ "name": "filename",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "icount",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "228",
+ "members": [
+ {
+ "name": "icount",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "229",
+ "members": [
+ {
+ "name": "icount",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "230",
+ "members": [
+ {
+ "name": "instances",
+ "type": "[231]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[231]",
+ "element-type": "231",
+ "meta-type": "array"
+ },
+ {
+ "name": "231",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "block-node",
+ "type": "521"
+ },
+ {
+ "case": "chardev",
+ "type": "522"
+ },
+ {
+ "case": "migration",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "520"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "232",
+ "members": [
+ {
+ "name": "protocol",
+ "type": "str"
+ },
+ {
+ "name": "fdname",
+ "type": "str"
+ },
+ {
+ "name": "skipauth",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "tls",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "233",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[234]",
+ "element-type": "234",
+ "meta-type": "array"
+ },
+ {
+ "name": "234",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "thread-id",
+ "type": "int"
+ },
+ {
+ "name": "poll-max-ns",
+ "type": "int"
+ },
+ {
+ "name": "poll-grow",
+ "type": "int"
+ },
+ {
+ "name": "poll-shrink",
+ "type": "int"
+ },
+ {
+ "name": "aio-max-batch",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "235",
+ "members": [
+ {
+ "name": "command-line",
+ "type": "str"
+ },
+ {
+ "name": "cpu-index",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "236",
+ "members": [
+ {
+ "name": "fdname",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "238",
+ "members": [
+ {
+ "name": "fdname",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "239",
+ "members": [
+ {
+ "name": "fdset-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "opaque",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "240",
+ "members": [
+ {
+ "name": "fdset-id",
+ "type": "int"
+ },
+ {
+ "name": "fd",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "241",
+ "members": [
+ {
+ "name": "fdset-id",
+ "type": "int"
+ },
+ {
+ "name": "fd",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[242]",
+ "element-type": "242",
+ "meta-type": "array"
+ },
+ {
+ "name": "242",
+ "members": [
+ {
+ "name": "fdset-id",
+ "type": "int"
+ },
+ {
+ "name": "fds",
+ "type": "[523]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "243",
+ "members": [
+ {
+ "name": "option",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[244]",
+ "element-type": "244",
+ "meta-type": "array"
+ },
+ {
+ "name": "244",
+ "members": [
+ {
+ "name": "option",
+ "type": "str"
+ },
+ {
+ "name": "parameters",
+ "type": "[524]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "245",
+ "members": [
+ {
+ "name": "offset",
+ "type": "int"
+ },
+ {
+ "name": "qom-path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "246",
+ "members": [
+ {
+ "name": "vfu-id",
+ "type": "str"
+ },
+ {
+ "name": "vfu-qom-path",
+ "type": "str"
+ },
+ {
+ "name": "dev-id",
+ "type": "str"
+ },
+ {
+ "name": "dev-qom-path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[258]",
+ "element-type": "258",
+ "meta-type": "array"
+ },
+ {
+ "name": "258",
+ "tag": "driver",
+ "variants": [
+ {
+ "case": "none",
+ "type": "529"
+ },
+ {
+ "case": "alsa",
+ "type": "530"
+ },
+ {
+ "case": "dbus",
+ "type": "529"
+ },
+ {
+ "case": "jack",
+ "type": "533"
+ },
+ {
+ "case": "oss",
+ "type": "534"
+ },
+ {
+ "case": "pa",
+ "type": "535"
+ },
+ {
+ "case": "pipewire",
+ "type": "536"
+ },
+ {
+ "case": "sdl",
+ "type": "537"
+ },
+ {
+ "case": "spice",
+ "type": "529"
+ },
+ {
+ "case": "wav",
+ "type": "539"
+ }
+ ],
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "driver",
+ "type": "528"
+ },
+ {
+ "name": "timer-period",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[259]",
+ "element-type": "259",
+ "meta-type": "array"
+ },
+ {
+ "name": "259",
+ "members": [
+ {
+ "name": "device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "slot",
+ "type": "str"
+ },
+ {
+ "name": "slot-type",
+ "type": "540"
+ },
+ {
+ "name": "source",
+ "type": "int"
+ },
+ {
+ "name": "status",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "260",
+ "members": [
+ {
+ "name": "info",
+ "type": "259"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[261]",
+ "element-type": "261",
+ "meta-type": "array"
+ },
+ {
+ "name": "261",
+ "members": [
+ {
+ "name": "bus",
+ "type": "int"
+ },
+ {
+ "name": "devices",
+ "type": "[541]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "262",
+ "tag": "target",
+ "variants": [
+ {
+ "case": "vcpu",
+ "type": "544"
+ },
+ {
+ "case": "vm",
+ "type": "0"
+ },
+ {
+ "case": "cryptodev",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "target",
+ "type": "542"
+ },
+ {
+ "name": "providers",
+ "default": null,
+ "type": "[543]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[263]",
+ "element-type": "263",
+ "meta-type": "array"
+ },
+ {
+ "name": "263",
+ "members": [
+ {
+ "name": "provider",
+ "type": "545"
+ },
+ {
+ "name": "qom-path",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "stats",
+ "type": "[546]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "264",
+ "members": [
+ {
+ "name": "provider",
+ "default": null,
+ "type": "545"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[265]",
+ "element-type": "265",
+ "meta-type": "array"
+ },
+ {
+ "name": "265",
+ "members": [
+ {
+ "name": "provider",
+ "type": "545"
+ },
+ {
+ "name": "target",
+ "type": "542"
+ },
+ {
+ "name": "stats",
+ "type": "[547]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[266]",
+ "element-type": "266",
+ "meta-type": "array"
+ },
+ {
+ "name": "266",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "267",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "268",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "device-id",
+ "type": "int"
+ },
+ {
+ "name": "vhost-started",
+ "type": "bool"
+ },
+ {
+ "name": "device-endian",
+ "type": "str"
+ },
+ {
+ "name": "guest-features",
+ "type": "548"
+ },
+ {
+ "name": "host-features",
+ "type": "548"
+ },
+ {
+ "name": "backend-features",
+ "type": "548"
+ },
+ {
+ "name": "num-vqs",
+ "type": "int"
+ },
+ {
+ "name": "status",
+ "type": "549"
+ },
+ {
+ "name": "isr",
+ "type": "int"
+ },
+ {
+ "name": "queue-sel",
+ "type": "int"
+ },
+ {
+ "name": "vm-running",
+ "type": "bool"
+ },
+ {
+ "name": "broken",
+ "type": "bool"
+ },
+ {
+ "name": "disabled",
+ "type": "bool"
+ },
+ {
+ "name": "use-started",
+ "type": "bool"
+ },
+ {
+ "name": "started",
+ "type": "bool"
+ },
+ {
+ "name": "start-on-kick",
+ "type": "bool"
+ },
+ {
+ "name": "disable-legacy-check",
+ "type": "bool"
+ },
+ {
+ "name": "bus-name",
+ "type": "str"
+ },
+ {
+ "name": "use-guest-notifier-mask",
+ "type": "bool"
+ },
+ {
+ "name": "vhost-dev",
+ "default": null,
+ "type": "550"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "269",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "270",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "queue-index",
+ "type": "int"
+ },
+ {
+ "name": "inuse",
+ "type": "int"
+ },
+ {
+ "name": "vring-num",
+ "type": "int"
+ },
+ {
+ "name": "vring-num-default",
+ "type": "int"
+ },
+ {
+ "name": "vring-align",
+ "type": "int"
+ },
+ {
+ "name": "vring-desc",
+ "type": "int"
+ },
+ {
+ "name": "vring-avail",
+ "type": "int"
+ },
+ {
+ "name": "vring-used",
+ "type": "int"
+ },
+ {
+ "name": "last-avail-idx",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "shadow-avail-idx",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "used-idx",
+ "type": "int"
+ },
+ {
+ "name": "signalled-used",
+ "type": "int"
+ },
+ {
+ "name": "signalled-used-valid",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "271",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "272",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "kick",
+ "type": "int"
+ },
+ {
+ "name": "call",
+ "type": "int"
+ },
+ {
+ "name": "desc",
+ "type": "int"
+ },
+ {
+ "name": "avail",
+ "type": "int"
+ },
+ {
+ "name": "used",
+ "type": "int"
+ },
+ {
+ "name": "num",
+ "type": "int"
+ },
+ {
+ "name": "desc-phys",
+ "type": "int"
+ },
+ {
+ "name": "desc-size",
+ "type": "int"
+ },
+ {
+ "name": "avail-phys",
+ "type": "int"
+ },
+ {
+ "name": "avail-size",
+ "type": "int"
+ },
+ {
+ "name": "used-phys",
+ "type": "int"
+ },
+ {
+ "name": "used-size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "273",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "type": "int"
+ },
+ {
+ "name": "index",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "274",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "index",
+ "type": "int"
+ },
+ {
+ "name": "descs",
+ "type": "[551]"
+ },
+ {
+ "name": "avail",
+ "type": "552"
+ },
+ {
+ "name": "used",
+ "type": "553"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[275]",
+ "element-type": "275",
+ "meta-type": "array"
+ },
+ {
+ "name": "275",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ },
+ {
+ "name": "service",
+ "type": "[554]"
+ },
+ {
+ "name": "client",
+ "type": "[555]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "276",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "log",
+ "type": "556"
+ },
+ {
+ "name": "flags",
+ "type": "int"
+ },
+ {
+ "name": "dpa",
+ "type": "int"
+ },
+ {
+ "name": "descriptor",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "int"
+ },
+ {
+ "name": "transaction-type",
+ "type": "int"
+ },
+ {
+ "name": "channel",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "rank",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "device",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "component-id",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "277",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "log",
+ "type": "556"
+ },
+ {
+ "name": "flags",
+ "type": "int"
+ },
+ {
+ "name": "dpa",
+ "type": "int"
+ },
+ {
+ "name": "descriptor",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "int"
+ },
+ {
+ "name": "transaction-type",
+ "type": "int"
+ },
+ {
+ "name": "channel",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "rank",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "nibble-mask",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bank-group",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bank",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "row",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "column",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "correction-mask",
+ "default": null,
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "278",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "log",
+ "type": "556"
+ },
+ {
+ "name": "flags",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "int"
+ },
+ {
+ "name": "health-status",
+ "type": "int"
+ },
+ {
+ "name": "media-status",
+ "type": "int"
+ },
+ {
+ "name": "additional-status",
+ "type": "int"
+ },
+ {
+ "name": "life-used",
+ "type": "int"
+ },
+ {
+ "name": "temperature",
+ "type": "int"
+ },
+ {
+ "name": "dirty-shutdown-count",
+ "type": "int"
+ },
+ {
+ "name": "corrected-volatile-error-count",
+ "type": "int"
+ },
+ {
+ "name": "corrected-persistent-error-count",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "279",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "start",
+ "type": "int"
+ },
+ {
+ "name": "length",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "280",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "errors",
+ "type": "[557]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "281",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "558"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "bool",
+ "json-type": "boolean",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "282",
+ "members": [
+ {
+ "name": "debug"
+ },
+ {
+ "name": "inmigrate"
+ },
+ {
+ "name": "internal-error"
+ },
+ {
+ "name": "io-error"
+ },
+ {
+ "name": "paused"
+ },
+ {
+ "name": "postmigrate"
+ },
+ {
+ "name": "prelaunch"
+ },
+ {
+ "name": "finish-migrate"
+ },
+ {
+ "name": "restore-vm"
+ },
+ {
+ "name": "running"
+ },
+ {
+ "name": "save-vm"
+ },
+ {
+ "name": "shutdown"
+ },
+ {
+ "name": "suspended"
+ },
+ {
+ "name": "watchdog"
+ },
+ {
+ "name": "guest-panicked"
+ },
+ {
+ "name": "colo"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "debug",
+ "inmigrate",
+ "internal-error",
+ "io-error",
+ "paused",
+ "postmigrate",
+ "prelaunch",
+ "finish-migrate",
+ "restore-vm",
+ "running",
+ "save-vm",
+ "shutdown",
+ "suspended",
+ "watchdog",
+ "guest-panicked",
+ "colo"
+ ]
+ },
+ {
+ "name": "283",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "host-error"
+ },
+ {
+ "name": "host-qmp-quit"
+ },
+ {
+ "name": "host-qmp-system-reset"
+ },
+ {
+ "name": "host-signal"
+ },
+ {
+ "name": "host-ui"
+ },
+ {
+ "name": "guest-shutdown"
+ },
+ {
+ "name": "guest-reset"
+ },
+ {
+ "name": "guest-panic"
+ },
+ {
+ "name": "subsystem-reset"
+ },
+ {
+ "name": "snapshot-load"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "host-error",
+ "host-qmp-quit",
+ "host-qmp-system-reset",
+ "host-signal",
+ "host-ui",
+ "guest-shutdown",
+ "guest-reset",
+ "guest-panic",
+ "subsystem-reset",
+ "snapshot-load"
+ ]
+ },
+ {
+ "name": "284",
+ "members": [
+ {
+ "name": "reset"
+ },
+ {
+ "name": "shutdown"
+ },
+ {
+ "name": "poweroff"
+ },
+ {
+ "name": "pause"
+ },
+ {
+ "name": "debug"
+ },
+ {
+ "name": "none"
+ },
+ {
+ "name": "inject-nmi"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "reset",
+ "shutdown",
+ "poweroff",
+ "pause",
+ "debug",
+ "none",
+ "inject-nmi"
+ ]
+ },
+ {
+ "name": "285",
+ "members": [
+ {
+ "name": "reset"
+ },
+ {
+ "name": "shutdown"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "reset",
+ "shutdown"
+ ]
+ },
+ {
+ "name": "286",
+ "members": [
+ {
+ "name": "poweroff"
+ },
+ {
+ "name": "pause"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "poweroff",
+ "pause"
+ ]
+ },
+ {
+ "name": "287",
+ "members": [
+ {
+ "name": "pause"
+ },
+ {
+ "name": "shutdown"
+ },
+ {
+ "name": "exit-failure"
+ },
+ {
+ "name": "none"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "pause",
+ "shutdown",
+ "exit-failure",
+ "none"
+ ]
+ },
+ {
+ "name": "288",
+ "members": [
+ {
+ "name": "pause"
+ },
+ {
+ "name": "poweroff"
+ },
+ {
+ "name": "run"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "pause",
+ "poweroff",
+ "run"
+ ]
+ },
+ {
+ "name": "289",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "hyper-v",
+ "type": "560"
+ },
+ {
+ "case": "s390",
+ "type": "561"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "559"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "290",
+ "members": [
+ {
+ "name": "hypervisor"
+ },
+ {
+ "name": "guest"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "hypervisor",
+ "guest"
+ ]
+ },
+ {
+ "name": "291",
+ "members": [
+ {
+ "name": "ignore"
+ },
+ {
+ "name": "inject"
+ },
+ {
+ "name": "fatal"
+ },
+ {
+ "name": "reset"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ignore",
+ "inject",
+ "fatal",
+ "reset"
+ ]
+ },
+ {
+ "name": "292",
+ "members": [
+ {
+ "name": "action-required",
+ "type": "bool"
+ },
+ {
+ "name": "recursive",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "293",
+ "members": [
+ {
+ "name": "undefined"
+ },
+ {
+ "name": "created"
+ },
+ {
+ "name": "running"
+ },
+ {
+ "name": "paused"
+ },
+ {
+ "name": "ready"
+ },
+ {
+ "name": "standby"
+ },
+ {
+ "name": "waiting"
+ },
+ {
+ "name": "pending"
+ },
+ {
+ "name": "aborting"
+ },
+ {
+ "name": "concluded"
+ },
+ {
+ "name": "null"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "undefined",
+ "created",
+ "running",
+ "paused",
+ "ready",
+ "standby",
+ "waiting",
+ "pending",
+ "aborting",
+ "concluded",
+ "null"
+ ]
+ },
+ {
+ "name": "294",
+ "members": [
+ {
+ "name": "commit"
+ },
+ {
+ "name": "stream"
+ },
+ {
+ "name": "mirror"
+ },
+ {
+ "name": "backup"
+ },
+ {
+ "name": "create"
+ },
+ {
+ "name": "amend"
+ },
+ {
+ "name": "snapshot-load"
+ },
+ {
+ "name": "snapshot-save"
+ },
+ {
+ "name": "snapshot-delete"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "commit",
+ "stream",
+ "mirror",
+ "backup",
+ "create",
+ "amend",
+ "snapshot-load",
+ "snapshot-save",
+ "snapshot-delete"
+ ]
+ },
+ {
+ "name": "int",
+ "json-type": "int",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "295",
+ "members": [
+ {
+ "name": "retain"
+ },
+ {
+ "name": "read-only"
+ },
+ {
+ "name": "read-write"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "retain",
+ "read-only",
+ "read-write"
+ ]
+ },
+ {
+ "name": "[int]",
+ "element-type": "int",
+ "meta-type": "array"
+ },
+ {
+ "name": "296",
+ "members": [
+ {
+ "name": "ok"
+ },
+ {
+ "name": "failed"
+ },
+ {
+ "name": "nospace"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ok",
+ "failed",
+ "nospace"
+ ]
+ },
+ {
+ "name": "297",
+ "members": [
+ {
+ "name": "rd_bytes",
+ "type": "int"
+ },
+ {
+ "name": "wr_bytes",
+ "type": "int"
+ },
+ {
+ "name": "zone_append_bytes",
+ "type": "int"
+ },
+ {
+ "name": "unmap_bytes",
+ "type": "int"
+ },
+ {
+ "name": "rd_operations",
+ "type": "int"
+ },
+ {
+ "name": "wr_operations",
+ "type": "int"
+ },
+ {
+ "name": "zone_append_operations",
+ "type": "int"
+ },
+ {
+ "name": "flush_operations",
+ "type": "int"
+ },
+ {
+ "name": "unmap_operations",
+ "type": "int"
+ },
+ {
+ "name": "rd_total_time_ns",
+ "type": "int"
+ },
+ {
+ "name": "wr_total_time_ns",
+ "type": "int"
+ },
+ {
+ "name": "zone_append_total_time_ns",
+ "type": "int"
+ },
+ {
+ "name": "flush_total_time_ns",
+ "type": "int"
+ },
+ {
+ "name": "unmap_total_time_ns",
+ "type": "int"
+ },
+ {
+ "name": "wr_highest_offset",
+ "type": "int"
+ },
+ {
+ "name": "rd_merged",
+ "type": "int"
+ },
+ {
+ "name": "wr_merged",
+ "type": "int"
+ },
+ {
+ "name": "zone_append_merged",
+ "type": "int"
+ },
+ {
+ "name": "unmap_merged",
+ "type": "int"
+ },
+ {
+ "name": "idle_time_ns",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "failed_rd_operations",
+ "type": "int"
+ },
+ {
+ "name": "failed_wr_operations",
+ "type": "int"
+ },
+ {
+ "name": "failed_zone_append_operations",
+ "type": "int"
+ },
+ {
+ "name": "failed_flush_operations",
+ "type": "int"
+ },
+ {
+ "name": "failed_unmap_operations",
+ "type": "int"
+ },
+ {
+ "name": "invalid_rd_operations",
+ "type": "int"
+ },
+ {
+ "name": "invalid_wr_operations",
+ "type": "int"
+ },
+ {
+ "name": "invalid_zone_append_operations",
+ "type": "int"
+ },
+ {
+ "name": "invalid_flush_operations",
+ "type": "int"
+ },
+ {
+ "name": "invalid_unmap_operations",
+ "type": "int"
+ },
+ {
+ "name": "account_invalid",
+ "type": "bool"
+ },
+ {
+ "name": "account_failed",
+ "type": "bool"
+ },
+ {
+ "name": "timed_stats",
+ "type": "[562]"
+ },
+ {
+ "name": "rd_latency_histogram",
+ "default": null,
+ "type": "563"
+ },
+ {
+ "name": "wr_latency_histogram",
+ "default": null,
+ "type": "563"
+ },
+ {
+ "name": "zone_append_latency_histogram",
+ "default": null,
+ "type": "563"
+ },
+ {
+ "name": "flush_latency_histogram",
+ "default": null,
+ "type": "563"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "298",
+ "tag": "driver",
+ "variants": [
+ {
+ "case": "file",
+ "type": "564"
+ },
+ {
+ "case": "host_device",
+ "type": "564"
+ },
+ {
+ "case": "nvme",
+ "type": "565"
+ },
+ {
+ "case": "blkdebug",
+ "type": "0"
+ },
+ {
+ "case": "blklogwrites",
+ "type": "0"
+ },
+ {
+ "case": "blkreplay",
+ "type": "0"
+ },
+ {
+ "case": "blkverify",
+ "type": "0"
+ },
+ {
+ "case": "bochs",
+ "type": "0"
+ },
+ {
+ "case": "cloop",
+ "type": "0"
+ },
+ {
+ "case": "compress",
+ "type": "0"
+ },
+ {
+ "case": "copy-before-write",
+ "type": "0"
+ },
+ {
+ "case": "copy-on-read",
+ "type": "0"
+ },
+ {
+ "case": "dmg",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-access",
+ "type": "0"
+ },
+ {
+ "case": "ftp",
+ "type": "0"
+ },
+ {
+ "case": "ftps",
+ "type": "0"
+ },
+ {
+ "case": "gluster",
+ "type": "0"
+ },
+ {
+ "case": "host_cdrom",
+ "type": "0"
+ },
+ {
+ "case": "http",
+ "type": "0"
+ },
+ {
+ "case": "https",
+ "type": "0"
+ },
+ {
+ "case": "io_uring",
+ "type": "0"
+ },
+ {
+ "case": "iscsi",
+ "type": "0"
+ },
+ {
+ "case": "luks",
+ "type": "0"
+ },
+ {
+ "case": "nbd",
+ "type": "0"
+ },
+ {
+ "case": "nfs",
+ "type": "0"
+ },
+ {
+ "case": "null-aio",
+ "type": "0"
+ },
+ {
+ "case": "null-co",
+ "type": "0"
+ },
+ {
+ "case": "nvme-io_uring",
+ "type": "0"
+ },
+ {
+ "case": "parallels",
+ "type": "0"
+ },
+ {
+ "case": "preallocate",
+ "type": "0"
+ },
+ {
+ "case": "qcow",
+ "type": "0"
+ },
+ {
+ "case": "qcow2",
+ "type": "0"
+ },
+ {
+ "case": "qed",
+ "type": "0"
+ },
+ {
+ "case": "quorum",
+ "type": "0"
+ },
+ {
+ "case": "raw",
+ "type": "0"
+ },
+ {
+ "case": "rbd",
+ "type": "0"
+ },
+ {
+ "case": "replication",
+ "type": "0"
+ },
+ {
+ "case": "ssh",
+ "type": "0"
+ },
+ {
+ "case": "throttle",
+ "type": "0"
+ },
+ {
+ "case": "vdi",
+ "type": "0"
+ },
+ {
+ "case": "vhdx",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vfio-pci",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-user",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-vdpa",
+ "type": "0"
+ },
+ {
+ "case": "vmdk",
+ "type": "0"
+ },
+ {
+ "case": "vpc",
+ "type": "0"
+ },
+ {
+ "case": "vvfat",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "driver",
+ "type": "314"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "299",
+ "members": [
+ {
+ "name": "actively-synced",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "300",
+ "members": [
+ {
+ "name": "existing"
+ },
+ {
+ "name": "absolute-paths"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "existing",
+ "absolute-paths"
+ ]
+ },
+ {
+ "name": "301",
+ "members": [
+ {
+ "name": "report"
+ },
+ {
+ "name": "ignore"
+ },
+ {
+ "name": "enospc"
+ },
+ {
+ "name": "stop"
+ },
+ {
+ "name": "auto"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "report",
+ "ignore",
+ "enospc",
+ "stop",
+ "auto"
+ ]
+ },
+ {
+ "name": "302",
+ "members": [
+ {
+ "name": "top"
+ },
+ {
+ "name": "full"
+ },
+ {
+ "name": "none"
+ },
+ {
+ "name": "incremental"
+ },
+ {
+ "name": "bitmap"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "top",
+ "full",
+ "none",
+ "incremental",
+ "bitmap"
+ ]
+ },
+ {
+ "name": "303",
+ "members": [
+ {
+ "name": "on-success"
+ },
+ {
+ "name": "never"
+ },
+ {
+ "name": "always"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "on-success",
+ "never",
+ "always"
+ ]
+ },
+ {
+ "name": "304",
+ "members": [
+ {
+ "name": "use-copy-range",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "max-workers",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-chunk",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "305",
+ "members": [
+ {
+ "name": "off"
+ },
+ {
+ "name": "on"
+ },
+ {
+ "name": "unmap"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "off",
+ "on",
+ "unmap"
+ ]
+ },
+ {
+ "name": "306",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "type": "str"
+ },
+ {
+ "name": "dirty-flag",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "actual-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "virtual-size",
+ "type": "int"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "encrypted",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "compressed",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "backing-filename",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "full-backing-filename",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-filename-format",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "snapshots",
+ "default": null,
+ "type": "[78]"
+ },
+ {
+ "name": "format-specific",
+ "default": null,
+ "type": "566"
+ },
+ {
+ "name": "backing-image",
+ "default": null,
+ "type": "306"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "307",
+ "members": [
+ {
+ "name": "writeback",
+ "type": "bool"
+ },
+ {
+ "name": "direct",
+ "type": "bool"
+ },
+ {
+ "name": "no-flush",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[308]",
+ "element-type": "308",
+ "meta-type": "array"
+ },
+ {
+ "name": "308",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "count",
+ "type": "int"
+ },
+ {
+ "name": "granularity",
+ "type": "int"
+ },
+ {
+ "name": "recording",
+ "type": "bool"
+ },
+ {
+ "name": "busy",
+ "type": "bool"
+ },
+ {
+ "name": "persistent",
+ "type": "bool"
+ },
+ {
+ "name": "inconsistent",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[309]",
+ "element-type": "309",
+ "meta-type": "array"
+ },
+ {
+ "name": "309",
+ "members": [
+ {
+ "name": "id",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "567"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[310]",
+ "element-type": "310",
+ "meta-type": "array"
+ },
+ {
+ "name": "310",
+ "members": [
+ {
+ "name": "parent",
+ "type": "int"
+ },
+ {
+ "name": "child",
+ "type": "int"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "perm",
+ "type": "[568]"
+ },
+ {
+ "name": "shared-perm",
+ "type": "[568]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "311",
+ "members": [
+ {
+ "name": "background"
+ },
+ {
+ "name": "write-blocking"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "background",
+ "write-blocking"
+ ]
+ },
+ {
+ "name": "[312]",
+ "element-type": "312",
+ "meta-type": "array"
+ },
+ {
+ "name": "312",
+ "members": [
+ {
+ "type": "str"
+ },
+ {
+ "type": "45"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "313",
+ "members": [
+ {
+ "name": "copy-mode",
+ "type": "311"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "314",
+ "members": [
+ {
+ "name": "blkdebug"
+ },
+ {
+ "name": "blklogwrites"
+ },
+ {
+ "name": "blkreplay"
+ },
+ {
+ "name": "blkverify"
+ },
+ {
+ "name": "bochs"
+ },
+ {
+ "name": "cloop"
+ },
+ {
+ "name": "compress"
+ },
+ {
+ "name": "copy-before-write"
+ },
+ {
+ "name": "copy-on-read"
+ },
+ {
+ "name": "dmg"
+ },
+ {
+ "name": "file"
+ },
+ {
+ "name": "snapshot-access"
+ },
+ {
+ "name": "ftp"
+ },
+ {
+ "name": "ftps"
+ },
+ {
+ "name": "gluster"
+ },
+ {
+ "name": "host_cdrom"
+ },
+ {
+ "name": "host_device"
+ },
+ {
+ "name": "http"
+ },
+ {
+ "name": "https"
+ },
+ {
+ "name": "io_uring"
+ },
+ {
+ "name": "iscsi"
+ },
+ {
+ "name": "luks"
+ },
+ {
+ "name": "nbd"
+ },
+ {
+ "name": "nfs"
+ },
+ {
+ "name": "null-aio"
+ },
+ {
+ "name": "null-co"
+ },
+ {
+ "name": "nvme"
+ },
+ {
+ "name": "nvme-io_uring"
+ },
+ {
+ "name": "parallels"
+ },
+ {
+ "name": "preallocate"
+ },
+ {
+ "name": "qcow"
+ },
+ {
+ "name": "qcow2"
+ },
+ {
+ "name": "qed"
+ },
+ {
+ "name": "quorum"
+ },
+ {
+ "name": "raw"
+ },
+ {
+ "name": "rbd"
+ },
+ {
+ "name": "replication"
+ },
+ {
+ "name": "ssh"
+ },
+ {
+ "name": "throttle"
+ },
+ {
+ "name": "vdi"
+ },
+ {
+ "name": "vhdx"
+ },
+ {
+ "name": "virtio-blk-vfio-pci"
+ },
+ {
+ "name": "virtio-blk-vhost-user"
+ },
+ {
+ "name": "virtio-blk-vhost-vdpa"
+ },
+ {
+ "name": "vmdk"
+ },
+ {
+ "name": "vpc"
+ },
+ {
+ "name": "vvfat"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "blkdebug",
+ "blklogwrites",
+ "blkreplay",
+ "blkverify",
+ "bochs",
+ "cloop",
+ "compress",
+ "copy-before-write",
+ "copy-on-read",
+ "dmg",
+ "file",
+ "snapshot-access",
+ "ftp",
+ "ftps",
+ "gluster",
+ "host_cdrom",
+ "host_device",
+ "http",
+ "https",
+ "io_uring",
+ "iscsi",
+ "luks",
+ "nbd",
+ "nfs",
+ "null-aio",
+ "null-co",
+ "nvme",
+ "nvme-io_uring",
+ "parallels",
+ "preallocate",
+ "qcow",
+ "qcow2",
+ "qed",
+ "quorum",
+ "raw",
+ "rbd",
+ "replication",
+ "ssh",
+ "throttle",
+ "vdi",
+ "vhdx",
+ "virtio-blk-vfio-pci",
+ "virtio-blk-vhost-user",
+ "virtio-blk-vhost-vdpa",
+ "vmdk",
+ "vpc",
+ "vvfat"
+ ]
+ },
+ {
+ "name": "315",
+ "members": [
+ {
+ "name": "ignore"
+ },
+ {
+ "name": "unmap"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ignore",
+ "unmap"
+ ]
+ },
+ {
+ "name": "316",
+ "members": [
+ {
+ "name": "direct",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "no-flush",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "317",
+ "members": [
+ {
+ "name": "image",
+ "type": "569"
+ },
+ {
+ "name": "config",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "align",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-transfer",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "opt-write-zero",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-write-zero",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "opt-discard",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-discard",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "inject-error",
+ "default": null,
+ "type": "[570]"
+ },
+ {
+ "name": "set-state",
+ "default": null,
+ "type": "[571]"
+ },
+ {
+ "name": "take-child-perms",
+ "default": null,
+ "type": "[568]"
+ },
+ {
+ "name": "unshare-child-perms",
+ "default": null,
+ "type": "[568]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "318",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "log",
+ "type": "569"
+ },
+ {
+ "name": "log-sector-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "log-append",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "log-super-update-interval",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "319",
+ "members": [
+ {
+ "name": "test",
+ "type": "569"
+ },
+ {
+ "name": "raw",
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "320",
+ "members": [
+ {
+ "name": "image",
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "321",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "322",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "target",
+ "type": "569"
+ },
+ {
+ "name": "bitmap",
+ "default": null,
+ "type": "45"
+ },
+ {
+ "name": "on-cbw-error",
+ "default": null,
+ "type": "572"
+ },
+ {
+ "name": "cbw-timeout",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "323",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "bottom",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "324",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "pr-manager",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "locking",
+ "default": null,
+ "type": "573"
+ },
+ {
+ "name": "aio",
+ "default": null,
+ "type": "574"
+ },
+ {
+ "name": "aio-max-batch",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "drop-cache",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "x-check-cache-dropped",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "unstable"
+ ]
+ }
+ ],
+ "meta-type": "object",
+ "features": [
+ "dynamic-auto-read-only"
+ ]
+ },
+ {
+ "name": "325",
+ "members": [
+ {
+ "name": "url",
+ "type": "str"
+ },
+ {
+ "name": "readahead",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "timeout",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-password-secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "326",
+ "members": [
+ {
+ "name": "url",
+ "type": "str"
+ },
+ {
+ "name": "readahead",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "timeout",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sslverify",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "327",
+ "members": [
+ {
+ "name": "volume",
+ "type": "str"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "server",
+ "type": "[388]"
+ },
+ {
+ "name": "debug",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "328",
+ "members": [
+ {
+ "name": "url",
+ "type": "str"
+ },
+ {
+ "name": "readahead",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "timeout",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cookie",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cookie-secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "329",
+ "members": [
+ {
+ "name": "url",
+ "type": "str"
+ },
+ {
+ "name": "readahead",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "timeout",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-username",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "proxy-password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cookie",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sslverify",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "cookie-secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "330",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "331",
+ "members": [
+ {
+ "name": "transport",
+ "type": "575"
+ },
+ {
+ "name": "portal",
+ "type": "str"
+ },
+ {
+ "name": "target",
+ "type": "str"
+ },
+ {
+ "name": "lun",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "user",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "password-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "initiator-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "header-digest",
+ "default": null,
+ "type": "576"
+ },
+ {
+ "name": "timeout",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "332",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "header",
+ "default": null,
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "333",
+ "members": [
+ {
+ "name": "server",
+ "type": "388"
+ },
+ {
+ "name": "export",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-creds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-hostname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "x-dirty-bitmap",
+ "default": null,
+ "type": "str",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "reconnect-delay",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "open-timeout",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "334",
+ "members": [
+ {
+ "name": "server",
+ "type": "577"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "user",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tcp-syn-count",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "readahead-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "page-cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "debug",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "335",
+ "members": [
+ {
+ "name": "size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "latency-ns",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "read-zeroes",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "336",
+ "members": [
+ {
+ "name": "device",
+ "type": "str"
+ },
+ {
+ "name": "namespace",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "337",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "338",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "prealloc-align",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "prealloc-size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "339",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "backing",
+ "default": null,
+ "type": "578"
+ },
+ {
+ "name": "lazy-refcounts",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "pass-discard-request",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "pass-discard-snapshot",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "pass-discard-other",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "discard-no-unref",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "overlap-check",
+ "default": null,
+ "type": "579"
+ },
+ {
+ "name": "cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "l2-cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "l2-cache-entry-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "refcount-cache-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cache-clean-interval",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "580"
+ },
+ {
+ "name": "data-file",
+ "default": null,
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "340",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "backing",
+ "default": null,
+ "type": "578"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "581"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "341",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "backing",
+ "default": null,
+ "type": "578"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "342",
+ "members": [
+ {
+ "name": "blkverify",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "children",
+ "type": "[569]"
+ },
+ {
+ "name": "vote-threshold",
+ "type": "int"
+ },
+ {
+ "name": "rewrite-corrupted",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "read-pattern",
+ "default": null,
+ "type": "582"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "343",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "offset",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "344",
+ "members": [
+ {
+ "name": "pool",
+ "type": "str"
+ },
+ {
+ "name": "namespace",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "image",
+ "type": "str"
+ },
+ {
+ "name": "conf",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "snapshot",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "583"
+ },
+ {
+ "name": "user",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "auth-client-required",
+ "default": null,
+ "type": "[584]"
+ },
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "server",
+ "default": null,
+ "type": "[585]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "345",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "mode",
+ "type": "586"
+ },
+ {
+ "name": "top-id",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "346",
+ "members": [
+ {
+ "name": "server",
+ "type": "587"
+ },
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "user",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "host-key-check",
+ "default": null,
+ "type": "588"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "347",
+ "members": [
+ {
+ "name": "throttle-group",
+ "type": "str"
+ },
+ {
+ "name": "file",
+ "type": "569"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "348",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "349",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "350",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object",
+ "features": [
+ "fdset"
+ ]
+ },
+ {
+ "name": "351",
+ "members": [
+ {
+ "name": "dir",
+ "type": "str"
+ },
+ {
+ "name": "fat-type",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "floppy",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "label",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "rw",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[58]",
+ "element-type": "58",
+ "meta-type": "array"
+ },
+ {
+ "name": "352",
+ "tag": "driver",
+ "variants": [
+ {
+ "case": "file",
+ "type": "589"
+ },
+ {
+ "case": "gluster",
+ "type": "590"
+ },
+ {
+ "case": "luks",
+ "type": "591"
+ },
+ {
+ "case": "nfs",
+ "type": "592"
+ },
+ {
+ "case": "parallels",
+ "type": "593"
+ },
+ {
+ "case": "qcow",
+ "type": "594"
+ },
+ {
+ "case": "qcow2",
+ "type": "595"
+ },
+ {
+ "case": "qed",
+ "type": "596"
+ },
+ {
+ "case": "rbd",
+ "type": "597"
+ },
+ {
+ "case": "ssh",
+ "type": "598"
+ },
+ {
+ "case": "vdi",
+ "type": "599"
+ },
+ {
+ "case": "vhdx",
+ "type": "600"
+ },
+ {
+ "case": "vmdk",
+ "type": "601"
+ },
+ {
+ "case": "vpc",
+ "type": "602"
+ },
+ {
+ "case": "blkdebug",
+ "type": "0"
+ },
+ {
+ "case": "blklogwrites",
+ "type": "0"
+ },
+ {
+ "case": "blkreplay",
+ "type": "0"
+ },
+ {
+ "case": "blkverify",
+ "type": "0"
+ },
+ {
+ "case": "bochs",
+ "type": "0"
+ },
+ {
+ "case": "cloop",
+ "type": "0"
+ },
+ {
+ "case": "compress",
+ "type": "0"
+ },
+ {
+ "case": "copy-before-write",
+ "type": "0"
+ },
+ {
+ "case": "copy-on-read",
+ "type": "0"
+ },
+ {
+ "case": "dmg",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-access",
+ "type": "0"
+ },
+ {
+ "case": "ftp",
+ "type": "0"
+ },
+ {
+ "case": "ftps",
+ "type": "0"
+ },
+ {
+ "case": "host_cdrom",
+ "type": "0"
+ },
+ {
+ "case": "host_device",
+ "type": "0"
+ },
+ {
+ "case": "http",
+ "type": "0"
+ },
+ {
+ "case": "https",
+ "type": "0"
+ },
+ {
+ "case": "io_uring",
+ "type": "0"
+ },
+ {
+ "case": "iscsi",
+ "type": "0"
+ },
+ {
+ "case": "nbd",
+ "type": "0"
+ },
+ {
+ "case": "null-aio",
+ "type": "0"
+ },
+ {
+ "case": "null-co",
+ "type": "0"
+ },
+ {
+ "case": "nvme",
+ "type": "0"
+ },
+ {
+ "case": "nvme-io_uring",
+ "type": "0"
+ },
+ {
+ "case": "preallocate",
+ "type": "0"
+ },
+ {
+ "case": "quorum",
+ "type": "0"
+ },
+ {
+ "case": "raw",
+ "type": "0"
+ },
+ {
+ "case": "replication",
+ "type": "0"
+ },
+ {
+ "case": "throttle",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vfio-pci",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-user",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-vdpa",
+ "type": "0"
+ },
+ {
+ "case": "vvfat",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "driver",
+ "type": "314"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "353",
+ "tag": "driver",
+ "variants": [
+ {
+ "case": "luks",
+ "type": "603"
+ },
+ {
+ "case": "qcow2",
+ "type": "604"
+ },
+ {
+ "case": "blkdebug",
+ "type": "0"
+ },
+ {
+ "case": "blklogwrites",
+ "type": "0"
+ },
+ {
+ "case": "blkreplay",
+ "type": "0"
+ },
+ {
+ "case": "blkverify",
+ "type": "0"
+ },
+ {
+ "case": "bochs",
+ "type": "0"
+ },
+ {
+ "case": "cloop",
+ "type": "0"
+ },
+ {
+ "case": "compress",
+ "type": "0"
+ },
+ {
+ "case": "copy-before-write",
+ "type": "0"
+ },
+ {
+ "case": "copy-on-read",
+ "type": "0"
+ },
+ {
+ "case": "dmg",
+ "type": "0"
+ },
+ {
+ "case": "file",
+ "type": "0"
+ },
+ {
+ "case": "snapshot-access",
+ "type": "0"
+ },
+ {
+ "case": "ftp",
+ "type": "0"
+ },
+ {
+ "case": "ftps",
+ "type": "0"
+ },
+ {
+ "case": "gluster",
+ "type": "0"
+ },
+ {
+ "case": "host_cdrom",
+ "type": "0"
+ },
+ {
+ "case": "host_device",
+ "type": "0"
+ },
+ {
+ "case": "http",
+ "type": "0"
+ },
+ {
+ "case": "https",
+ "type": "0"
+ },
+ {
+ "case": "io_uring",
+ "type": "0"
+ },
+ {
+ "case": "iscsi",
+ "type": "0"
+ },
+ {
+ "case": "nbd",
+ "type": "0"
+ },
+ {
+ "case": "nfs",
+ "type": "0"
+ },
+ {
+ "case": "null-aio",
+ "type": "0"
+ },
+ {
+ "case": "null-co",
+ "type": "0"
+ },
+ {
+ "case": "nvme",
+ "type": "0"
+ },
+ {
+ "case": "nvme-io_uring",
+ "type": "0"
+ },
+ {
+ "case": "parallels",
+ "type": "0"
+ },
+ {
+ "case": "preallocate",
+ "type": "0"
+ },
+ {
+ "case": "qcow",
+ "type": "0"
+ },
+ {
+ "case": "qed",
+ "type": "0"
+ },
+ {
+ "case": "quorum",
+ "type": "0"
+ },
+ {
+ "case": "raw",
+ "type": "0"
+ },
+ {
+ "case": "rbd",
+ "type": "0"
+ },
+ {
+ "case": "replication",
+ "type": "0"
+ },
+ {
+ "case": "ssh",
+ "type": "0"
+ },
+ {
+ "case": "throttle",
+ "type": "0"
+ },
+ {
+ "case": "vdi",
+ "type": "0"
+ },
+ {
+ "case": "vhdx",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vfio-pci",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-user",
+ "type": "0"
+ },
+ {
+ "case": "virtio-blk-vhost-vdpa",
+ "type": "0"
+ },
+ {
+ "case": "vmdk",
+ "type": "0"
+ },
+ {
+ "case": "vpc",
+ "type": "0"
+ },
+ {
+ "case": "vvfat",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "driver",
+ "type": "314"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "354",
+ "members": [
+ {
+ "name": "read"
+ },
+ {
+ "name": "write"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "name": "355",
+ "members": [
+ {
+ "name": "ignore"
+ },
+ {
+ "name": "report"
+ },
+ {
+ "name": "stop"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ignore",
+ "report",
+ "stop"
+ ]
+ },
+ {
+ "name": "356",
+ "members": [
+ {
+ "type": "str"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "357",
+ "members": [
+ {
+ "name": "read"
+ },
+ {
+ "name": "write"
+ },
+ {
+ "name": "flush"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "read",
+ "write",
+ "flush"
+ ]
+ },
+ {
+ "name": "358",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "inet",
+ "type": "606"
+ },
+ {
+ "case": "unix",
+ "type": "607"
+ },
+ {
+ "case": "vsock",
+ "type": "608"
+ },
+ {
+ "case": "fd",
+ "type": "609"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "605"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "359",
+ "members": [
+ {
+ "name": "safe"
+ },
+ {
+ "name": "hard"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "safe",
+ "hard"
+ ]
+ },
+ {
+ "name": "360",
+ "members": [
+ {
+ "name": "nbd"
+ },
+ {
+ "name": "vhost-user-blk"
+ },
+ {
+ "name": "fuse"
+ },
+ {
+ "name": "vduse-blk"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "nbd",
+ "vhost-user-blk",
+ "fuse",
+ "vduse-blk"
+ ]
+ },
+ {
+ "name": "361",
+ "members": [
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "description",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "bitmaps",
+ "default": null,
+ "type": "[312]"
+ },
+ {
+ "name": "allocation-depth",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "362",
+ "members": [
+ {
+ "name": "addr",
+ "type": "388"
+ },
+ {
+ "name": "logical-block-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "num-queues",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "363",
+ "members": [
+ {
+ "name": "mountpoint",
+ "type": "str"
+ },
+ {
+ "name": "growable",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "allow-other",
+ "default": null,
+ "type": "610"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "364",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "num-queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "queue-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "logical-block-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "serial",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "365",
+ "members": [
+ {
+ "name": "utf8"
+ },
+ {
+ "name": "base64"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "utf8",
+ "base64"
+ ]
+ },
+ {
+ "name": "366",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "file",
+ "type": "612"
+ },
+ {
+ "case": "serial",
+ "type": "613"
+ },
+ {
+ "case": "parallel",
+ "type": "613"
+ },
+ {
+ "case": "pipe",
+ "type": "613"
+ },
+ {
+ "case": "socket",
+ "type": "614"
+ },
+ {
+ "case": "udp",
+ "type": "615"
+ },
+ {
+ "case": "pty",
+ "type": "616"
+ },
+ {
+ "case": "null",
+ "type": "616"
+ },
+ {
+ "case": "mux",
+ "type": "617"
+ },
+ {
+ "case": "msmouse",
+ "type": "616"
+ },
+ {
+ "case": "wctablet",
+ "type": "616"
+ },
+ {
+ "case": "braille",
+ "type": "616"
+ },
+ {
+ "case": "testdev",
+ "type": "616"
+ },
+ {
+ "case": "stdio",
+ "type": "618"
+ },
+ {
+ "case": "spicevmc",
+ "type": "619"
+ },
+ {
+ "case": "spiceport",
+ "type": "620"
+ },
+ {
+ "case": "qemu-vdagent",
+ "type": "621"
+ },
+ {
+ "case": "dbus",
+ "type": "622"
+ },
+ {
+ "case": "vc",
+ "type": "623"
+ },
+ {
+ "case": "ringbuf",
+ "type": "624"
+ },
+ {
+ "case": "memory",
+ "type": "624"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "611"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "367",
+ "members": [
+ {
+ "name": "elf"
+ },
+ {
+ "name": "kdump-zlib"
+ },
+ {
+ "name": "kdump-lzo"
+ },
+ {
+ "name": "kdump-snappy"
+ },
+ {
+ "name": "kdump-raw-zlib"
+ },
+ {
+ "name": "kdump-raw-lzo"
+ },
+ {
+ "name": "kdump-raw-snappy"
+ },
+ {
+ "name": "win-dmp"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "elf",
+ "kdump-zlib",
+ "kdump-lzo",
+ "kdump-snappy",
+ "kdump-raw-zlib",
+ "kdump-raw-lzo",
+ "kdump-raw-snappy",
+ "win-dmp"
+ ]
+ },
+ {
+ "name": "368",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "active"
+ },
+ {
+ "name": "completed"
+ },
+ {
+ "name": "failed"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "active",
+ "completed",
+ "failed"
+ ]
+ },
+ {
+ "name": "[367]",
+ "element-type": "367",
+ "meta-type": "array"
+ },
+ {
+ "name": "369",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "nic"
+ },
+ {
+ "name": "user"
+ },
+ {
+ "name": "tap"
+ },
+ {
+ "name": "l2tpv3"
+ },
+ {
+ "name": "socket"
+ },
+ {
+ "name": "stream"
+ },
+ {
+ "name": "dgram"
+ },
+ {
+ "name": "vde"
+ },
+ {
+ "name": "bridge"
+ },
+ {
+ "name": "hubport"
+ },
+ {
+ "name": "netmap"
+ },
+ {
+ "name": "vhost-user"
+ },
+ {
+ "name": "vhost-vdpa"
+ },
+ {
+ "name": "af-xdp"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "nic",
+ "user",
+ "tap",
+ "l2tpv3",
+ "socket",
+ "stream",
+ "dgram",
+ "vde",
+ "bridge",
+ "hubport",
+ "netmap",
+ "vhost-user",
+ "vhost-vdpa",
+ "af-xdp"
+ ]
+ },
+ {
+ "name": "370",
+ "members": [
+ {
+ "name": "netdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "macaddr",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "model",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "addr",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "vectors",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "371",
+ "members": [
+ {
+ "name": "hostname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "restrict",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "ipv4",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "ipv6",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "ip",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "net",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "host",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tftp",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "bootfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "dhcpstart",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "dns",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "dnssearch",
+ "default": null,
+ "type": "[625]"
+ },
+ {
+ "name": "domainname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ipv6-prefix",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ipv6-prefixlen",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "ipv6-host",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ipv6-dns",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "smb",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "smbserver",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "hostfwd",
+ "default": null,
+ "type": "[625]"
+ },
+ {
+ "name": "guestfwd",
+ "default": null,
+ "type": "[625]"
+ },
+ {
+ "name": "tftp-server-name",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "372",
+ "members": [
+ {
+ "name": "ifname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "fd",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "fds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "script",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "downscript",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "br",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "helper",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sndbuf",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "vnet_hdr",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "vhost",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "vhostfd",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "vhostfds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "vhostforce",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "poll-us",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "373",
+ "members": [
+ {
+ "name": "src",
+ "type": "str"
+ },
+ {
+ "name": "dst",
+ "type": "str"
+ },
+ {
+ "name": "srcport",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "dstport",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ipv6",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "udp",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "cookie64",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "counter",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "pincounter",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "txcookie",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "rxcookie",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "txsession",
+ "type": "int"
+ },
+ {
+ "name": "rxsession",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "374",
+ "members": [
+ {
+ "name": "fd",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "listen",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "connect",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "mcast",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "localaddr",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "udp",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "375",
+ "members": [
+ {
+ "name": "addr",
+ "type": "388"
+ },
+ {
+ "name": "server",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reconnect",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "376",
+ "members": [
+ {
+ "name": "local",
+ "default": null,
+ "type": "388"
+ },
+ {
+ "name": "remote",
+ "default": null,
+ "type": "388"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "377",
+ "members": [
+ {
+ "name": "sock",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "378",
+ "members": [
+ {
+ "name": "br",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "helper",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "379",
+ "members": [
+ {
+ "name": "hubid",
+ "type": "int"
+ },
+ {
+ "name": "netdev",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "380",
+ "members": [
+ {
+ "name": "ifname",
+ "type": "str"
+ },
+ {
+ "name": "devname",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "381",
+ "members": [
+ {
+ "name": "ifname",
+ "type": "str"
+ },
+ {
+ "name": "mode",
+ "default": null,
+ "type": "626"
+ },
+ {
+ "name": "force-copy",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "start-queue",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "inhibit",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "sock-fds",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "382",
+ "members": [
+ {
+ "name": "chardev",
+ "type": "str"
+ },
+ {
+ "name": "vhostforce",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "383",
+ "members": [
+ {
+ "name": "vhostdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "vhostfd",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "x-svq",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "unstable"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "387",
+ "members": [
+ {
+ "name": "normal"
+ },
+ {
+ "name": "none"
+ },
+ {
+ "name": "all"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "normal",
+ "none",
+ "all"
+ ]
+ },
+ {
+ "name": "[str]",
+ "element-type": "str",
+ "meta-type": "array"
+ },
+ {
+ "name": "388",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "inet",
+ "type": "587"
+ },
+ {
+ "case": "unix",
+ "type": "627"
+ },
+ {
+ "case": "vsock",
+ "type": "628"
+ },
+ {
+ "case": "fd",
+ "type": "629"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "605"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "389",
+ "members": [
+ {
+ "name": "rss"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "rss"
+ ]
+ },
+ {
+ "name": "390",
+ "members": [
+ {
+ "name": "half"
+ },
+ {
+ "name": "full"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "half",
+ "full"
+ ]
+ },
+ {
+ "name": "391",
+ "members": [
+ {
+ "name": "off"
+ },
+ {
+ "name": "on"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "off",
+ "on"
+ ]
+ },
+ {
+ "name": "392",
+ "members": [
+ {
+ "name": "priority",
+ "type": "int"
+ },
+ {
+ "name": "tbl-id",
+ "type": "int"
+ },
+ {
+ "name": "in-pport",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tunnel-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "eth-type",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "eth-src",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "eth-dst",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ip-proto",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "ip-tos",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "ip-dst",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "393",
+ "members": [
+ {
+ "name": "in-pport",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tunnel-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "eth-src",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "eth-dst",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "ip-proto",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "ip-tos",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "394",
+ "members": [
+ {
+ "name": "goto-tbl",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "group-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "tunnel-lport",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "new-vlan-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "out-pport",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "395",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "passthrough",
+ "type": "630"
+ },
+ {
+ "case": "emulator",
+ "type": "631"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "122"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "396",
+ "members": [
+ {
+ "name": "vnc"
+ },
+ {
+ "name": "spice"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "vnc",
+ "spice"
+ ]
+ },
+ {
+ "name": "397",
+ "members": [
+ {
+ "name": "keep"
+ },
+ {
+ "name": "fail"
+ },
+ {
+ "name": "disconnect"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "keep",
+ "fail",
+ "disconnect"
+ ]
+ },
+ {
+ "name": "398",
+ "members": [
+ {
+ "name": "display",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "399",
+ "members": [
+ {
+ "name": "display",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "400",
+ "members": [
+ {
+ "name": "ppm"
+ },
+ {
+ "name": "png"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ppm",
+ "png"
+ ]
+ },
+ {
+ "name": "401",
+ "members": [
+ {
+ "name": "client"
+ },
+ {
+ "name": "server"
+ },
+ {
+ "name": "unknown"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "client",
+ "server",
+ "unknown"
+ ]
+ },
+ {
+ "name": "[402]",
+ "element-type": "402",
+ "meta-type": "array"
+ },
+ {
+ "name": "402",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "connection-id",
+ "type": "int"
+ },
+ {
+ "name": "channel-type",
+ "type": "int"
+ },
+ {
+ "name": "channel-id",
+ "type": "int"
+ },
+ {
+ "name": "tls",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "403",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "404",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "auth",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "405",
+ "members": [
+ {
+ "name": "ipv4"
+ },
+ {
+ "name": "ipv6"
+ },
+ {
+ "name": "unix"
+ },
+ {
+ "name": "vsock"
+ },
+ {
+ "name": "unknown"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ipv4",
+ "ipv6",
+ "unix",
+ "vsock",
+ "unknown"
+ ]
+ },
+ {
+ "name": "[406]",
+ "element-type": "406",
+ "meta-type": "array"
+ },
+ {
+ "name": "406",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "service",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "websocket",
+ "type": "bool"
+ },
+ {
+ "name": "x509_dname",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "sasl_username",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[407]",
+ "element-type": "407",
+ "meta-type": "array"
+ },
+ {
+ "name": "407",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "service",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "websocket",
+ "type": "bool"
+ },
+ {
+ "name": "auth",
+ "type": "408"
+ },
+ {
+ "name": "vencrypt",
+ "default": null,
+ "type": "409"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "408",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "vnc"
+ },
+ {
+ "name": "ra2"
+ },
+ {
+ "name": "ra2ne"
+ },
+ {
+ "name": "tight"
+ },
+ {
+ "name": "ultra"
+ },
+ {
+ "name": "tls"
+ },
+ {
+ "name": "vencrypt"
+ },
+ {
+ "name": "sasl"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "vnc",
+ "ra2",
+ "ra2ne",
+ "tight",
+ "ultra",
+ "tls",
+ "vencrypt",
+ "sasl"
+ ]
+ },
+ {
+ "name": "409",
+ "members": [
+ {
+ "name": "plain"
+ },
+ {
+ "name": "tls-none"
+ },
+ {
+ "name": "x509-none"
+ },
+ {
+ "name": "tls-vnc"
+ },
+ {
+ "name": "x509-vnc"
+ },
+ {
+ "name": "tls-plain"
+ },
+ {
+ "name": "x509-plain"
+ },
+ {
+ "name": "tls-sasl"
+ },
+ {
+ "name": "x509-sasl"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "plain",
+ "tls-none",
+ "x509-none",
+ "tls-vnc",
+ "x509-vnc",
+ "tls-plain",
+ "x509-plain",
+ "tls-sasl",
+ "x509-sasl"
+ ]
+ },
+ {
+ "name": "410",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "service",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "websocket",
+ "type": "bool"
+ },
+ {
+ "name": "auth",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "411",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "service",
+ "type": "str"
+ },
+ {
+ "name": "family",
+ "type": "405"
+ },
+ {
+ "name": "websocket",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[412]",
+ "element-type": "412",
+ "meta-type": "array"
+ },
+ {
+ "name": "412",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "number",
+ "type": "633"
+ },
+ {
+ "case": "qcode",
+ "type": "634"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "632"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[413]",
+ "element-type": "413",
+ "meta-type": "array"
+ },
+ {
+ "name": "413",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "key",
+ "type": "636"
+ },
+ {
+ "case": "btn",
+ "type": "637"
+ },
+ {
+ "case": "rel",
+ "type": "638"
+ },
+ {
+ "case": "abs",
+ "type": "638"
+ },
+ {
+ "case": "mtt",
+ "type": "639"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "635"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "414",
+ "members": [
+ {
+ "name": "default"
+ },
+ {
+ "name": "none"
+ },
+ {
+ "name": "gtk"
+ },
+ {
+ "name": "sdl"
+ },
+ {
+ "name": "egl-headless"
+ },
+ {
+ "name": "curses"
+ },
+ {
+ "name": "spice-app"
+ },
+ {
+ "name": "dbus"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "default",
+ "none",
+ "gtk",
+ "sdl",
+ "egl-headless",
+ "curses",
+ "spice-app",
+ "dbus"
+ ]
+ },
+ {
+ "name": "415",
+ "members": [
+ {
+ "name": "off"
+ },
+ {
+ "name": "on"
+ },
+ {
+ "name": "core"
+ },
+ {
+ "name": "es"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "off",
+ "on",
+ "core",
+ "es"
+ ]
+ },
+ {
+ "name": "416",
+ "members": [
+ {
+ "name": "grab-on-hover",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "zoom-to-fit",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "show-tabs",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "show-menubar",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "417",
+ "members": [
+ {
+ "name": "left-command-key",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "full-grab",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "swap-opt-cmd",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "zoom-to-fit",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "zoom-interpolation",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "418",
+ "members": [
+ {
+ "name": "charset",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "419",
+ "members": [
+ {
+ "name": "rendernode",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "420",
+ "members": [
+ {
+ "name": "rendernode",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "addr",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "p2p",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "audiodev",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "421",
+ "members": [
+ {
+ "name": "grab-mod",
+ "default": null,
+ "type": "640"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "422",
+ "members": [
+ {
+ "name": "vnc"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "vnc"
+ ]
+ },
+ {
+ "name": "423",
+ "members": [
+ {
+ "name": "tls-certs",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "424",
+ "members": [
+ {
+ "name": "vnc"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "vnc"
+ ]
+ },
+ {
+ "name": "425",
+ "members": [
+ {
+ "name": "addresses",
+ "default": null,
+ "type": "[388]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "426",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "setup"
+ },
+ {
+ "name": "cancelling"
+ },
+ {
+ "name": "cancelled"
+ },
+ {
+ "name": "active"
+ },
+ {
+ "name": "postcopy-active"
+ },
+ {
+ "name": "postcopy-paused"
+ },
+ {
+ "name": "postcopy-recover"
+ },
+ {
+ "name": "completed"
+ },
+ {
+ "name": "failed"
+ },
+ {
+ "name": "colo"
+ },
+ {
+ "name": "pre-switchover"
+ },
+ {
+ "name": "device"
+ },
+ {
+ "name": "wait-unplug"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "setup",
+ "cancelling",
+ "cancelled",
+ "active",
+ "postcopy-active",
+ "postcopy-paused",
+ "postcopy-recover",
+ "completed",
+ "failed",
+ "colo",
+ "pre-switchover",
+ "device",
+ "wait-unplug"
+ ]
+ },
+ {
+ "name": "427",
+ "members": [
+ {
+ "name": "transferred",
+ "type": "int"
+ },
+ {
+ "name": "remaining",
+ "type": "int"
+ },
+ {
+ "name": "total",
+ "type": "int"
+ },
+ {
+ "name": "duplicate",
+ "type": "int"
+ },
+ {
+ "name": "skipped",
+ "type": "int",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "normal",
+ "type": "int"
+ },
+ {
+ "name": "normal-bytes",
+ "type": "int"
+ },
+ {
+ "name": "dirty-pages-rate",
+ "type": "int"
+ },
+ {
+ "name": "mbps",
+ "type": "number"
+ },
+ {
+ "name": "dirty-sync-count",
+ "type": "int"
+ },
+ {
+ "name": "postcopy-requests",
+ "type": "int"
+ },
+ {
+ "name": "page-size",
+ "type": "int"
+ },
+ {
+ "name": "multifd-bytes",
+ "type": "int"
+ },
+ {
+ "name": "pages-per-second",
+ "type": "int"
+ },
+ {
+ "name": "precopy-bytes",
+ "type": "int"
+ },
+ {
+ "name": "downtime-bytes",
+ "type": "int"
+ },
+ {
+ "name": "postcopy-bytes",
+ "type": "int"
+ },
+ {
+ "name": "dirty-sync-missed-zero-copy",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "428",
+ "members": [
+ {
+ "name": "transferred",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "429",
+ "members": [
+ {
+ "name": "cache-size",
+ "type": "int"
+ },
+ {
+ "name": "bytes",
+ "type": "int"
+ },
+ {
+ "name": "pages",
+ "type": "int"
+ },
+ {
+ "name": "cache-miss",
+ "type": "int"
+ },
+ {
+ "name": "cache-miss-rate",
+ "type": "number"
+ },
+ {
+ "name": "encoding-rate",
+ "type": "number"
+ },
+ {
+ "name": "overflow",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "430",
+ "members": [
+ {
+ "name": "pages",
+ "type": "int"
+ },
+ {
+ "name": "busy",
+ "type": "int"
+ },
+ {
+ "name": "busy-rate",
+ "type": "number"
+ },
+ {
+ "name": "compressed-size",
+ "type": "int"
+ },
+ {
+ "name": "compression-rate",
+ "type": "number"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[388]",
+ "element-type": "388",
+ "meta-type": "array"
+ },
+ {
+ "name": "431",
+ "members": [
+ {
+ "name": "xbzrle"
+ },
+ {
+ "name": "rdma-pin-all"
+ },
+ {
+ "name": "auto-converge"
+ },
+ {
+ "name": "zero-blocks"
+ },
+ {
+ "name": "compress",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "events"
+ },
+ {
+ "name": "postcopy-ram"
+ },
+ {
+ "name": "x-colo",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "release-ram"
+ },
+ {
+ "name": "block",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "return-path"
+ },
+ {
+ "name": "pause-before-switchover"
+ },
+ {
+ "name": "multifd"
+ },
+ {
+ "name": "dirty-bitmaps"
+ },
+ {
+ "name": "postcopy-blocktime"
+ },
+ {
+ "name": "late-block-activate"
+ },
+ {
+ "name": "x-ignore-shared",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "validate-uuid"
+ },
+ {
+ "name": "background-snapshot"
+ },
+ {
+ "name": "zero-copy-send"
+ },
+ {
+ "name": "postcopy-preempt"
+ },
+ {
+ "name": "switchover-ack"
+ },
+ {
+ "name": "dirty-limit"
+ },
+ {
+ "name": "mapped-ram"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "xbzrle",
+ "rdma-pin-all",
+ "auto-converge",
+ "zero-blocks",
+ "compress",
+ "events",
+ "postcopy-ram",
+ "x-colo",
+ "release-ram",
+ "block",
+ "return-path",
+ "pause-before-switchover",
+ "multifd",
+ "dirty-bitmaps",
+ "postcopy-blocktime",
+ "late-block-activate",
+ "x-ignore-shared",
+ "validate-uuid",
+ "background-snapshot",
+ "zero-copy-send",
+ "postcopy-preempt",
+ "switchover-ack",
+ "dirty-limit",
+ "mapped-ram"
+ ]
+ },
+ {
+ "name": "432",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "zlib"
+ },
+ {
+ "name": "zstd"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "zlib",
+ "zstd"
+ ]
+ },
+ {
+ "name": "[433]",
+ "element-type": "433",
+ "meta-type": "array"
+ },
+ {
+ "name": "433",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ },
+ {
+ "name": "alias",
+ "type": "str"
+ },
+ {
+ "name": "bitmaps",
+ "type": "[641]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "434",
+ "members": [
+ {
+ "name": "normal"
+ },
+ {
+ "name": "cpr-reboot"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "normal",
+ "cpr-reboot"
+ ]
+ },
+ {
+ "name": "435",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "legacy"
+ },
+ {
+ "name": "multifd"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "legacy",
+ "multifd"
+ ]
+ },
+ {
+ "name": "436",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "primary"
+ },
+ {
+ "name": "secondary"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "primary",
+ "secondary"
+ ]
+ },
+ {
+ "name": "437",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "request"
+ },
+ {
+ "name": "error"
+ },
+ {
+ "name": "processing"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "request",
+ "error",
+ "processing"
+ ]
+ },
+ {
+ "name": "[438]",
+ "element-type": "438",
+ "meta-type": "array"
+ },
+ {
+ "name": "438",
+ "members": [
+ {
+ "name": "channel-type",
+ "type": "642"
+ },
+ {
+ "name": "addr",
+ "type": "643"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "439",
+ "members": [
+ {
+ "name": "second"
+ },
+ {
+ "name": "millisecond"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "second",
+ "millisecond"
+ ]
+ },
+ {
+ "name": "440",
+ "members": [
+ {
+ "name": "page-sampling"
+ },
+ {
+ "name": "dirty-ring"
+ },
+ {
+ "name": "dirty-bitmap"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "page-sampling",
+ "dirty-ring",
+ "dirty-bitmap"
+ ]
+ },
+ {
+ "name": "441",
+ "members": [
+ {
+ "name": "unstarted"
+ },
+ {
+ "name": "measuring"
+ },
+ {
+ "name": "measured"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "unstarted",
+ "measuring",
+ "measured"
+ ]
+ },
+ {
+ "name": "[442]",
+ "element-type": "442",
+ "meta-type": "array"
+ },
+ {
+ "name": "442",
+ "members": [
+ {
+ "name": "id",
+ "type": "int"
+ },
+ {
+ "name": "dirty-rate",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[443]",
+ "element-type": "443",
+ "meta-type": "array"
+ },
+ {
+ "name": "443",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "abort",
+ "type": "645"
+ },
+ {
+ "case": "block-dirty-bitmap-add",
+ "type": "646"
+ },
+ {
+ "case": "block-dirty-bitmap-remove",
+ "type": "647"
+ },
+ {
+ "case": "block-dirty-bitmap-clear",
+ "type": "647"
+ },
+ {
+ "case": "block-dirty-bitmap-enable",
+ "type": "647"
+ },
+ {
+ "case": "block-dirty-bitmap-disable",
+ "type": "647"
+ },
+ {
+ "case": "block-dirty-bitmap-merge",
+ "type": "648"
+ },
+ {
+ "case": "blockdev-backup",
+ "type": "649"
+ },
+ {
+ "case": "blockdev-snapshot",
+ "type": "650"
+ },
+ {
+ "case": "blockdev-snapshot-internal-sync",
+ "type": "651"
+ },
+ {
+ "case": "blockdev-snapshot-sync",
+ "type": "652"
+ },
+ {
+ "case": "drive-backup",
+ "type": "653"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "644"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "444",
+ "members": [
+ {
+ "name": "completion-mode",
+ "default": null,
+ "type": "654"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "445",
+ "members": [
+ {
+ "name": "unavailable"
+ },
+ {
+ "name": "disabled"
+ },
+ {
+ "name": "enabled"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "unavailable",
+ "disabled",
+ "enabled"
+ ]
+ },
+ {
+ "name": "[446]",
+ "element-type": "446",
+ "meta-type": "array"
+ },
+ {
+ "name": "446",
+ "members": [
+ {
+ "name": "oob"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "oob"
+ ]
+ },
+ {
+ "name": "447",
+ "members": [
+ {
+ "name": "major",
+ "type": "int"
+ },
+ {
+ "name": "minor",
+ "type": "int"
+ },
+ {
+ "name": "micro",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "448",
+ "members": [
+ {
+ "name": "builtin"
+ },
+ {
+ "name": "enum"
+ },
+ {
+ "name": "array"
+ },
+ {
+ "name": "object"
+ },
+ {
+ "name": "alternate"
+ },
+ {
+ "name": "command"
+ },
+ {
+ "name": "event"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "builtin",
+ "enum",
+ "array",
+ "object",
+ "alternate",
+ "command",
+ "event"
+ ]
+ },
+ {
+ "name": "449",
+ "members": [
+ {
+ "name": "json-type",
+ "type": "655"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "450",
+ "members": [
+ {
+ "name": "members",
+ "type": "[656]"
+ },
+ {
+ "name": "values",
+ "type": "[str]",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "451",
+ "members": [
+ {
+ "name": "element-type",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "452",
+ "members": [
+ {
+ "name": "members",
+ "type": "[657]"
+ },
+ {
+ "name": "tag",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "variants",
+ "default": null,
+ "type": "[658]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "453",
+ "members": [
+ {
+ "name": "members",
+ "type": "[659]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "454",
+ "members": [
+ {
+ "name": "arg-type",
+ "type": "str"
+ },
+ {
+ "name": "ret-type",
+ "type": "str"
+ },
+ {
+ "name": "allow-oob",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "455",
+ "members": [
+ {
+ "name": "arg-type",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "456",
+ "members": [
+ {
+ "name": "acpi-generic-initiator"
+ },
+ {
+ "name": "authz-list"
+ },
+ {
+ "name": "authz-listfile"
+ },
+ {
+ "name": "authz-pam"
+ },
+ {
+ "name": "authz-simple"
+ },
+ {
+ "name": "can-bus"
+ },
+ {
+ "name": "can-host-socketcan"
+ },
+ {
+ "name": "colo-compare"
+ },
+ {
+ "name": "cryptodev-backend"
+ },
+ {
+ "name": "cryptodev-backend-builtin"
+ },
+ {
+ "name": "cryptodev-backend-lkcf"
+ },
+ {
+ "name": "cryptodev-vhost-user"
+ },
+ {
+ "name": "dbus-vmstate"
+ },
+ {
+ "name": "filter-buffer"
+ },
+ {
+ "name": "filter-dump"
+ },
+ {
+ "name": "filter-mirror"
+ },
+ {
+ "name": "filter-redirector"
+ },
+ {
+ "name": "filter-replay"
+ },
+ {
+ "name": "filter-rewriter"
+ },
+ {
+ "name": "input-barrier"
+ },
+ {
+ "name": "input-linux"
+ },
+ {
+ "name": "iommufd"
+ },
+ {
+ "name": "iothread"
+ },
+ {
+ "name": "main-loop"
+ },
+ {
+ "name": "memory-backend-epc"
+ },
+ {
+ "name": "memory-backend-file"
+ },
+ {
+ "name": "memory-backend-memfd"
+ },
+ {
+ "name": "memory-backend-ram"
+ },
+ {
+ "name": "pef-guest"
+ },
+ {
+ "name": "pr-manager-helper"
+ },
+ {
+ "name": "qtest"
+ },
+ {
+ "name": "rng-builtin"
+ },
+ {
+ "name": "rng-egd"
+ },
+ {
+ "name": "rng-random"
+ },
+ {
+ "name": "secret"
+ },
+ {
+ "name": "secret_keyring"
+ },
+ {
+ "name": "sev-guest"
+ },
+ {
+ "name": "thread-context"
+ },
+ {
+ "name": "s390-pv-guest"
+ },
+ {
+ "name": "throttle-group"
+ },
+ {
+ "name": "tls-creds-anon"
+ },
+ {
+ "name": "tls-creds-psk"
+ },
+ {
+ "name": "tls-creds-x509"
+ },
+ {
+ "name": "tls-cipher-suites"
+ },
+ {
+ "name": "x-remote-object",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-vfio-user-server",
+ "features": [
+ "unstable"
+ ]
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "acpi-generic-initiator",
+ "authz-list",
+ "authz-listfile",
+ "authz-pam",
+ "authz-simple",
+ "can-bus",
+ "can-host-socketcan",
+ "colo-compare",
+ "cryptodev-backend",
+ "cryptodev-backend-builtin",
+ "cryptodev-backend-lkcf",
+ "cryptodev-vhost-user",
+ "dbus-vmstate",
+ "filter-buffer",
+ "filter-dump",
+ "filter-mirror",
+ "filter-redirector",
+ "filter-replay",
+ "filter-rewriter",
+ "input-barrier",
+ "input-linux",
+ "iommufd",
+ "iothread",
+ "main-loop",
+ "memory-backend-epc",
+ "memory-backend-file",
+ "memory-backend-memfd",
+ "memory-backend-ram",
+ "pef-guest",
+ "pr-manager-helper",
+ "qtest",
+ "rng-builtin",
+ "rng-egd",
+ "rng-random",
+ "secret",
+ "secret_keyring",
+ "sev-guest",
+ "thread-context",
+ "s390-pv-guest",
+ "throttle-group",
+ "tls-creds-anon",
+ "tls-creds-psk",
+ "tls-creds-x509",
+ "tls-cipher-suites",
+ "x-remote-object",
+ "x-vfio-user-server"
+ ]
+ },
+ {
+ "name": "457",
+ "members": [
+ {
+ "name": "pci-dev",
+ "type": "str"
+ },
+ {
+ "name": "node",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "458",
+ "members": [
+ {
+ "name": "policy",
+ "default": null,
+ "type": "660"
+ },
+ {
+ "name": "rules",
+ "default": null,
+ "type": "[661]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "459",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "refresh",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "460",
+ "members": [
+ {
+ "name": "service",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "461",
+ "members": [
+ {
+ "name": "identity",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "462",
+ "members": [
+ {
+ "name": "if",
+ "type": "str"
+ },
+ {
+ "name": "canbus",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "463",
+ "members": [
+ {
+ "name": "primary_in",
+ "type": "str"
+ },
+ {
+ "name": "secondary_in",
+ "type": "str"
+ },
+ {
+ "name": "outdev",
+ "type": "str"
+ },
+ {
+ "name": "iothread",
+ "type": "str"
+ },
+ {
+ "name": "notify_dev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "compare_timeout",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "expired_scan_cycle",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max_queue_size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "vnet_hdr_support",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "464",
+ "members": [
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "throttle-bps",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "throttle-ops",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "465",
+ "members": [
+ {
+ "name": "queues",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "throttle-bps",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "throttle-ops",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "chardev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "466",
+ "members": [
+ {
+ "name": "addr",
+ "type": "str"
+ },
+ {
+ "name": "id-list",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "467",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ },
+ {
+ "name": "interval",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "468",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ },
+ {
+ "name": "file",
+ "type": "str"
+ },
+ {
+ "name": "maxlen",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "469",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ },
+ {
+ "name": "outdev",
+ "type": "str"
+ },
+ {
+ "name": "vnet_hdr_support",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "470",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ },
+ {
+ "name": "indev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "outdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "vnet_hdr_support",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "471",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "472",
+ "members": [
+ {
+ "name": "netdev",
+ "type": "str"
+ },
+ {
+ "name": "queue",
+ "default": null,
+ "type": "662"
+ },
+ {
+ "name": "status",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "position",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "insert",
+ "default": null,
+ "type": "663"
+ },
+ {
+ "name": "vnet_hdr_support",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "473",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "server",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "x-origin",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "y-origin",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "width",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "height",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "474",
+ "members": [
+ {
+ "name": "evdev",
+ "type": "str"
+ },
+ {
+ "name": "grab_all",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "repeat",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "grab-toggle",
+ "default": null,
+ "type": "664"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "475",
+ "members": [
+ {
+ "name": "fd",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "476",
+ "members": [
+ {
+ "name": "aio-max-batch",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-pool-min",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-pool-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "poll-max-ns",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "poll-grow",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "poll-shrink",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "477",
+ "members": [
+ {
+ "name": "aio-max-batch",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-pool-min",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-pool-max",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "478",
+ "members": [
+ {
+ "name": "dump",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "merge",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "default": null,
+ "type": "501"
+ },
+ {
+ "name": "prealloc",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "prealloc-context",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "share",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "479",
+ "members": [
+ {
+ "name": "dump",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "merge",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "default": null,
+ "type": "501"
+ },
+ {
+ "name": "prealloc",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "prealloc-context",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "share",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "align",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "discard-data",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "mem-path",
+ "type": "str"
+ },
+ {
+ "name": "pmem",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "readonly",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "rom",
+ "default": null,
+ "type": "573"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "480",
+ "members": [
+ {
+ "name": "dump",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "merge",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "default": null,
+ "type": "501"
+ },
+ {
+ "name": "prealloc",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "prealloc-context",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "share",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "hugetlb",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "hugetlbsize",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "seal",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "481",
+ "members": [
+ {
+ "name": "dump",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "merge",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "default": null,
+ "type": "501"
+ },
+ {
+ "name": "prealloc",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "prealloc-context",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "share",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "482",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "483",
+ "members": [
+ {
+ "name": "chardev",
+ "type": "str"
+ },
+ {
+ "name": "log",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "484",
+ "members": [
+ {
+ "name": "opened",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "485",
+ "members": [
+ {
+ "name": "opened",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "chardev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "486",
+ "members": [
+ {
+ "name": "opened",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "filename",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "487",
+ "members": [
+ {
+ "name": "loaded",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "665"
+ },
+ {
+ "name": "keyid",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "iv",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "data",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "file",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "488",
+ "members": [
+ {
+ "name": "loaded",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "665"
+ },
+ {
+ "name": "keyid",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "iv",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "serial",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "489",
+ "members": [
+ {
+ "name": "sev-device",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "dh-cert-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "session-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "policy",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "handle",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cbitpos",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "reduced-phys-bits",
+ "type": "int"
+ },
+ {
+ "name": "kernel-hashes",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "490",
+ "members": [
+ {
+ "name": "cpu-affinity",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "node-affinity",
+ "default": null,
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "491",
+ "members": [
+ {
+ "name": "limits",
+ "default": null,
+ "type": "666"
+ },
+ {
+ "name": "x-iops-total",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-total-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-total-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-read",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-read-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-read-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-write",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-write-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-write-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-total",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-total-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-total-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-read",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-read-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-read-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-write",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-write-max",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-bps-write-max-length",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ },
+ {
+ "name": "x-iops-size",
+ "default": null,
+ "type": "int",
+ "features": [
+ "unstable"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "492",
+ "members": [
+ {
+ "name": "verify-peer",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "dir",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "endpoint",
+ "default": null,
+ "type": "667"
+ },
+ {
+ "name": "priority",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "loaded",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "493",
+ "members": [
+ {
+ "name": "verify-peer",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "dir",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "endpoint",
+ "default": null,
+ "type": "667"
+ },
+ {
+ "name": "priority",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "loaded",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "username",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "494",
+ "members": [
+ {
+ "name": "verify-peer",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "dir",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "endpoint",
+ "default": null,
+ "type": "667"
+ },
+ {
+ "name": "priority",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "loaded",
+ "default": null,
+ "type": "bool",
+ "features": [
+ "deprecated"
+ ]
+ },
+ {
+ "name": "sanity-check",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "passwordid",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "495",
+ "members": [
+ {
+ "name": "verify-peer",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "dir",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "endpoint",
+ "default": null,
+ "type": "667"
+ },
+ {
+ "name": "priority",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "496",
+ "members": [
+ {
+ "name": "fd",
+ "type": "str"
+ },
+ {
+ "name": "devid",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "497",
+ "members": [
+ {
+ "name": "socket",
+ "type": "388"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "498",
+ "members": [
+ {
+ "name": "node-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "drawer-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "book-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "socket-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "die-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cluster-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "core-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-id",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "499",
+ "members": [
+ {
+ "name": "aarch64"
+ },
+ {
+ "name": "alpha"
+ },
+ {
+ "name": "arm"
+ },
+ {
+ "name": "avr"
+ },
+ {
+ "name": "cris"
+ },
+ {
+ "name": "hppa"
+ },
+ {
+ "name": "i386"
+ },
+ {
+ "name": "loongarch64"
+ },
+ {
+ "name": "m68k"
+ },
+ {
+ "name": "microblaze"
+ },
+ {
+ "name": "microblazeel"
+ },
+ {
+ "name": "mips"
+ },
+ {
+ "name": "mips64"
+ },
+ {
+ "name": "mips64el"
+ },
+ {
+ "name": "mipsel"
+ },
+ {
+ "name": "nios2"
+ },
+ {
+ "name": "or1k"
+ },
+ {
+ "name": "ppc"
+ },
+ {
+ "name": "ppc64"
+ },
+ {
+ "name": "riscv32"
+ },
+ {
+ "name": "riscv64"
+ },
+ {
+ "name": "rx"
+ },
+ {
+ "name": "s390x"
+ },
+ {
+ "name": "sh4"
+ },
+ {
+ "name": "sh4eb"
+ },
+ {
+ "name": "sparc"
+ },
+ {
+ "name": "sparc64"
+ },
+ {
+ "name": "tricore"
+ },
+ {
+ "name": "x86_64"
+ },
+ {
+ "name": "xtensa"
+ },
+ {
+ "name": "xtensaeb"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "aarch64",
+ "alpha",
+ "arm",
+ "avr",
+ "cris",
+ "hppa",
+ "i386",
+ "loongarch64",
+ "m68k",
+ "microblaze",
+ "microblazeel",
+ "mips",
+ "mips64",
+ "mips64el",
+ "mipsel",
+ "nios2",
+ "or1k",
+ "ppc",
+ "ppc64",
+ "riscv32",
+ "riscv64",
+ "rx",
+ "s390x",
+ "sh4",
+ "sh4eb",
+ "sparc",
+ "sparc64",
+ "tricore",
+ "x86_64",
+ "xtensa",
+ "xtensaeb"
+ ]
+ },
+ {
+ "name": "500",
+ "members": [
+ {
+ "name": "cpu-state",
+ "type": "668"
+ },
+ {
+ "name": "dedicated",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "entitlement",
+ "default": null,
+ "type": "517"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "501",
+ "members": [
+ {
+ "name": "default"
+ },
+ {
+ "name": "preferred"
+ },
+ {
+ "name": "bind"
+ },
+ {
+ "name": "interleave"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "default",
+ "preferred",
+ "bind",
+ "interleave"
+ ]
+ },
+ {
+ "name": "502",
+ "members": [
+ {
+ "name": "node"
+ },
+ {
+ "name": "dist"
+ },
+ {
+ "name": "cpu"
+ },
+ {
+ "name": "hmat-lb"
+ },
+ {
+ "name": "hmat-cache"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "node",
+ "dist",
+ "cpu",
+ "hmat-lb",
+ "hmat-cache"
+ ]
+ },
+ {
+ "name": "503",
+ "members": [
+ {
+ "name": "nodeid",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cpus",
+ "default": null,
+ "type": "[int]"
+ },
+ {
+ "name": "mem",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "initiator",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "504",
+ "members": [
+ {
+ "name": "src",
+ "type": "int"
+ },
+ {
+ "name": "dst",
+ "type": "int"
+ },
+ {
+ "name": "val",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "505",
+ "members": [
+ {
+ "name": "node-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "drawer-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "book-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "socket-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "die-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cluster-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "core-id",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "thread-id",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "506",
+ "members": [
+ {
+ "name": "initiator",
+ "type": "int"
+ },
+ {
+ "name": "target",
+ "type": "int"
+ },
+ {
+ "name": "hierarchy",
+ "type": "669"
+ },
+ {
+ "name": "data-type",
+ "type": "670"
+ },
+ {
+ "name": "latency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bandwidth",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "507",
+ "members": [
+ {
+ "name": "node-id",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "level",
+ "type": "int"
+ },
+ {
+ "name": "associativity",
+ "type": "671"
+ },
+ {
+ "name": "policy",
+ "type": "672"
+ },
+ {
+ "name": "line",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "508",
+ "members": [
+ {
+ "name": "dimm"
+ },
+ {
+ "name": "nvdimm"
+ },
+ {
+ "name": "virtio-pmem"
+ },
+ {
+ "name": "virtio-mem"
+ },
+ {
+ "name": "sgx-epc"
+ },
+ {
+ "name": "hv-balloon"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "dimm",
+ "nvdimm",
+ "virtio-pmem",
+ "virtio-mem",
+ "sgx-epc",
+ "hv-balloon"
+ ]
+ },
+ {
+ "name": "509",
+ "members": [
+ {
+ "name": "data",
+ "type": "673"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "510",
+ "members": [
+ {
+ "name": "data",
+ "type": "674"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "511",
+ "members": [
+ {
+ "name": "data",
+ "type": "675"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "512",
+ "members": [
+ {
+ "name": "data",
+ "type": "676"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "513",
+ "members": [
+ {
+ "name": "data",
+ "type": "677"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "514",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "props",
+ "default": null,
+ "type": "any"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "515",
+ "members": [
+ {
+ "name": "incompatible"
+ },
+ {
+ "name": "identical"
+ },
+ {
+ "name": "superset"
+ },
+ {
+ "name": "subset"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "incompatible",
+ "identical",
+ "superset",
+ "subset"
+ ]
+ },
+ {
+ "name": "516",
+ "members": [
+ {
+ "name": "static"
+ },
+ {
+ "name": "full"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "static",
+ "full"
+ ]
+ },
+ {
+ "name": "517",
+ "members": [
+ {
+ "name": "auto"
+ },
+ {
+ "name": "low"
+ },
+ {
+ "name": "medium"
+ },
+ {
+ "name": "high"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "auto",
+ "low",
+ "medium",
+ "high"
+ ]
+ },
+ {
+ "name": "519",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "record"
+ },
+ {
+ "name": "play"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "record",
+ "play"
+ ]
+ },
+ {
+ "name": "520",
+ "members": [
+ {
+ "name": "block-node"
+ },
+ {
+ "name": "chardev"
+ },
+ {
+ "name": "migration"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "block-node",
+ "chardev",
+ "migration"
+ ]
+ },
+ {
+ "name": "521",
+ "members": [
+ {
+ "name": "node-name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "522",
+ "members": [
+ {
+ "name": "id",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[523]",
+ "element-type": "523",
+ "meta-type": "array"
+ },
+ {
+ "name": "523",
+ "members": [
+ {
+ "name": "fd",
+ "type": "int"
+ },
+ {
+ "name": "opaque",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[524]",
+ "element-type": "524",
+ "meta-type": "array"
+ },
+ {
+ "name": "524",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "678"
+ },
+ {
+ "name": "help",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "default",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[526]",
+ "element-type": "526",
+ "meta-type": "array"
+ },
+ {
+ "name": "526",
+ "members": [
+ {
+ "name": "node",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "528",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "alsa"
+ },
+ {
+ "name": "dbus"
+ },
+ {
+ "name": "jack"
+ },
+ {
+ "name": "oss"
+ },
+ {
+ "name": "pa"
+ },
+ {
+ "name": "pipewire"
+ },
+ {
+ "name": "sdl"
+ },
+ {
+ "name": "spice"
+ },
+ {
+ "name": "wav"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "alsa",
+ "dbus",
+ "jack",
+ "oss",
+ "pa",
+ "pipewire",
+ "sdl",
+ "spice",
+ "wav"
+ ]
+ },
+ {
+ "name": "529",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "679"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "530",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "680"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "680"
+ },
+ {
+ "name": "threshold",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "531",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "681"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "681"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "532",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "latency",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "533",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "682"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "682"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "534",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "683"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "683"
+ },
+ {
+ "name": "try-mmap",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "exclusive",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "dsp-policy",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "535",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "684"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "684"
+ },
+ {
+ "name": "server",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "536",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "685"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "685"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "537",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "686"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "686"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "538",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "dev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "latency",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "539",
+ "members": [
+ {
+ "name": "in",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "out",
+ "default": null,
+ "type": "679"
+ },
+ {
+ "name": "path",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "540",
+ "members": [
+ {
+ "name": "DIMM"
+ },
+ {
+ "name": "CPU"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "DIMM",
+ "CPU"
+ ]
+ },
+ {
+ "name": "[541]",
+ "element-type": "541",
+ "meta-type": "array"
+ },
+ {
+ "name": "541",
+ "members": [
+ {
+ "name": "bus",
+ "type": "int"
+ },
+ {
+ "name": "slot",
+ "type": "int"
+ },
+ {
+ "name": "function",
+ "type": "int"
+ },
+ {
+ "name": "class_info",
+ "type": "687"
+ },
+ {
+ "name": "id",
+ "type": "688"
+ },
+ {
+ "name": "irq",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "irq_pin",
+ "type": "int"
+ },
+ {
+ "name": "qdev_id",
+ "type": "str"
+ },
+ {
+ "name": "pci_bridge",
+ "default": null,
+ "type": "689"
+ },
+ {
+ "name": "regions",
+ "type": "[690]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "542",
+ "members": [
+ {
+ "name": "vm"
+ },
+ {
+ "name": "vcpu"
+ },
+ {
+ "name": "cryptodev"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "vm",
+ "vcpu",
+ "cryptodev"
+ ]
+ },
+ {
+ "name": "[543]",
+ "element-type": "543",
+ "meta-type": "array"
+ },
+ {
+ "name": "543",
+ "members": [
+ {
+ "name": "provider",
+ "type": "545"
+ },
+ {
+ "name": "names",
+ "default": null,
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "544",
+ "members": [
+ {
+ "name": "vcpus",
+ "default": null,
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "545",
+ "members": [
+ {
+ "name": "kvm"
+ },
+ {
+ "name": "cryptodev"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "kvm",
+ "cryptodev"
+ ]
+ },
+ {
+ "name": "[546]",
+ "element-type": "546",
+ "meta-type": "array"
+ },
+ {
+ "name": "546",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "value",
+ "type": "691"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[547]",
+ "element-type": "547",
+ "meta-type": "array"
+ },
+ {
+ "name": "547",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "692"
+ },
+ {
+ "name": "unit",
+ "default": null,
+ "type": "693"
+ },
+ {
+ "name": "base",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "exponent",
+ "type": "int"
+ },
+ {
+ "name": "bucket-size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "548",
+ "members": [
+ {
+ "name": "transports",
+ "type": "[str]"
+ },
+ {
+ "name": "dev-features",
+ "default": null,
+ "type": "[str]"
+ },
+ {
+ "name": "unknown-dev-features",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "549",
+ "members": [
+ {
+ "name": "statuses",
+ "type": "[str]"
+ },
+ {
+ "name": "unknown-statuses",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "550",
+ "members": [
+ {
+ "name": "n-mem-sections",
+ "type": "int"
+ },
+ {
+ "name": "n-tmp-sections",
+ "type": "int"
+ },
+ {
+ "name": "nvqs",
+ "type": "int"
+ },
+ {
+ "name": "vq-index",
+ "type": "int"
+ },
+ {
+ "name": "features",
+ "type": "548"
+ },
+ {
+ "name": "acked-features",
+ "type": "548"
+ },
+ {
+ "name": "backend-features",
+ "type": "548"
+ },
+ {
+ "name": "protocol-features",
+ "type": "694"
+ },
+ {
+ "name": "max-queues",
+ "type": "int"
+ },
+ {
+ "name": "backend-cap",
+ "type": "int"
+ },
+ {
+ "name": "log-enabled",
+ "type": "bool"
+ },
+ {
+ "name": "log-size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[551]",
+ "element-type": "551",
+ "meta-type": "array"
+ },
+ {
+ "name": "551",
+ "members": [
+ {
+ "name": "addr",
+ "type": "int"
+ },
+ {
+ "name": "len",
+ "type": "int"
+ },
+ {
+ "name": "flags",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "552",
+ "members": [
+ {
+ "name": "flags",
+ "type": "int"
+ },
+ {
+ "name": "idx",
+ "type": "int"
+ },
+ {
+ "name": "ring",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "553",
+ "members": [
+ {
+ "name": "flags",
+ "type": "int"
+ },
+ {
+ "name": "idx",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[554]",
+ "element-type": "554",
+ "meta-type": "array"
+ },
+ {
+ "name": "554",
+ "members": [
+ {
+ "name": "cipher"
+ },
+ {
+ "name": "hash"
+ },
+ {
+ "name": "mac"
+ },
+ {
+ "name": "aead"
+ },
+ {
+ "name": "akcipher"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "cipher",
+ "hash",
+ "mac",
+ "aead",
+ "akcipher"
+ ]
+ },
+ {
+ "name": "[555]",
+ "element-type": "555",
+ "meta-type": "array"
+ },
+ {
+ "name": "555",
+ "members": [
+ {
+ "name": "queue",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "695"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "556",
+ "members": [
+ {
+ "name": "informational"
+ },
+ {
+ "name": "warning"
+ },
+ {
+ "name": "failure"
+ },
+ {
+ "name": "fatal"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "informational",
+ "warning",
+ "failure",
+ "fatal"
+ ]
+ },
+ {
+ "name": "[557]",
+ "element-type": "557",
+ "meta-type": "array"
+ },
+ {
+ "name": "557",
+ "members": [
+ {
+ "name": "type",
+ "type": "696"
+ },
+ {
+ "name": "header",
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "558",
+ "members": [
+ {
+ "name": "cache-data-ecc"
+ },
+ {
+ "name": "mem-data-ecc"
+ },
+ {
+ "name": "crc-threshold"
+ },
+ {
+ "name": "retry-threshold"
+ },
+ {
+ "name": "cache-poison-received"
+ },
+ {
+ "name": "mem-poison-received"
+ },
+ {
+ "name": "physical"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "cache-data-ecc",
+ "mem-data-ecc",
+ "crc-threshold",
+ "retry-threshold",
+ "cache-poison-received",
+ "mem-poison-received",
+ "physical"
+ ]
+ },
+ {
+ "name": "559",
+ "members": [
+ {
+ "name": "hyper-v"
+ },
+ {
+ "name": "s390"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "hyper-v",
+ "s390"
+ ]
+ },
+ {
+ "name": "560",
+ "members": [
+ {
+ "name": "arg1",
+ "type": "int"
+ },
+ {
+ "name": "arg2",
+ "type": "int"
+ },
+ {
+ "name": "arg3",
+ "type": "int"
+ },
+ {
+ "name": "arg4",
+ "type": "int"
+ },
+ {
+ "name": "arg5",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "561",
+ "members": [
+ {
+ "name": "core",
+ "type": "int"
+ },
+ {
+ "name": "psw-mask",
+ "type": "int"
+ },
+ {
+ "name": "psw-addr",
+ "type": "int"
+ },
+ {
+ "name": "reason",
+ "type": "697"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[562]",
+ "element-type": "562",
+ "meta-type": "array"
+ },
+ {
+ "name": "562",
+ "members": [
+ {
+ "name": "interval_length",
+ "type": "int"
+ },
+ {
+ "name": "min_rd_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "max_rd_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "avg_rd_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "min_wr_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "max_wr_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "avg_wr_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "min_zone_append_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "max_zone_append_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "avg_zone_append_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "min_flush_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "max_flush_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "avg_flush_latency_ns",
+ "type": "int"
+ },
+ {
+ "name": "avg_rd_queue_depth",
+ "type": "number"
+ },
+ {
+ "name": "avg_wr_queue_depth",
+ "type": "number"
+ },
+ {
+ "name": "avg_zone_append_queue_depth",
+ "type": "number"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "563",
+ "members": [
+ {
+ "name": "boundaries",
+ "type": "[int]"
+ },
+ {
+ "name": "bins",
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "564",
+ "members": [
+ {
+ "name": "discard-nb-ok",
+ "type": "int"
+ },
+ {
+ "name": "discard-nb-failed",
+ "type": "int"
+ },
+ {
+ "name": "discard-bytes-ok",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "565",
+ "members": [
+ {
+ "name": "completion-errors",
+ "type": "int"
+ },
+ {
+ "name": "aligned-accesses",
+ "type": "int"
+ },
+ {
+ "name": "unaligned-accesses",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[78]",
+ "element-type": "78",
+ "meta-type": "array"
+ },
+ {
+ "name": "566",
+ "tag": "type",
+ "variants": [
+ {
+ "case": "qcow2",
+ "type": "699"
+ },
+ {
+ "case": "vmdk",
+ "type": "700"
+ },
+ {
+ "case": "luks",
+ "type": "701"
+ },
+ {
+ "case": "rbd",
+ "type": "702"
+ },
+ {
+ "case": "file",
+ "type": "703"
+ }
+ ],
+ "members": [
+ {
+ "name": "type",
+ "type": "698"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "567",
+ "members": [
+ {
+ "name": "block-backend"
+ },
+ {
+ "name": "block-job"
+ },
+ {
+ "name": "block-driver"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "block-backend",
+ "block-job",
+ "block-driver"
+ ]
+ },
+ {
+ "name": "[568]",
+ "element-type": "568",
+ "meta-type": "array"
+ },
+ {
+ "name": "568",
+ "members": [
+ {
+ "name": "consistent-read"
+ },
+ {
+ "name": "write"
+ },
+ {
+ "name": "write-unchanged"
+ },
+ {
+ "name": "resize"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "consistent-read",
+ "write",
+ "write-unchanged",
+ "resize"
+ ]
+ },
+ {
+ "name": "569",
+ "members": [
+ {
+ "type": "58"
+ },
+ {
+ "type": "str"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "[570]",
+ "element-type": "570",
+ "meta-type": "array"
+ },
+ {
+ "name": "570",
+ "members": [
+ {
+ "name": "event",
+ "type": "704"
+ },
+ {
+ "name": "state",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iotype",
+ "default": null,
+ "type": "705"
+ },
+ {
+ "name": "errno",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "sector",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "once",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "immediately",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[571]",
+ "element-type": "571",
+ "meta-type": "array"
+ },
+ {
+ "name": "571",
+ "members": [
+ {
+ "name": "event",
+ "type": "704"
+ },
+ {
+ "name": "state",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "new_state",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "572",
+ "members": [
+ {
+ "name": "break-guest-write"
+ },
+ {
+ "name": "break-snapshot"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "break-guest-write",
+ "break-snapshot"
+ ]
+ },
+ {
+ "name": "573",
+ "members": [
+ {
+ "name": "auto"
+ },
+ {
+ "name": "on"
+ },
+ {
+ "name": "off"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "auto",
+ "on",
+ "off"
+ ]
+ },
+ {
+ "name": "574",
+ "members": [
+ {
+ "name": "threads"
+ },
+ {
+ "name": "native"
+ },
+ {
+ "name": "io_uring"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "threads",
+ "native",
+ "io_uring"
+ ]
+ },
+ {
+ "name": "575",
+ "members": [
+ {
+ "name": "tcp"
+ },
+ {
+ "name": "iser"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "tcp",
+ "iser"
+ ]
+ },
+ {
+ "name": "576",
+ "members": [
+ {
+ "name": "crc32c"
+ },
+ {
+ "name": "none"
+ },
+ {
+ "name": "crc32c-none"
+ },
+ {
+ "name": "none-crc32c"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "crc32c",
+ "none",
+ "crc32c-none",
+ "none-crc32c"
+ ]
+ },
+ {
+ "name": "577",
+ "members": [
+ {
+ "name": "type",
+ "type": "706"
+ },
+ {
+ "name": "host",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "578",
+ "members": [
+ {
+ "type": "58"
+ },
+ {
+ "type": "str"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "579",
+ "members": [
+ {
+ "type": "707"
+ },
+ {
+ "type": "708"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "580",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "aes",
+ "type": "710"
+ },
+ {
+ "case": "luks",
+ "type": "711"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "709"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "581",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "aes",
+ "type": "710"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "712"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[569]",
+ "element-type": "569",
+ "meta-type": "array"
+ },
+ {
+ "name": "582",
+ "members": [
+ {
+ "name": "quorum"
+ },
+ {
+ "name": "fifo"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "quorum",
+ "fifo"
+ ]
+ },
+ {
+ "name": "583",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "luks",
+ "type": "714"
+ },
+ {
+ "case": "luks2",
+ "type": "715"
+ },
+ {
+ "case": "luks-any",
+ "type": "716"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "713"
+ },
+ {
+ "name": "parent",
+ "default": null,
+ "type": "583"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[584]",
+ "element-type": "584",
+ "meta-type": "array"
+ },
+ {
+ "name": "584",
+ "members": [
+ {
+ "name": "cephx"
+ },
+ {
+ "name": "none"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "cephx",
+ "none"
+ ]
+ },
+ {
+ "name": "[585]",
+ "element-type": "585",
+ "meta-type": "array"
+ },
+ {
+ "name": "585",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "586",
+ "members": [
+ {
+ "name": "primary"
+ },
+ {
+ "name": "secondary"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "primary",
+ "secondary"
+ ]
+ },
+ {
+ "name": "587",
+ "members": [
+ {
+ "name": "host",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ },
+ {
+ "name": "numeric",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "to",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "ipv4",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "ipv6",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "keep-alive",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "mptcp",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "588",
+ "tag": "mode",
+ "variants": [
+ {
+ "case": "hash",
+ "type": "718"
+ },
+ {
+ "case": "none",
+ "type": "0"
+ },
+ {
+ "case": "known_hosts",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "mode",
+ "type": "717"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "589",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "preallocation",
+ "default": null,
+ "type": "719"
+ },
+ {
+ "name": "nocow",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "extent-size-hint",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "590",
+ "members": [
+ {
+ "name": "location",
+ "type": "327"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "preallocation",
+ "default": null,
+ "type": "719"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "591",
+ "members": [
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cipher-alg",
+ "default": null,
+ "type": "720"
+ },
+ {
+ "name": "cipher-mode",
+ "default": null,
+ "type": "721"
+ },
+ {
+ "name": "ivgen-alg",
+ "default": null,
+ "type": "722"
+ },
+ {
+ "name": "ivgen-hash-alg",
+ "default": null,
+ "type": "723"
+ },
+ {
+ "name": "hash-alg",
+ "default": null,
+ "type": "723"
+ },
+ {
+ "name": "iter-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "detached-header",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "file",
+ "default": null,
+ "type": "569"
+ },
+ {
+ "name": "header",
+ "default": null,
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "preallocation",
+ "default": null,
+ "type": "719"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "592",
+ "members": [
+ {
+ "name": "location",
+ "type": "334"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "593",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "594",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "724"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "595",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "data-file",
+ "default": null,
+ "type": "569"
+ },
+ {
+ "name": "data-file-raw",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "extended-l2",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "version",
+ "default": null,
+ "type": "725"
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-fmt",
+ "default": null,
+ "type": "314"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "724"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "preallocation",
+ "default": null,
+ "type": "719"
+ },
+ {
+ "name": "lazy-refcounts",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "refcount-bits",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "compression-type",
+ "default": null,
+ "type": "726"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "596",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "backing-fmt",
+ "default": null,
+ "type": "314"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "table-size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "597",
+ "members": [
+ {
+ "name": "location",
+ "type": "344"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "727"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "598",
+ "members": [
+ {
+ "name": "location",
+ "type": "346"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "599",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "preallocation",
+ "default": null,
+ "type": "719"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "600",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "log-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "block-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "subformat",
+ "default": null,
+ "type": "728"
+ },
+ {
+ "name": "block-state-zero",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "601",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "extents",
+ "default": null,
+ "type": "[569]"
+ },
+ {
+ "name": "subformat",
+ "default": null,
+ "type": "729"
+ },
+ {
+ "name": "backing-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "adapter-type",
+ "default": null,
+ "type": "730"
+ },
+ {
+ "name": "hwversion",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "toolsversion",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "zeroed-grain",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "602",
+ "members": [
+ {
+ "name": "file",
+ "type": "569"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "subformat",
+ "default": null,
+ "type": "731"
+ },
+ {
+ "name": "force-size",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "603",
+ "members": [
+ {
+ "name": "state",
+ "type": "732"
+ },
+ {
+ "name": "new-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "old-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "keyslot",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iter-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "604",
+ "members": [
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "733"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "null",
+ "json-type": "null",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "605",
+ "members": [
+ {
+ "name": "inet"
+ },
+ {
+ "name": "unix"
+ },
+ {
+ "name": "vsock"
+ },
+ {
+ "name": "fd"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "inet",
+ "unix",
+ "vsock",
+ "fd"
+ ]
+ },
+ {
+ "name": "606",
+ "members": [
+ {
+ "name": "data",
+ "type": "587"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "607",
+ "members": [
+ {
+ "name": "data",
+ "type": "627"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "608",
+ "members": [
+ {
+ "name": "data",
+ "type": "628"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "609",
+ "members": [
+ {
+ "name": "data",
+ "type": "629"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "610",
+ "members": [
+ {
+ "name": "off"
+ },
+ {
+ "name": "on"
+ },
+ {
+ "name": "auto"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "off",
+ "on",
+ "auto"
+ ]
+ },
+ {
+ "name": "611",
+ "members": [
+ {
+ "name": "file"
+ },
+ {
+ "name": "serial"
+ },
+ {
+ "name": "parallel"
+ },
+ {
+ "name": "pipe"
+ },
+ {
+ "name": "socket"
+ },
+ {
+ "name": "udp"
+ },
+ {
+ "name": "pty"
+ },
+ {
+ "name": "null"
+ },
+ {
+ "name": "mux"
+ },
+ {
+ "name": "msmouse"
+ },
+ {
+ "name": "wctablet"
+ },
+ {
+ "name": "braille"
+ },
+ {
+ "name": "testdev"
+ },
+ {
+ "name": "stdio"
+ },
+ {
+ "name": "spicevmc"
+ },
+ {
+ "name": "spiceport"
+ },
+ {
+ "name": "qemu-vdagent"
+ },
+ {
+ "name": "dbus"
+ },
+ {
+ "name": "vc"
+ },
+ {
+ "name": "ringbuf"
+ },
+ {
+ "name": "memory",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "file",
+ "serial",
+ "parallel",
+ "pipe",
+ "socket",
+ "udp",
+ "pty",
+ "null",
+ "mux",
+ "msmouse",
+ "wctablet",
+ "braille",
+ "testdev",
+ "stdio",
+ "spicevmc",
+ "spiceport",
+ "qemu-vdagent",
+ "dbus",
+ "vc",
+ "ringbuf",
+ "memory"
+ ]
+ },
+ {
+ "name": "612",
+ "members": [
+ {
+ "name": "data",
+ "type": "734"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "613",
+ "members": [
+ {
+ "name": "data",
+ "type": "735"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "614",
+ "members": [
+ {
+ "name": "data",
+ "type": "736"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "615",
+ "members": [
+ {
+ "name": "data",
+ "type": "737"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "616",
+ "members": [
+ {
+ "name": "data",
+ "type": "738"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "617",
+ "members": [
+ {
+ "name": "data",
+ "type": "739"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "618",
+ "members": [
+ {
+ "name": "data",
+ "type": "740"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "619",
+ "members": [
+ {
+ "name": "data",
+ "type": "741"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "620",
+ "members": [
+ {
+ "name": "data",
+ "type": "742"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "621",
+ "members": [
+ {
+ "name": "data",
+ "type": "743"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "622",
+ "members": [
+ {
+ "name": "data",
+ "type": "744"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "623",
+ "members": [
+ {
+ "name": "data",
+ "type": "745"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "624",
+ "members": [
+ {
+ "name": "data",
+ "type": "746"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[625]",
+ "element-type": "625",
+ "meta-type": "array"
+ },
+ {
+ "name": "625",
+ "members": [
+ {
+ "name": "str",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "626",
+ "members": [
+ {
+ "name": "native"
+ },
+ {
+ "name": "skb"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "native",
+ "skb"
+ ]
+ },
+ {
+ "name": "627",
+ "members": [
+ {
+ "name": "path",
+ "type": "str"
+ },
+ {
+ "name": "abstract",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "tight",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "628",
+ "members": [
+ {
+ "name": "cid",
+ "type": "str"
+ },
+ {
+ "name": "port",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "629",
+ "members": [
+ {
+ "name": "str",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "630",
+ "members": [
+ {
+ "name": "data",
+ "type": "747"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "631",
+ "members": [
+ {
+ "name": "data",
+ "type": "748"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "632",
+ "members": [
+ {
+ "name": "number"
+ },
+ {
+ "name": "qcode"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "number",
+ "qcode"
+ ]
+ },
+ {
+ "name": "633",
+ "members": [
+ {
+ "name": "data",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "634",
+ "members": [
+ {
+ "name": "data",
+ "type": "749"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "635",
+ "members": [
+ {
+ "name": "key"
+ },
+ {
+ "name": "btn"
+ },
+ {
+ "name": "rel"
+ },
+ {
+ "name": "abs"
+ },
+ {
+ "name": "mtt"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "key",
+ "btn",
+ "rel",
+ "abs",
+ "mtt"
+ ]
+ },
+ {
+ "name": "636",
+ "members": [
+ {
+ "name": "data",
+ "type": "750"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "637",
+ "members": [
+ {
+ "name": "data",
+ "type": "751"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "638",
+ "members": [
+ {
+ "name": "data",
+ "type": "752"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "639",
+ "members": [
+ {
+ "name": "data",
+ "type": "753"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "640",
+ "members": [
+ {
+ "name": "lctrl-lalt"
+ },
+ {
+ "name": "lshift-lctrl-lalt"
+ },
+ {
+ "name": "rctrl"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "lctrl-lalt",
+ "lshift-lctrl-lalt",
+ "rctrl"
+ ]
+ },
+ {
+ "name": "number",
+ "json-type": "number",
+ "meta-type": "builtin"
+ },
+ {
+ "name": "[641]",
+ "element-type": "641",
+ "meta-type": "array"
+ },
+ {
+ "name": "641",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "alias",
+ "type": "str"
+ },
+ {
+ "name": "transform",
+ "default": null,
+ "type": "754"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "642",
+ "members": [
+ {
+ "name": "main"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "main"
+ ]
+ },
+ {
+ "name": "643",
+ "tag": "transport",
+ "variants": [
+ {
+ "case": "socket",
+ "type": "388"
+ },
+ {
+ "case": "exec",
+ "type": "756"
+ },
+ {
+ "case": "rdma",
+ "type": "587"
+ },
+ {
+ "case": "file",
+ "type": "757"
+ }
+ ],
+ "members": [
+ {
+ "name": "transport",
+ "type": "755"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "644",
+ "members": [
+ {
+ "name": "abort"
+ },
+ {
+ "name": "block-dirty-bitmap-add"
+ },
+ {
+ "name": "block-dirty-bitmap-remove"
+ },
+ {
+ "name": "block-dirty-bitmap-clear"
+ },
+ {
+ "name": "block-dirty-bitmap-enable"
+ },
+ {
+ "name": "block-dirty-bitmap-disable"
+ },
+ {
+ "name": "block-dirty-bitmap-merge"
+ },
+ {
+ "name": "blockdev-backup"
+ },
+ {
+ "name": "blockdev-snapshot"
+ },
+ {
+ "name": "blockdev-snapshot-internal-sync"
+ },
+ {
+ "name": "blockdev-snapshot-sync"
+ },
+ {
+ "name": "drive-backup",
+ "features": [
+ "deprecated"
+ ]
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "abort",
+ "block-dirty-bitmap-add",
+ "block-dirty-bitmap-remove",
+ "block-dirty-bitmap-clear",
+ "block-dirty-bitmap-enable",
+ "block-dirty-bitmap-disable",
+ "block-dirty-bitmap-merge",
+ "blockdev-backup",
+ "blockdev-snapshot",
+ "blockdev-snapshot-internal-sync",
+ "blockdev-snapshot-sync",
+ "drive-backup"
+ ]
+ },
+ {
+ "name": "645",
+ "members": [
+ {
+ "name": "data",
+ "type": "758"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "646",
+ "members": [
+ {
+ "name": "data",
+ "type": "44"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "647",
+ "members": [
+ {
+ "name": "data",
+ "type": "45"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "648",
+ "members": [
+ {
+ "name": "data",
+ "type": "46"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "649",
+ "members": [
+ {
+ "name": "data",
+ "type": "39"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "650",
+ "members": [
+ {
+ "name": "data",
+ "type": "35"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "651",
+ "members": [
+ {
+ "name": "data",
+ "type": "76"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "652",
+ "members": [
+ {
+ "name": "data",
+ "type": "34"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "653",
+ "members": [
+ {
+ "name": "data",
+ "type": "38"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "654",
+ "members": [
+ {
+ "name": "individual"
+ },
+ {
+ "name": "grouped"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "individual",
+ "grouped"
+ ]
+ },
+ {
+ "name": "655",
+ "members": [
+ {
+ "name": "string"
+ },
+ {
+ "name": "number"
+ },
+ {
+ "name": "int"
+ },
+ {
+ "name": "boolean"
+ },
+ {
+ "name": "null"
+ },
+ {
+ "name": "object"
+ },
+ {
+ "name": "array"
+ },
+ {
+ "name": "value"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "string",
+ "number",
+ "int",
+ "boolean",
+ "null",
+ "object",
+ "array",
+ "value"
+ ]
+ },
+ {
+ "name": "[656]",
+ "element-type": "656",
+ "meta-type": "array"
+ },
+ {
+ "name": "656",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "features",
+ "default": null,
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[657]",
+ "element-type": "657",
+ "meta-type": "array"
+ },
+ {
+ "name": "657",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ },
+ {
+ "name": "default",
+ "default": null,
+ "type": "any"
+ },
+ {
+ "name": "features",
+ "default": null,
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[658]",
+ "element-type": "658",
+ "meta-type": "array"
+ },
+ {
+ "name": "658",
+ "members": [
+ {
+ "name": "case",
+ "type": "str"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[659]",
+ "element-type": "659",
+ "meta-type": "array"
+ },
+ {
+ "name": "659",
+ "members": [
+ {
+ "name": "type",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "660",
+ "members": [
+ {
+ "name": "deny"
+ },
+ {
+ "name": "allow"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "deny",
+ "allow"
+ ]
+ },
+ {
+ "name": "[661]",
+ "element-type": "661",
+ "meta-type": "array"
+ },
+ {
+ "name": "661",
+ "members": [
+ {
+ "name": "match",
+ "type": "str"
+ },
+ {
+ "name": "policy",
+ "type": "660"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "759"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "662",
+ "members": [
+ {
+ "name": "all"
+ },
+ {
+ "name": "rx"
+ },
+ {
+ "name": "tx"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "all",
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "name": "663",
+ "members": [
+ {
+ "name": "before"
+ },
+ {
+ "name": "behind"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "before",
+ "behind"
+ ]
+ },
+ {
+ "name": "664",
+ "members": [
+ {
+ "name": "ctrl-ctrl"
+ },
+ {
+ "name": "alt-alt"
+ },
+ {
+ "name": "shift-shift"
+ },
+ {
+ "name": "meta-meta"
+ },
+ {
+ "name": "scrolllock"
+ },
+ {
+ "name": "ctrl-scrolllock"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ctrl-ctrl",
+ "alt-alt",
+ "shift-shift",
+ "meta-meta",
+ "scrolllock",
+ "ctrl-scrolllock"
+ ]
+ },
+ {
+ "name": "665",
+ "members": [
+ {
+ "name": "raw"
+ },
+ {
+ "name": "base64"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "raw",
+ "base64"
+ ]
+ },
+ {
+ "name": "666",
+ "members": [
+ {
+ "name": "iops-total",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-total-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-total-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-read",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-read-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-read-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-write",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-write-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-write-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-total",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-total-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-total-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-read",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-read-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-read-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-write",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-write-max",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "bps-write-max-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iops-size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "667",
+ "members": [
+ {
+ "name": "client"
+ },
+ {
+ "name": "server"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "client",
+ "server"
+ ]
+ },
+ {
+ "name": "668",
+ "members": [
+ {
+ "name": "uninitialized"
+ },
+ {
+ "name": "stopped"
+ },
+ {
+ "name": "check-stop"
+ },
+ {
+ "name": "operating"
+ },
+ {
+ "name": "load"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "uninitialized",
+ "stopped",
+ "check-stop",
+ "operating",
+ "load"
+ ]
+ },
+ {
+ "name": "669",
+ "members": [
+ {
+ "name": "memory"
+ },
+ {
+ "name": "first-level"
+ },
+ {
+ "name": "second-level"
+ },
+ {
+ "name": "third-level"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "memory",
+ "first-level",
+ "second-level",
+ "third-level"
+ ]
+ },
+ {
+ "name": "670",
+ "members": [
+ {
+ "name": "access-latency"
+ },
+ {
+ "name": "read-latency"
+ },
+ {
+ "name": "write-latency"
+ },
+ {
+ "name": "access-bandwidth"
+ },
+ {
+ "name": "read-bandwidth"
+ },
+ {
+ "name": "write-bandwidth"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "access-latency",
+ "read-latency",
+ "write-latency",
+ "access-bandwidth",
+ "read-bandwidth",
+ "write-bandwidth"
+ ]
+ },
+ {
+ "name": "671",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "direct"
+ },
+ {
+ "name": "complex"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "direct",
+ "complex"
+ ]
+ },
+ {
+ "name": "672",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "write-back"
+ },
+ {
+ "name": "write-through"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "write-back",
+ "write-through"
+ ]
+ },
+ {
+ "name": "673",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "addr",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "slot",
+ "type": "int"
+ },
+ {
+ "name": "node",
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "type": "str"
+ },
+ {
+ "name": "hotplugged",
+ "type": "bool"
+ },
+ {
+ "name": "hotpluggable",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "674",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "memaddr",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "675",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "memaddr",
+ "type": "int"
+ },
+ {
+ "name": "requested-size",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "max-size",
+ "type": "int"
+ },
+ {
+ "name": "block-size",
+ "type": "int"
+ },
+ {
+ "name": "node",
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "676",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "memaddr",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "node",
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "677",
+ "members": [
+ {
+ "name": "id",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "memaddr",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "max-size",
+ "type": "int"
+ },
+ {
+ "name": "memdev",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "678",
+ "members": [
+ {
+ "name": "string"
+ },
+ {
+ "name": "boolean"
+ },
+ {
+ "name": "number"
+ },
+ {
+ "name": "size"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "string",
+ "boolean",
+ "number",
+ "size"
+ ]
+ },
+ {
+ "name": "679",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "680",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "dev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "period-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "try-poll",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "681",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "buffer-count",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "682",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "server-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "client-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "connect-ports",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "start-server",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "exact-name",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "683",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "dev",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "buffer-count",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "try-poll",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "684",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "stream-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "latency",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "685",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "stream-name",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "latency",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "686",
+ "members": [
+ {
+ "name": "mixing-engine",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fixed-settings",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "frequency",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "channels",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "voices",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "format",
+ "default": null,
+ "type": "760"
+ },
+ {
+ "name": "buffer-length",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "buffer-count",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "687",
+ "members": [
+ {
+ "name": "desc",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "class",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "688",
+ "members": [
+ {
+ "name": "device",
+ "type": "int"
+ },
+ {
+ "name": "vendor",
+ "type": "int"
+ },
+ {
+ "name": "subsystem",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "subsystem-vendor",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "689",
+ "members": [
+ {
+ "name": "bus",
+ "type": "761"
+ },
+ {
+ "name": "devices",
+ "default": null,
+ "type": "[541]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[690]",
+ "element-type": "690",
+ "meta-type": "array"
+ },
+ {
+ "name": "690",
+ "members": [
+ {
+ "name": "bar",
+ "type": "int"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ },
+ {
+ "name": "address",
+ "type": "int"
+ },
+ {
+ "name": "size",
+ "type": "int"
+ },
+ {
+ "name": "prefetch",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "mem_type_64",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "691",
+ "members": [
+ {
+ "type": "int"
+ },
+ {
+ "type": "bool"
+ },
+ {
+ "type": "[int]"
+ }
+ ],
+ "meta-type": "alternate"
+ },
+ {
+ "name": "692",
+ "members": [
+ {
+ "name": "cumulative"
+ },
+ {
+ "name": "instant"
+ },
+ {
+ "name": "peak"
+ },
+ {
+ "name": "linear-histogram"
+ },
+ {
+ "name": "log2-histogram"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "cumulative",
+ "instant",
+ "peak",
+ "linear-histogram",
+ "log2-histogram"
+ ]
+ },
+ {
+ "name": "693",
+ "members": [
+ {
+ "name": "bytes"
+ },
+ {
+ "name": "seconds"
+ },
+ {
+ "name": "cycles"
+ },
+ {
+ "name": "boolean"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "bytes",
+ "seconds",
+ "cycles",
+ "boolean"
+ ]
+ },
+ {
+ "name": "694",
+ "members": [
+ {
+ "name": "protocols",
+ "type": "[str]"
+ },
+ {
+ "name": "unknown-protocols",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "695",
+ "members": [
+ {
+ "name": "builtin"
+ },
+ {
+ "name": "vhost-user"
+ },
+ {
+ "name": "lkcf"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "builtin",
+ "vhost-user",
+ "lkcf"
+ ]
+ },
+ {
+ "name": "696",
+ "members": [
+ {
+ "name": "cache-data-parity"
+ },
+ {
+ "name": "cache-address-parity"
+ },
+ {
+ "name": "cache-be-parity"
+ },
+ {
+ "name": "cache-data-ecc"
+ },
+ {
+ "name": "mem-data-parity"
+ },
+ {
+ "name": "mem-address-parity"
+ },
+ {
+ "name": "mem-be-parity"
+ },
+ {
+ "name": "mem-data-ecc"
+ },
+ {
+ "name": "reinit-threshold"
+ },
+ {
+ "name": "rsvd-encoding"
+ },
+ {
+ "name": "poison-received"
+ },
+ {
+ "name": "receiver-overflow"
+ },
+ {
+ "name": "internal"
+ },
+ {
+ "name": "cxl-ide-tx"
+ },
+ {
+ "name": "cxl-ide-rx"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "cache-data-parity",
+ "cache-address-parity",
+ "cache-be-parity",
+ "cache-data-ecc",
+ "mem-data-parity",
+ "mem-address-parity",
+ "mem-be-parity",
+ "mem-data-ecc",
+ "reinit-threshold",
+ "rsvd-encoding",
+ "poison-received",
+ "receiver-overflow",
+ "internal",
+ "cxl-ide-tx",
+ "cxl-ide-rx"
+ ]
+ },
+ {
+ "name": "697",
+ "members": [
+ {
+ "name": "unknown"
+ },
+ {
+ "name": "disabled-wait"
+ },
+ {
+ "name": "extint-loop"
+ },
+ {
+ "name": "pgmint-loop"
+ },
+ {
+ "name": "opint-loop"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "unknown",
+ "disabled-wait",
+ "extint-loop",
+ "pgmint-loop",
+ "opint-loop"
+ ]
+ },
+ {
+ "name": "698",
+ "members": [
+ {
+ "name": "qcow2"
+ },
+ {
+ "name": "vmdk"
+ },
+ {
+ "name": "luks"
+ },
+ {
+ "name": "rbd"
+ },
+ {
+ "name": "file"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "qcow2",
+ "vmdk",
+ "luks",
+ "rbd",
+ "file"
+ ]
+ },
+ {
+ "name": "699",
+ "members": [
+ {
+ "name": "data",
+ "type": "762"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "700",
+ "members": [
+ {
+ "name": "data",
+ "type": "763"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "701",
+ "members": [
+ {
+ "name": "data",
+ "type": "764"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "702",
+ "members": [
+ {
+ "name": "data",
+ "type": "765"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "703",
+ "members": [
+ {
+ "name": "data",
+ "type": "766"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "704",
+ "members": [
+ {
+ "name": "l1_update"
+ },
+ {
+ "name": "l1_grow_alloc_table"
+ },
+ {
+ "name": "l1_grow_write_table"
+ },
+ {
+ "name": "l1_grow_activate_table"
+ },
+ {
+ "name": "l2_load"
+ },
+ {
+ "name": "l2_update"
+ },
+ {
+ "name": "l2_update_compressed"
+ },
+ {
+ "name": "l2_alloc_cow_read"
+ },
+ {
+ "name": "l2_alloc_write"
+ },
+ {
+ "name": "read_aio"
+ },
+ {
+ "name": "read_backing_aio"
+ },
+ {
+ "name": "read_compressed"
+ },
+ {
+ "name": "write_aio"
+ },
+ {
+ "name": "write_compressed"
+ },
+ {
+ "name": "vmstate_load"
+ },
+ {
+ "name": "vmstate_save"
+ },
+ {
+ "name": "cow_read"
+ },
+ {
+ "name": "cow_write"
+ },
+ {
+ "name": "reftable_load"
+ },
+ {
+ "name": "reftable_grow"
+ },
+ {
+ "name": "reftable_update"
+ },
+ {
+ "name": "refblock_load"
+ },
+ {
+ "name": "refblock_update"
+ },
+ {
+ "name": "refblock_update_part"
+ },
+ {
+ "name": "refblock_alloc"
+ },
+ {
+ "name": "refblock_alloc_hookup"
+ },
+ {
+ "name": "refblock_alloc_write"
+ },
+ {
+ "name": "refblock_alloc_write_blocks"
+ },
+ {
+ "name": "refblock_alloc_write_table"
+ },
+ {
+ "name": "refblock_alloc_switch_table"
+ },
+ {
+ "name": "cluster_alloc"
+ },
+ {
+ "name": "cluster_alloc_bytes"
+ },
+ {
+ "name": "cluster_free"
+ },
+ {
+ "name": "flush_to_os"
+ },
+ {
+ "name": "flush_to_disk"
+ },
+ {
+ "name": "pwritev_rmw_head"
+ },
+ {
+ "name": "pwritev_rmw_after_head"
+ },
+ {
+ "name": "pwritev_rmw_tail"
+ },
+ {
+ "name": "pwritev_rmw_after_tail"
+ },
+ {
+ "name": "pwritev"
+ },
+ {
+ "name": "pwritev_zero"
+ },
+ {
+ "name": "pwritev_done"
+ },
+ {
+ "name": "empty_image_prepare"
+ },
+ {
+ "name": "l1_shrink_write_table"
+ },
+ {
+ "name": "l1_shrink_free_l2_clusters"
+ },
+ {
+ "name": "cor_write"
+ },
+ {
+ "name": "cluster_alloc_space"
+ },
+ {
+ "name": "none"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "l1_update",
+ "l1_grow_alloc_table",
+ "l1_grow_write_table",
+ "l1_grow_activate_table",
+ "l2_load",
+ "l2_update",
+ "l2_update_compressed",
+ "l2_alloc_cow_read",
+ "l2_alloc_write",
+ "read_aio",
+ "read_backing_aio",
+ "read_compressed",
+ "write_aio",
+ "write_compressed",
+ "vmstate_load",
+ "vmstate_save",
+ "cow_read",
+ "cow_write",
+ "reftable_load",
+ "reftable_grow",
+ "reftable_update",
+ "refblock_load",
+ "refblock_update",
+ "refblock_update_part",
+ "refblock_alloc",
+ "refblock_alloc_hookup",
+ "refblock_alloc_write",
+ "refblock_alloc_write_blocks",
+ "refblock_alloc_write_table",
+ "refblock_alloc_switch_table",
+ "cluster_alloc",
+ "cluster_alloc_bytes",
+ "cluster_free",
+ "flush_to_os",
+ "flush_to_disk",
+ "pwritev_rmw_head",
+ "pwritev_rmw_after_head",
+ "pwritev_rmw_tail",
+ "pwritev_rmw_after_tail",
+ "pwritev",
+ "pwritev_zero",
+ "pwritev_done",
+ "empty_image_prepare",
+ "l1_shrink_write_table",
+ "l1_shrink_free_l2_clusters",
+ "cor_write",
+ "cluster_alloc_space",
+ "none"
+ ]
+ },
+ {
+ "name": "705",
+ "members": [
+ {
+ "name": "read"
+ },
+ {
+ "name": "write"
+ },
+ {
+ "name": "write-zeroes"
+ },
+ {
+ "name": "discard"
+ },
+ {
+ "name": "flush"
+ },
+ {
+ "name": "block-status"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "read",
+ "write",
+ "write-zeroes",
+ "discard",
+ "flush",
+ "block-status"
+ ]
+ },
+ {
+ "name": "706",
+ "members": [
+ {
+ "name": "inet"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "inet"
+ ]
+ },
+ {
+ "name": "707",
+ "members": [
+ {
+ "name": "template",
+ "default": null,
+ "type": "708"
+ },
+ {
+ "name": "main-header",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "active-l1",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "active-l2",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "refcount-table",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "refcount-block",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "snapshot-table",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "inactive-l1",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "inactive-l2",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "bitmap-directory",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "708",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "constant"
+ },
+ {
+ "name": "cached"
+ },
+ {
+ "name": "all"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "constant",
+ "cached",
+ "all"
+ ]
+ },
+ {
+ "name": "709",
+ "members": [
+ {
+ "name": "aes"
+ },
+ {
+ "name": "luks"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "aes",
+ "luks"
+ ]
+ },
+ {
+ "name": "710",
+ "members": [
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "711",
+ "members": [
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "712",
+ "members": [
+ {
+ "name": "aes"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "aes"
+ ]
+ },
+ {
+ "name": "713",
+ "members": [
+ {
+ "name": "luks"
+ },
+ {
+ "name": "luks2"
+ },
+ {
+ "name": "luks-any"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "luks",
+ "luks2",
+ "luks-any"
+ ]
+ },
+ {
+ "name": "714",
+ "members": [
+ {
+ "name": "key-secret",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "715",
+ "members": [
+ {
+ "name": "key-secret",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "716",
+ "members": [
+ {
+ "name": "key-secret",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "717",
+ "members": [
+ {
+ "name": "none"
+ },
+ {
+ "name": "hash"
+ },
+ {
+ "name": "known_hosts"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "none",
+ "hash",
+ "known_hosts"
+ ]
+ },
+ {
+ "name": "718",
+ "members": [
+ {
+ "name": "type",
+ "type": "767"
+ },
+ {
+ "name": "hash",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "719",
+ "members": [
+ {
+ "name": "off"
+ },
+ {
+ "name": "metadata"
+ },
+ {
+ "name": "falloc"
+ },
+ {
+ "name": "full"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "off",
+ "metadata",
+ "falloc",
+ "full"
+ ]
+ },
+ {
+ "name": "720",
+ "members": [
+ {
+ "name": "aes-128"
+ },
+ {
+ "name": "aes-192"
+ },
+ {
+ "name": "aes-256"
+ },
+ {
+ "name": "des"
+ },
+ {
+ "name": "3des"
+ },
+ {
+ "name": "cast5-128"
+ },
+ {
+ "name": "serpent-128"
+ },
+ {
+ "name": "serpent-192"
+ },
+ {
+ "name": "serpent-256"
+ },
+ {
+ "name": "twofish-128"
+ },
+ {
+ "name": "twofish-192"
+ },
+ {
+ "name": "twofish-256"
+ },
+ {
+ "name": "sm4"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "aes-128",
+ "aes-192",
+ "aes-256",
+ "des",
+ "3des",
+ "cast5-128",
+ "serpent-128",
+ "serpent-192",
+ "serpent-256",
+ "twofish-128",
+ "twofish-192",
+ "twofish-256",
+ "sm4"
+ ]
+ },
+ {
+ "name": "721",
+ "members": [
+ {
+ "name": "ecb"
+ },
+ {
+ "name": "cbc"
+ },
+ {
+ "name": "xts"
+ },
+ {
+ "name": "ctr"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ecb",
+ "cbc",
+ "xts",
+ "ctr"
+ ]
+ },
+ {
+ "name": "722",
+ "members": [
+ {
+ "name": "plain"
+ },
+ {
+ "name": "plain64"
+ },
+ {
+ "name": "essiv"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "plain",
+ "plain64",
+ "essiv"
+ ]
+ },
+ {
+ "name": "723",
+ "members": [
+ {
+ "name": "md5"
+ },
+ {
+ "name": "sha1"
+ },
+ {
+ "name": "sha224"
+ },
+ {
+ "name": "sha256"
+ },
+ {
+ "name": "sha384"
+ },
+ {
+ "name": "sha512"
+ },
+ {
+ "name": "ripemd160"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "md5",
+ "sha1",
+ "sha224",
+ "sha256",
+ "sha384",
+ "sha512",
+ "ripemd160"
+ ]
+ },
+ {
+ "name": "724",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "qcow",
+ "type": "710"
+ },
+ {
+ "case": "luks",
+ "type": "769"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "768"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "725",
+ "members": [
+ {
+ "name": "v2"
+ },
+ {
+ "name": "v3"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "v2",
+ "v3"
+ ]
+ },
+ {
+ "name": "726",
+ "members": [
+ {
+ "name": "zlib"
+ },
+ {
+ "name": "zstd"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "zlib",
+ "zstd"
+ ]
+ },
+ {
+ "name": "727",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "luks",
+ "type": "770"
+ },
+ {
+ "case": "luks2",
+ "type": "771"
+ },
+ {
+ "case": "luks-any",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "713"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "728",
+ "members": [
+ {
+ "name": "dynamic"
+ },
+ {
+ "name": "fixed"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "dynamic",
+ "fixed"
+ ]
+ },
+ {
+ "name": "729",
+ "members": [
+ {
+ "name": "monolithicSparse"
+ },
+ {
+ "name": "monolithicFlat"
+ },
+ {
+ "name": "twoGbMaxExtentSparse"
+ },
+ {
+ "name": "twoGbMaxExtentFlat"
+ },
+ {
+ "name": "streamOptimized"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "monolithicSparse",
+ "monolithicFlat",
+ "twoGbMaxExtentSparse",
+ "twoGbMaxExtentFlat",
+ "streamOptimized"
+ ]
+ },
+ {
+ "name": "730",
+ "members": [
+ {
+ "name": "ide"
+ },
+ {
+ "name": "buslogic"
+ },
+ {
+ "name": "lsilogic"
+ },
+ {
+ "name": "legacyESX"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "ide",
+ "buslogic",
+ "lsilogic",
+ "legacyESX"
+ ]
+ },
+ {
+ "name": "731",
+ "members": [
+ {
+ "name": "dynamic"
+ },
+ {
+ "name": "fixed"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "dynamic",
+ "fixed"
+ ]
+ },
+ {
+ "name": "732",
+ "members": [
+ {
+ "name": "active"
+ },
+ {
+ "name": "inactive"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "active",
+ "inactive"
+ ]
+ },
+ {
+ "name": "733",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "luks",
+ "type": "772"
+ },
+ {
+ "case": "qcow",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "768"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "734",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "in",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "out",
+ "type": "str"
+ },
+ {
+ "name": "append",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "735",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "device",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "736",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "addr",
+ "type": "358"
+ },
+ {
+ "name": "tls-creds",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "tls-authz",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "server",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "wait",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "nodelay",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "telnet",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "tn3270",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "websocket",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "reconnect",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "737",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "remote",
+ "type": "358"
+ },
+ {
+ "name": "local",
+ "default": null,
+ "type": "358"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "738",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "739",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "chardev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "740",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "signal",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "741",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "type",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "742",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "fqdn",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "743",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "mouse",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "clipboard",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "744",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "name",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "745",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "width",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "height",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "cols",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "rows",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "746",
+ "members": [
+ {
+ "name": "logfile",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "logappend",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "747",
+ "members": [
+ {
+ "name": "path",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cancel-path",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "748",
+ "members": [
+ {
+ "name": "chardev",
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "749",
+ "members": [
+ {
+ "name": "unmapped"
+ },
+ {
+ "name": "shift"
+ },
+ {
+ "name": "shift_r"
+ },
+ {
+ "name": "alt"
+ },
+ {
+ "name": "alt_r"
+ },
+ {
+ "name": "ctrl"
+ },
+ {
+ "name": "ctrl_r"
+ },
+ {
+ "name": "menu"
+ },
+ {
+ "name": "esc"
+ },
+ {
+ "name": "1"
+ },
+ {
+ "name": "2"
+ },
+ {
+ "name": "3"
+ },
+ {
+ "name": "4"
+ },
+ {
+ "name": "5"
+ },
+ {
+ "name": "6"
+ },
+ {
+ "name": "7"
+ },
+ {
+ "name": "8"
+ },
+ {
+ "name": "9"
+ },
+ {
+ "name": "0"
+ },
+ {
+ "name": "minus"
+ },
+ {
+ "name": "equal"
+ },
+ {
+ "name": "backspace"
+ },
+ {
+ "name": "tab"
+ },
+ {
+ "name": "q"
+ },
+ {
+ "name": "w"
+ },
+ {
+ "name": "e"
+ },
+ {
+ "name": "r"
+ },
+ {
+ "name": "t"
+ },
+ {
+ "name": "y"
+ },
+ {
+ "name": "u"
+ },
+ {
+ "name": "i"
+ },
+ {
+ "name": "o"
+ },
+ {
+ "name": "p"
+ },
+ {
+ "name": "bracket_left"
+ },
+ {
+ "name": "bracket_right"
+ },
+ {
+ "name": "ret"
+ },
+ {
+ "name": "a"
+ },
+ {
+ "name": "s"
+ },
+ {
+ "name": "d"
+ },
+ {
+ "name": "f"
+ },
+ {
+ "name": "g"
+ },
+ {
+ "name": "h"
+ },
+ {
+ "name": "j"
+ },
+ {
+ "name": "k"
+ },
+ {
+ "name": "l"
+ },
+ {
+ "name": "semicolon"
+ },
+ {
+ "name": "apostrophe"
+ },
+ {
+ "name": "grave_accent"
+ },
+ {
+ "name": "backslash"
+ },
+ {
+ "name": "z"
+ },
+ {
+ "name": "x"
+ },
+ {
+ "name": "c"
+ },
+ {
+ "name": "v"
+ },
+ {
+ "name": "b"
+ },
+ {
+ "name": "n"
+ },
+ {
+ "name": "m"
+ },
+ {
+ "name": "comma"
+ },
+ {
+ "name": "dot"
+ },
+ {
+ "name": "slash"
+ },
+ {
+ "name": "asterisk"
+ },
+ {
+ "name": "spc"
+ },
+ {
+ "name": "caps_lock"
+ },
+ {
+ "name": "f1"
+ },
+ {
+ "name": "f2"
+ },
+ {
+ "name": "f3"
+ },
+ {
+ "name": "f4"
+ },
+ {
+ "name": "f5"
+ },
+ {
+ "name": "f6"
+ },
+ {
+ "name": "f7"
+ },
+ {
+ "name": "f8"
+ },
+ {
+ "name": "f9"
+ },
+ {
+ "name": "f10"
+ },
+ {
+ "name": "num_lock"
+ },
+ {
+ "name": "scroll_lock"
+ },
+ {
+ "name": "kp_divide"
+ },
+ {
+ "name": "kp_multiply"
+ },
+ {
+ "name": "kp_subtract"
+ },
+ {
+ "name": "kp_add"
+ },
+ {
+ "name": "kp_enter"
+ },
+ {
+ "name": "kp_decimal"
+ },
+ {
+ "name": "sysrq"
+ },
+ {
+ "name": "kp_0"
+ },
+ {
+ "name": "kp_1"
+ },
+ {
+ "name": "kp_2"
+ },
+ {
+ "name": "kp_3"
+ },
+ {
+ "name": "kp_4"
+ },
+ {
+ "name": "kp_5"
+ },
+ {
+ "name": "kp_6"
+ },
+ {
+ "name": "kp_7"
+ },
+ {
+ "name": "kp_8"
+ },
+ {
+ "name": "kp_9"
+ },
+ {
+ "name": "less"
+ },
+ {
+ "name": "f11"
+ },
+ {
+ "name": "f12"
+ },
+ {
+ "name": "print"
+ },
+ {
+ "name": "home"
+ },
+ {
+ "name": "pgup"
+ },
+ {
+ "name": "pgdn"
+ },
+ {
+ "name": "end"
+ },
+ {
+ "name": "left"
+ },
+ {
+ "name": "up"
+ },
+ {
+ "name": "down"
+ },
+ {
+ "name": "right"
+ },
+ {
+ "name": "insert"
+ },
+ {
+ "name": "delete"
+ },
+ {
+ "name": "stop"
+ },
+ {
+ "name": "again"
+ },
+ {
+ "name": "props"
+ },
+ {
+ "name": "undo"
+ },
+ {
+ "name": "front"
+ },
+ {
+ "name": "copy"
+ },
+ {
+ "name": "open"
+ },
+ {
+ "name": "paste"
+ },
+ {
+ "name": "find"
+ },
+ {
+ "name": "cut"
+ },
+ {
+ "name": "lf"
+ },
+ {
+ "name": "help"
+ },
+ {
+ "name": "meta_l"
+ },
+ {
+ "name": "meta_r"
+ },
+ {
+ "name": "compose"
+ },
+ {
+ "name": "pause"
+ },
+ {
+ "name": "ro"
+ },
+ {
+ "name": "hiragana"
+ },
+ {
+ "name": "henkan"
+ },
+ {
+ "name": "yen"
+ },
+ {
+ "name": "muhenkan"
+ },
+ {
+ "name": "katakanahiragana"
+ },
+ {
+ "name": "kp_comma"
+ },
+ {
+ "name": "kp_equals"
+ },
+ {
+ "name": "power"
+ },
+ {
+ "name": "sleep"
+ },
+ {
+ "name": "wake"
+ },
+ {
+ "name": "audionext"
+ },
+ {
+ "name": "audioprev"
+ },
+ {
+ "name": "audiostop"
+ },
+ {
+ "name": "audioplay"
+ },
+ {
+ "name": "audiomute"
+ },
+ {
+ "name": "volumeup"
+ },
+ {
+ "name": "volumedown"
+ },
+ {
+ "name": "mediaselect"
+ },
+ {
+ "name": "mail"
+ },
+ {
+ "name": "calculator"
+ },
+ {
+ "name": "computer"
+ },
+ {
+ "name": "ac_home"
+ },
+ {
+ "name": "ac_back"
+ },
+ {
+ "name": "ac_forward"
+ },
+ {
+ "name": "ac_refresh"
+ },
+ {
+ "name": "ac_bookmarks"
+ },
+ {
+ "name": "lang1"
+ },
+ {
+ "name": "lang2"
+ },
+ {
+ "name": "f13"
+ },
+ {
+ "name": "f14"
+ },
+ {
+ "name": "f15"
+ },
+ {
+ "name": "f16"
+ },
+ {
+ "name": "f17"
+ },
+ {
+ "name": "f18"
+ },
+ {
+ "name": "f19"
+ },
+ {
+ "name": "f20"
+ },
+ {
+ "name": "f21"
+ },
+ {
+ "name": "f22"
+ },
+ {
+ "name": "f23"
+ },
+ {
+ "name": "f24"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "unmapped",
+ "shift",
+ "shift_r",
+ "alt",
+ "alt_r",
+ "ctrl",
+ "ctrl_r",
+ "menu",
+ "esc",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "0",
+ "minus",
+ "equal",
+ "backspace",
+ "tab",
+ "q",
+ "w",
+ "e",
+ "r",
+ "t",
+ "y",
+ "u",
+ "i",
+ "o",
+ "p",
+ "bracket_left",
+ "bracket_right",
+ "ret",
+ "a",
+ "s",
+ "d",
+ "f",
+ "g",
+ "h",
+ "j",
+ "k",
+ "l",
+ "semicolon",
+ "apostrophe",
+ "grave_accent",
+ "backslash",
+ "z",
+ "x",
+ "c",
+ "v",
+ "b",
+ "n",
+ "m",
+ "comma",
+ "dot",
+ "slash",
+ "asterisk",
+ "spc",
+ "caps_lock",
+ "f1",
+ "f2",
+ "f3",
+ "f4",
+ "f5",
+ "f6",
+ "f7",
+ "f8",
+ "f9",
+ "f10",
+ "num_lock",
+ "scroll_lock",
+ "kp_divide",
+ "kp_multiply",
+ "kp_subtract",
+ "kp_add",
+ "kp_enter",
+ "kp_decimal",
+ "sysrq",
+ "kp_0",
+ "kp_1",
+ "kp_2",
+ "kp_3",
+ "kp_4",
+ "kp_5",
+ "kp_6",
+ "kp_7",
+ "kp_8",
+ "kp_9",
+ "less",
+ "f11",
+ "f12",
+ "print",
+ "home",
+ "pgup",
+ "pgdn",
+ "end",
+ "left",
+ "up",
+ "down",
+ "right",
+ "insert",
+ "delete",
+ "stop",
+ "again",
+ "props",
+ "undo",
+ "front",
+ "copy",
+ "open",
+ "paste",
+ "find",
+ "cut",
+ "lf",
+ "help",
+ "meta_l",
+ "meta_r",
+ "compose",
+ "pause",
+ "ro",
+ "hiragana",
+ "henkan",
+ "yen",
+ "muhenkan",
+ "katakanahiragana",
+ "kp_comma",
+ "kp_equals",
+ "power",
+ "sleep",
+ "wake",
+ "audionext",
+ "audioprev",
+ "audiostop",
+ "audioplay",
+ "audiomute",
+ "volumeup",
+ "volumedown",
+ "mediaselect",
+ "mail",
+ "calculator",
+ "computer",
+ "ac_home",
+ "ac_back",
+ "ac_forward",
+ "ac_refresh",
+ "ac_bookmarks",
+ "lang1",
+ "lang2",
+ "f13",
+ "f14",
+ "f15",
+ "f16",
+ "f17",
+ "f18",
+ "f19",
+ "f20",
+ "f21",
+ "f22",
+ "f23",
+ "f24"
+ ]
+ },
+ {
+ "name": "750",
+ "members": [
+ {
+ "name": "key",
+ "type": "412"
+ },
+ {
+ "name": "down",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "751",
+ "members": [
+ {
+ "name": "button",
+ "type": "773"
+ },
+ {
+ "name": "down",
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "752",
+ "members": [
+ {
+ "name": "axis",
+ "type": "774"
+ },
+ {
+ "name": "value",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "753",
+ "members": [
+ {
+ "name": "type",
+ "type": "775"
+ },
+ {
+ "name": "slot",
+ "type": "int"
+ },
+ {
+ "name": "tracking-id",
+ "type": "int"
+ },
+ {
+ "name": "axis",
+ "type": "774"
+ },
+ {
+ "name": "value",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "754",
+ "members": [
+ {
+ "name": "persistent",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "755",
+ "members": [
+ {
+ "name": "socket"
+ },
+ {
+ "name": "exec"
+ },
+ {
+ "name": "rdma"
+ },
+ {
+ "name": "file"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "socket",
+ "exec",
+ "rdma",
+ "file"
+ ]
+ },
+ {
+ "name": "756",
+ "members": [
+ {
+ "name": "args",
+ "type": "[str]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "757",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "offset",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "758",
+ "members": [],
+ "meta-type": "object"
+ },
+ {
+ "name": "759",
+ "members": [
+ {
+ "name": "exact"
+ },
+ {
+ "name": "glob"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "exact",
+ "glob"
+ ]
+ },
+ {
+ "name": "760",
+ "members": [
+ {
+ "name": "u8"
+ },
+ {
+ "name": "s8"
+ },
+ {
+ "name": "u16"
+ },
+ {
+ "name": "s16"
+ },
+ {
+ "name": "u32"
+ },
+ {
+ "name": "s32"
+ },
+ {
+ "name": "f32"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "u8",
+ "s8",
+ "u16",
+ "s16",
+ "u32",
+ "s32",
+ "f32"
+ ]
+ },
+ {
+ "name": "761",
+ "members": [
+ {
+ "name": "number",
+ "type": "int"
+ },
+ {
+ "name": "secondary",
+ "type": "int"
+ },
+ {
+ "name": "subordinate",
+ "type": "int"
+ },
+ {
+ "name": "io_range",
+ "type": "776"
+ },
+ {
+ "name": "memory_range",
+ "type": "776"
+ },
+ {
+ "name": "prefetchable_range",
+ "type": "776"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "762",
+ "members": [
+ {
+ "name": "compat",
+ "type": "str"
+ },
+ {
+ "name": "data-file",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "data-file-raw",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "extended-l2",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "lazy-refcounts",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "corrupt",
+ "default": null,
+ "type": "bool"
+ },
+ {
+ "name": "refcount-bits",
+ "type": "int"
+ },
+ {
+ "name": "encrypt",
+ "default": null,
+ "type": "777"
+ },
+ {
+ "name": "bitmaps",
+ "default": null,
+ "type": "[778]"
+ },
+ {
+ "name": "compression-type",
+ "type": "726"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "763",
+ "members": [
+ {
+ "name": "create-type",
+ "type": "str"
+ },
+ {
+ "name": "cid",
+ "type": "int"
+ },
+ {
+ "name": "parent-cid",
+ "type": "int"
+ },
+ {
+ "name": "extents",
+ "type": "[779]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "764",
+ "members": [
+ {
+ "name": "cipher-alg",
+ "type": "720"
+ },
+ {
+ "name": "cipher-mode",
+ "type": "721"
+ },
+ {
+ "name": "ivgen-alg",
+ "type": "722"
+ },
+ {
+ "name": "ivgen-hash-alg",
+ "default": null,
+ "type": "723"
+ },
+ {
+ "name": "hash-alg",
+ "type": "723"
+ },
+ {
+ "name": "detached-header",
+ "type": "bool"
+ },
+ {
+ "name": "payload-offset",
+ "type": "int"
+ },
+ {
+ "name": "master-key-iters",
+ "type": "int"
+ },
+ {
+ "name": "uuid",
+ "type": "str"
+ },
+ {
+ "name": "slots",
+ "type": "[780]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "765",
+ "members": [
+ {
+ "name": "encryption-format",
+ "default": null,
+ "type": "713"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "766",
+ "members": [
+ {
+ "name": "extent-size-hint",
+ "default": null,
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "767",
+ "members": [
+ {
+ "name": "md5"
+ },
+ {
+ "name": "sha1"
+ },
+ {
+ "name": "sha256"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "md5",
+ "sha1",
+ "sha256"
+ ]
+ },
+ {
+ "name": "768",
+ "members": [
+ {
+ "name": "qcow"
+ },
+ {
+ "name": "luks"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "qcow",
+ "luks"
+ ]
+ },
+ {
+ "name": "769",
+ "members": [
+ {
+ "name": "key-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "cipher-alg",
+ "default": null,
+ "type": "720"
+ },
+ {
+ "name": "cipher-mode",
+ "default": null,
+ "type": "721"
+ },
+ {
+ "name": "ivgen-alg",
+ "default": null,
+ "type": "722"
+ },
+ {
+ "name": "ivgen-hash-alg",
+ "default": null,
+ "type": "723"
+ },
+ {
+ "name": "hash-alg",
+ "default": null,
+ "type": "723"
+ },
+ {
+ "name": "iter-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "detached-header",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "770",
+ "members": [
+ {
+ "name": "key-secret",
+ "type": "str"
+ },
+ {
+ "name": "cipher-alg",
+ "default": null,
+ "type": "720"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "771",
+ "members": [
+ {
+ "name": "key-secret",
+ "type": "str"
+ },
+ {
+ "name": "cipher-alg",
+ "default": null,
+ "type": "720"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "772",
+ "members": [
+ {
+ "name": "state",
+ "type": "732"
+ },
+ {
+ "name": "new-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "old-secret",
+ "default": null,
+ "type": "str"
+ },
+ {
+ "name": "keyslot",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "iter-time",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "secret",
+ "default": null,
+ "type": "str"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "773",
+ "members": [
+ {
+ "name": "left"
+ },
+ {
+ "name": "middle"
+ },
+ {
+ "name": "right"
+ },
+ {
+ "name": "wheel-up"
+ },
+ {
+ "name": "wheel-down"
+ },
+ {
+ "name": "side"
+ },
+ {
+ "name": "extra"
+ },
+ {
+ "name": "wheel-left"
+ },
+ {
+ "name": "wheel-right"
+ },
+ {
+ "name": "touch"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "left",
+ "middle",
+ "right",
+ "wheel-up",
+ "wheel-down",
+ "side",
+ "extra",
+ "wheel-left",
+ "wheel-right",
+ "touch"
+ ]
+ },
+ {
+ "name": "774",
+ "members": [
+ {
+ "name": "x"
+ },
+ {
+ "name": "y"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "x",
+ "y"
+ ]
+ },
+ {
+ "name": "775",
+ "members": [
+ {
+ "name": "begin"
+ },
+ {
+ "name": "update"
+ },
+ {
+ "name": "end"
+ },
+ {
+ "name": "cancel"
+ },
+ {
+ "name": "data"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "begin",
+ "update",
+ "end",
+ "cancel",
+ "data"
+ ]
+ },
+ {
+ "name": "776",
+ "members": [
+ {
+ "name": "base",
+ "type": "int"
+ },
+ {
+ "name": "limit",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "777",
+ "tag": "format",
+ "variants": [
+ {
+ "case": "luks",
+ "type": "764"
+ },
+ {
+ "case": "aes",
+ "type": "0"
+ }
+ ],
+ "members": [
+ {
+ "name": "format",
+ "type": "709"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[778]",
+ "element-type": "778",
+ "meta-type": "array"
+ },
+ {
+ "name": "778",
+ "members": [
+ {
+ "name": "name",
+ "type": "str"
+ },
+ {
+ "name": "granularity",
+ "type": "int"
+ },
+ {
+ "name": "flags",
+ "type": "[781]"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[779]",
+ "element-type": "779",
+ "meta-type": "array"
+ },
+ {
+ "name": "779",
+ "members": [
+ {
+ "name": "filename",
+ "type": "str"
+ },
+ {
+ "name": "format",
+ "type": "str"
+ },
+ {
+ "name": "virtual-size",
+ "type": "int"
+ },
+ {
+ "name": "cluster-size",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "compressed",
+ "default": null,
+ "type": "bool"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[780]",
+ "element-type": "780",
+ "meta-type": "array"
+ },
+ {
+ "name": "780",
+ "members": [
+ {
+ "name": "active",
+ "type": "bool"
+ },
+ {
+ "name": "iters",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "stripes",
+ "default": null,
+ "type": "int"
+ },
+ {
+ "name": "key-offset",
+ "type": "int"
+ }
+ ],
+ "meta-type": "object"
+ },
+ {
+ "name": "[781]",
+ "element-type": "781",
+ "meta-type": "array"
+ },
+ {
+ "name": "781",
+ "members": [
+ {
+ "name": "in-use"
+ },
+ {
+ "name": "auto"
+ }
+ ],
+ "meta-type": "enum",
+ "values": [
+ "in-use",
+ "auto"
+ ]
+ }
+ ],
+ "id": "libvirt-4"
+}
+
+{
+ "execute": "query-kvm",
+ "id": "libvirt-5"
+}
+
+{
+ "return": {
+ "enabled": false,
+ "present": false
+ },
+ "id": "libvirt-5"
+}
+
+{
+ "execute": "qom-list-types",
+ "id": "libvirt-6"
+}
+
+{
+ "return": [
+ {
+ "name": "secret",
+ "parent": "secret_common"
+ },
+ {
+ "name": "chardev-mux",
+ "parent": "chardev"
+ },
+ {
+ "name": "none-machine",
+ "parent": "machine"
+ },
+ {
+ "name": "tls-cipher-suites",
+ "parent": "tls-creds"
+ },
+ {
+ "name": "Fujitsu-MB86904-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "empty_slot",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "Voyager-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "cryptodev-backend-builtin",
+ "parent": "cryptodev-backend"
+ },
+ {
+ "name": "slavio_misc",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "sysbus-esp",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "qio-channel-rdma",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "chardev-ringbuf",
+ "parent": "chardev"
+ },
+ {
+ "name": "SS-10-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "main-loop",
+ "parent": "event-loop-base"
+ },
+ {
+ "name": "grlib-apbpnp",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "SS-600MP-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "migration",
+ "parent": "device"
+ },
+ {
+ "name": "cryptodev-backend-lkcf",
+ "parent": "cryptodev-backend"
+ },
+ {
+ "name": "slavio_intctl",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "pr-manager-helper",
+ "parent": "pr-manager"
+ },
+ {
+ "name": "guest-loader",
+ "parent": "device"
+ },
+ {
+ "name": "thread-context",
+ "parent": "object"
+ },
+ {
+ "name": "chardev-udp",
+ "parent": "chardev"
+ },
+ {
+ "name": "tls-creds-x509",
+ "parent": "tls-creds"
+ },
+ {
+ "name": "cpu-cluster",
+ "parent": "device"
+ },
+ {
+ "name": "grlib-ahbpnp",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "cgthree",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "TI-SuperSparc-61-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "Fujitsu-MB86907-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "scsi-hd",
+ "parent": "scsi-disk-base"
+ },
+ {
+ "name": "chardev-braille",
+ "parent": "chardev"
+ },
+ {
+ "name": "scsi-block",
+ "parent": "scsi-disk-base"
+ },
+ {
+ "name": "chardev-pty",
+ "parent": "chardev"
+ },
+ {
+ "name": "SS-4-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "grlib-gptimer",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "apc",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "TI-MicroSparc-IIep-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "rng-egd",
+ "parent": "rng-backend"
+ },
+ {
+ "name": "qio-channel-websock",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "chardev-spiceport",
+ "parent": "chardev-spice"
+ },
+ {
+ "name": "grlib-irqmp",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "TI-MicroSparc-I-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "iothread",
+ "parent": "event-loop-base"
+ },
+ {
+ "name": "memory-backend-file",
+ "parent": "memory-backend"
+ },
+ {
+ "name": "chardev-serial",
+ "parent": "chardev-fd"
+ },
+ {
+ "name": "qio-dns-resolver",
+ "parent": "object"
+ },
+ {
+ "name": "qio-channel-tls",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "dbus-vmstate",
+ "parent": "object"
+ },
+ {
+ "name": "SCSI",
+ "parent": "bus"
+ },
+ {
+ "name": "chardev-socket",
+ "parent": "chardev"
+ },
+ {
+ "name": "qemu-text-console",
+ "parent": "qemu-console"
+ },
+ {
+ "name": "sysbus-m48t59",
+ "parent": "sysbus-m48txx"
+ },
+ {
+ "name": "clock",
+ "parent": "object"
+ },
+ {
+ "name": "tcg-accel",
+ "parent": "accel"
+ },
+ {
+ "name": "chardev-memory",
+ "parent": "chardev-ringbuf"
+ },
+ {
+ "name": "qio-channel-socket",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "authz-list",
+ "parent": "authz"
+ },
+ {
+ "name": "sun-CS4231",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "qio-channel-command",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "LEON2-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "qio-channel-null",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "scsi-cd",
+ "parent": "scsi-disk-base"
+ },
+ {
+ "name": "esp",
+ "parent": "device"
+ },
+ {
+ "name": "sun4m-iommu",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "chardev-vc",
+ "parent": "chardev"
+ },
+ {
+ "name": "input-linux",
+ "parent": "object"
+ },
+ {
+ "name": "chardev-stdio",
+ "parent": "chardev-fd"
+ },
+ {
+ "name": "LEON3-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "filter-dump",
+ "parent": "netfilter"
+ },
+ {
+ "name": "authz-simple",
+ "parent": "authz"
+ },
+ {
+ "name": "memory-region-portio-list",
+ "parent": "object"
+ },
+ {
+ "name": "memory-backend-memfd",
+ "parent": "memory-backend"
+ },
+ {
+ "name": "sun4m-iommu-memory-region",
+ "parent": "iommu-memory-region"
+ },
+ {
+ "name": "escc",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "TI-SuperSparc-II-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "floppy",
+ "parent": "device"
+ },
+ {
+ "name": "colo-compare",
+ "parent": "object"
+ },
+ {
+ "name": "chardev-parallel",
+ "parent": "chardev"
+ },
+ {
+ "name": "TI-SuperSparc-60-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "chardev-null",
+ "parent": "chardev"
+ },
+ {
+ "name": "authz-pam",
+ "parent": "authz"
+ },
+ {
+ "name": "SS-5-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "sparc32-espdma",
+ "parent": "sparc32-dma-device"
+ },
+ {
+ "name": "cryptodev-backend",
+ "parent": "object"
+ },
+ {
+ "name": "grlib-apbuart",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "chardev-qemu-vdagent",
+ "parent": "chardev"
+ },
+ {
+ "name": "sysbus-m48t08",
+ "parent": "sysbus-m48txx"
+ },
+ {
+ "name": "legacy-reset",
+ "parent": "object"
+ },
+ {
+ "name": "sysbus-fdc",
+ "parent": "base-sysbus-fdc"
+ },
+ {
+ "name": "loader",
+ "parent": "device"
+ },
+ {
+ "name": "sparc32-ledma",
+ "parent": "sparc32-dma-device"
+ },
+ {
+ "name": "qio-channel-block",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "sun-tcx",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "macio_idreg",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "memory-backend-ram",
+ "parent": "memory-backend"
+ },
+ {
+ "name": "rng-builtin",
+ "parent": "rng-backend"
+ },
+ {
+ "name": "filter-mirror",
+ "parent": "netfilter"
+ },
+ {
+ "name": "filter-redirector",
+ "parent": "netfilter"
+ },
+ {
+ "name": "chardev-wctablet",
+ "parent": "chardev"
+ },
+ {
+ "name": "tls-creds-psk",
+ "parent": "tls-creds"
+ },
+ {
+ "name": "accel",
+ "parent": "object"
+ },
+ {
+ "name": "openprom",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "fw_cfg_mem",
+ "parent": "fw_cfg"
+ },
+ {
+ "name": "tls-creds-anon",
+ "parent": "tls-creds"
+ },
+ {
+ "name": "tcx_afx",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "resettable-container",
+ "parent": "object"
+ },
+ {
+ "name": "qemu-graphic-console",
+ "parent": "qemu-console"
+ },
+ {
+ "name": "fw_cfg_io",
+ "parent": "fw_cfg"
+ },
+ {
+ "name": "SPARCbook-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "qtest",
+ "parent": "object"
+ },
+ {
+ "name": "secret_keyring",
+ "parent": "secret_common"
+ },
+ {
+ "name": "leon3_generic-machine",
+ "parent": "machine"
+ },
+ {
+ "name": "chardev-testdev",
+ "parent": "chardev"
+ },
+ {
+ "name": "TI-SuperSparc-40-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "TI-MicroSparc-II-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "qio-net-listener",
+ "parent": "object"
+ },
+ {
+ "name": "throttle-group",
+ "parent": "object"
+ },
+ {
+ "name": "slavio_timer",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "System",
+ "parent": "bus"
+ },
+ {
+ "name": "memory",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "authz-list-file",
+ "parent": "authz"
+ },
+ {
+ "name": "lance",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "filter-replay",
+ "parent": "netfilter"
+ },
+ {
+ "name": "filter-buffer",
+ "parent": "netfilter"
+ },
+ {
+ "name": "qio-channel-file",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "floppy-bus",
+ "parent": "bus"
+ },
+ {
+ "name": "sysbus-m48t02",
+ "parent": "sysbus-m48txx"
+ },
+ {
+ "name": "chardev-msmouse",
+ "parent": "chardev"
+ },
+ {
+ "name": "SPARCClassic-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "or-irq",
+ "parent": "device"
+ },
+ {
+ "name": "scsi-generic",
+ "parent": "scsi-device"
+ },
+ {
+ "name": "unimplemented-device",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "qio-channel-buffer",
+ "parent": "qio-channel"
+ },
+ {
+ "name": "input-barrier",
+ "parent": "object"
+ },
+ {
+ "name": "chardev-pipe",
+ "parent": "chardev-fd"
+ },
+ {
+ "name": "chardev-gdb",
+ "parent": "chardev"
+ },
+ {
+ "name": "irq",
+ "parent": "object"
+ },
+ {
+ "name": "memory-region",
+ "parent": "object"
+ },
+ {
+ "name": "eccmemctl",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "sparc32-dma",
+ "parent": "sys-bus-device"
+ },
+ {
+ "name": "qemu-fixed-text-console",
+ "parent": "qemu-text-console"
+ },
+ {
+ "name": "TI-SuperSparc-50-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "LX-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "chardev-spicevmc",
+ "parent": "chardev-spice"
+ },
+ {
+ "name": "container",
+ "parent": "object"
+ },
+ {
+ "name": "rng-random",
+ "parent": "rng-backend"
+ },
+ {
+ "name": "chardev-file",
+ "parent": "chardev-fd"
+ },
+ {
+ "name": "SS-20-machine",
+ "parent": "sun4m-common-machine"
+ },
+ {
+ "name": "TI-SuperSparc-51-sparc-cpu",
+ "parent": "sparc-cpu"
+ },
+ {
+ "name": "sun-fdtwo",
+ "parent": "base-sysbus-fdc"
+ }
+ ],
+ "id": "libvirt-6"
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "virtio-blk-pci"
+ },
+ "id": "libvirt-7"
+}
+
+{
+ "id": "libvirt-7",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'virtio-blk-pci' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "scsi-hd"
+ },
+ "id": "libvirt-8"
+}
+
+{
+ "return": [
+ {
+ "default-value": 4294967295,
+ "name": "scsi-id",
+ "type": "uint32"
+ },
+ {
+ "default-value": 4294967295,
+ "name": "lun",
+ "type": "uint32"
+ },
+ {
+ "default-value": 0,
+ "name": "channel",
+ "type": "uint32"
+ },
+ {
+ "default-value": 0,
+ "name": "lheads",
+ "type": "uint32"
+ },
+ {
+ "default-value": 0,
+ "name": "lcyls",
+ "type": "uint32"
+ },
+ {
+ "default-value": false,
+ "name": "share-rw",
+ "type": "bool"
+ },
+ {
+ "default-value": "auto",
+ "name": "account-invalid",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "default-value": 0,
+ "name": "lsecs",
+ "type": "uint32"
+ },
+ {
+ "default-value": 5,
+ "name": "scsi_version",
+ "type": "int32"
+ },
+ {
+ "default-value": 0,
+ "name": "secs",
+ "type": "uint32"
+ },
+ {
+ "default-value": false,
+ "name": "removable",
+ "description": "on/off",
+ "type": "bool"
+ },
+ {
+ "name": "ver",
+ "type": "str"
+ },
+ {
+ "default-value": 1073741824,
+ "name": "max_unmap_size",
+ "type": "uint64"
+ },
+ {
+ "default-value": 0,
+ "name": "cyls",
+ "type": "uint32"
+ },
+ {
+ "name": "serial",
+ "type": "str"
+ },
+ {
+ "default-value": 0,
+ "name": "min_io_size",
+ "type": "size"
+ },
+ {
+ "name": "product",
+ "type": "str"
+ },
+ {
+ "default-value": 0,
+ "name": "rotation_rate",
+ "type": "uint16"
+ },
+ {
+ "default-value": 0,
+ "name": "heads",
+ "type": "uint32"
+ },
+ {
+ "default-value": false,
+ "name": "dpofua",
+ "description": "on/off",
+ "type": "bool"
+ },
+ {
+ "name": "drive",
+ "description": "Node name or ID of a block device to use as a backend",
+ "type": "str"
+ },
+ {
+ "default-value": "auto",
+ "name": "werror",
+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
+ "type": "BlockdevOnError"
+ },
+ {
+ "default-value": 0,
+ "name": "wwn",
+ "type": "uint64"
+ },
+ {
+ "name": "vendor",
+ "type": "str"
+ },
+ {
+ "default-value": "auto",
+ "name": "rerror",
+ "description": "Error handling policy, report/ignore/enospc/stop/auto",
+ "type": "BlockdevOnError"
+ },
+ {
+ "default-value": "auto",
+ "name": "write-cache",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "default-value": 0,
+ "name": "physical_block_size",
+ "description": "A power of two between 512 B and 2 MiB",
+ "type": "size"
+ },
+ {
+ "default-value": 2147483647,
+ "name": "max_io_size",
+ "type": "uint64"
+ },
+ {
+ "default-value": false,
+ "name": "quirk_mode_page_vendor_specific_apple",
+ "description": "on/off",
+ "type": "bool"
+ },
+ {
+ "default-value": 0,
+ "name": "opt_io_size",
+ "type": "size"
+ },
+ {
+ "default-value": 0,
+ "name": "logical_block_size",
+ "description": "A power of two between 512 B and 2 MiB",
+ "type": "size"
+ },
+ {
+ "default-value": 4294967295,
+ "name": "discard_granularity",
+ "type": "size"
+ },
+ {
+ "default-value": 0,
+ "name": "port_wwn",
+ "type": "uint64"
+ },
+ {
+ "default-value": 0,
+ "name": "port_index",
+ "type": "uint16"
+ },
+ {
+ "default-value": "auto",
+ "name": "account-failed",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "name": "device_id",
+ "type": "str"
+ },
+ {
+ "default-value": "auto",
+ "name": "backend_defaults",
+ "description": "on/off/auto",
+ "type": "OnOffAuto"
+ },
+ {
+ "name": "bootindex",
+ "type": "int32"
+ }
+ ],
+ "id": "libvirt-8"
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "ide-hd"
+ },
+ "id": "libvirt-9"
+}
+
+{
+ "id": "libvirt-9",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'ide-hd' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "PIIX4_PM"
+ },
+ "id": "libvirt-10"
+}
+
+{
+ "id": "libvirt-10",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'PIIX4_PM' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "kvm-pit"
+ },
+ "id": "libvirt-11"
+}
+
+{
+ "id": "libvirt-11",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'kvm-pit' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "ICH9-LPC"
+ },
+ "id": "libvirt-12"
+}
+
+{
+ "id": "libvirt-12",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'ICH9-LPC' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "virtio-balloon-pci"
+ },
+ "id": "libvirt-13"
+}
+
+{
+ "id": "libvirt-13",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'virtio-balloon-pci' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "virtio-balloon-ccw"
+ },
+ "id": "libvirt-14"
+}
+
+{
+ "id": "libvirt-14",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'virtio-balloon-ccw' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "virtio-balloon-device"
+ },
+ "id": "libvirt-15"
+}
+
+{
+ "id": "libvirt-15",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'virtio-balloon-device' not found"
+ }
+}
+
+{
+ "execute": "device-list-properties",
+ "arguments": {
+ "typename": "usb-host"
+ },
+ "id": "libvirt-16"
+}
+
+{
+ "id": "libvirt-16",
+ "error": {
+ "class": "DeviceNotFound",
+ "desc": "Device 'usb-host' not found"
+ }
+}
+
+{
+ "execute": "qom-list-properties",
+ "arguments": {
+ "typename": "memory-backend-file"
+ },
+ "id": "libvirt-17"
+}
+
+{
+ "return": [
+ {
+ "name": "type",
+ "type": "string"
+ },
+ {
+ "name": "share",
+ "description": "Mark the memory as private to QEMU or shared",
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "description": "Size of the memory region (ex: 500M)",
+ "type": "int"
+ },
+ {
+ "name": "dump",
+ "description": "Set to 'off' to exclude from core dump",
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "description": "Number of CPU threads to use for prealloc",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "description": "Set the NUMA policy",
+ "type": "HostMemPolicy"
+ },
+ {
+ "name": "prealloc-context",
+ "description": "Context to use for creating CPU threads for preallocation",
+ "type": "link<thread-context>"
+ },
+ {
+ "name": "prealloc",
+ "description": "Preallocate memory",
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "description": "Reserve swap space (or huge pages) if applicable",
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "description": "Binds memory to the list of NUMA host nodes",
+ "type": "int"
+ },
+ {
+ "name": "merge",
+ "description": "Mark memory as mergeable",
+ "type": "bool"
+ },
+ {
+ "name": "pmem",
+ "type": "bool"
+ },
+ {
+ "name": "align",
+ "type": "int"
+ },
+ {
+ "name": "offset",
+ "description": "Offset into the target file (ex: 1G)",
+ "type": "int"
+ },
+ {
+ "name": "mem-path",
+ "type": "string"
+ },
+ {
+ "name": "rom",
+ "description": "Whether to create Read Only Memory (ROM)",
+ "type": "OnOffAuto"
+ },
+ {
+ "name": "discard-data",
+ "type": "bool"
+ },
+ {
+ "name": "readonly",
+ "type": "bool"
+ }
+ ],
+ "id": "libvirt-17"
+}
+
+{
+ "execute": "qom-list-properties",
+ "arguments": {
+ "typename": "memory-backend-memfd"
+ },
+ "id": "libvirt-18"
+}
+
+{
+ "return": [
+ {
+ "name": "type",
+ "type": "string"
+ },
+ {
+ "name": "share",
+ "description": "Mark the memory as private to QEMU or shared",
+ "type": "bool"
+ },
+ {
+ "name": "size",
+ "description": "Size of the memory region (ex: 500M)",
+ "type": "int"
+ },
+ {
+ "name": "dump",
+ "description": "Set to 'off' to exclude from core dump",
+ "type": "bool"
+ },
+ {
+ "name": "prealloc-threads",
+ "description": "Number of CPU threads to use for prealloc",
+ "type": "int"
+ },
+ {
+ "name": "x-use-canonical-path-for-ramblock-id",
+ "type": "bool"
+ },
+ {
+ "name": "policy",
+ "description": "Set the NUMA policy",
+ "type": "HostMemPolicy"
+ },
+ {
+ "name": "prealloc-context",
+ "description": "Context to use for creating CPU threads for preallocation",
+ "type": "link<thread-context>"
+ },
+ {
+ "name": "prealloc",
+ "description": "Preallocate memory",
+ "type": "bool"
+ },
+ {
+ "name": "reserve",
+ "description": "Reserve swap space (or huge pages) if applicable",
+ "type": "bool"
+ },
+ {
+ "name": "host-nodes",
+ "description": "Binds memory to the list of NUMA host nodes",
+ "type": "int"
+ },
+ {
+ "name": "merge",
+ "description": "Mark memory as mergeable",
+ "type": "bool"
+ },
+ {
+ "name": "hugetlb",
+ "description": "Use huge pages",
+ "type": "bool"
+ },
+ {
+ "name": "seal",
+ "description": "Seal growing & shrinking",
+ "type": "bool"
+ },
+ {
+ "name": "hugetlbsize",
+ "description": "Huge pages size (ex: 2M, 1G)",
+ "type": "int"
+ }
+ ],
+ "id": "libvirt-18"
+}
+
+{
+ "execute": "query-machines",
+ "id": "libvirt-19"
+}
+
+{
+ "return": [
+ {
+ "hotpluggable-cpus": false,
+ "name": "SS-20",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-SuperSparc-II-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 4,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "LX",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-MicroSparc-I-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SPARCClassic",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-MicroSparc-I-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "leon3_generic",
+ "numa-mem-supported": false,
+ "default-cpu-type": "LEON3-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 4,
+ "deprecated": false,
+ "default-ram-id": "leon3.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SPARCbook",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-MicroSparc-I-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SS-5",
+ "numa-mem-supported": false,
+ "default-cpu-type": "Fujitsu-MB86904-sparc-cpu",
+ "acpi": false,
+ "is-default": true,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SS-4",
+ "numa-mem-supported": false,
+ "default-cpu-type": "Fujitsu-MB86904-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SS-600MP",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-SuperSparc-II-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 4,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "SS-10",
+ "numa-mem-supported": false,
+ "default-cpu-type": "TI-SuperSparc-II-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 4,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "Voyager",
+ "numa-mem-supported": false,
+ "default-cpu-type": "Fujitsu-MB86904-sparc-cpu",
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "sun4m.ram"
+ },
+ {
+ "hotpluggable-cpus": false,
+ "name": "none",
+ "numa-mem-supported": false,
+ "acpi": false,
+ "cpu-max": 1,
+ "deprecated": false,
+ "default-ram-id": "ram"
+ }
+ ],
+ "id": "libvirt-19"
+}
+
+{
+ "execute": "qom-list-properties",
+ "arguments": {
+ "typename": "none-machine"
+ },
+ "id": "libvirt-20"
+}
+
+{
+ "return": [
+ {
+ "name": "type",
+ "type": "string"
+ },
+ {
+ "name": "kernel",
+ "description": "Linux kernel image file",
+ "type": "string"
+ },
+ {
+ "name": "dt-compatible",
+ "description": "Overrides the \"compatible\" property of the dt root node",
+ "type": "string"
+ },
+ {
+ "name": "boot",
+ "description": "Boot configuration",
+ "type": "BootConfiguration"
+ },
+ {
+ "name": "memory",
+ "description": "Memory size configuration",
+ "type": "MemorySizeConfiguration"
+ },
+ {
+ "name": "initrd",
+ "description": "Linux initial ramdisk file",
+ "type": "string"
+ },
+ {
+ "name": "confidential-guest-support",
+ "description": "Set confidential guest scheme to support",
+ "type": "link<confidential-guest-support>"
+ },
+ {
+ "name": "graphics",
+ "description": "Set on/off to enable/disable graphics emulation",
+ "type": "bool"
+ },
+ {
+ "name": "usb",
+ "description": "Set on/off to enable/disable usb",
+ "type": "bool"
+ },
+ {
+ "name": "firmware",
+ "description": "Firmware image",
+ "type": "string"
+ },
+ {
+ "name": "memory-encryption",
+ "description": "Set memory encryption object to use",
+ "type": "string"
+ },
+ {
+ "name": "smp",
+ "description": "CPU topology",
+ "type": "SMPConfiguration"
+ },
+ {
+ "name": "dump-guest-core",
+ "description": "Include guest memory in a core dump",
+ "type": "bool"
+ },
+ {
+ "name": "phandle-start",
+ "description": "The first phandle ID we may generate dynamically",
+ "type": "int"
+ },
+ {
+ "name": "dumpdtb",
+ "description": "Dump current dtb to a file and quit",
+ "type": "string"
+ },
+ {
+ "name": "memory-backend",
+ "description": "Set RAM backendValid value is ID of hostmem based backend",
+ "type": "link<memory-backend>"
+ },
+ {
+ "name": "dtb",
+ "description": "Linux kernel device tree file",
+ "type": "string"
+ },
+ {
+ "name": "mem-merge",
+ "description": "Enable/disable memory merge support",
+ "type": "bool"
+ },
+ {
+ "name": "append",
+ "description": "Linux kernel command line",
+ "type": "string"
+ },
+ {
+ "name": "suppress-vmdesc",
+ "description": "Set on to disable self-describing migration",
+ "type": "bool"
+ },
+ {
+ "name": "peripheral-anon",
+ "type": "child<container>"
+ },
+ {
+ "name": "peripheral",
+ "type": "child<container>"
+ }
+ ],
+ "id": "libvirt-20"
+}
+
+{
+ "execute": "query-tpm-models",
+ "id": "libvirt-21"
+}
+
+{
+ "return": [],
+ "id": "libvirt-21"
+}
+
+{
+ "execute": "query-tpm-types",
+ "id": "libvirt-22"
+}
+
+{
+ "return": [],
+ "id": "libvirt-22"
+}
+
+{
+ "execute": "query-command-line-options",
+ "id": "libvirt-23"
+}
+
+{
+ "return": [
+ {
+ "parameters": [
+ {
+ "name": "type",
+ "help": "machine type",
+ "type": "string"
+ },
+ {
+ "name": "kernel",
+ "help": "Linux kernel image file",
+ "type": "string"
+ },
+ {
+ "name": "dt-compatible",
+ "help": "Overrides the \"compatible\" property of the dt root node",
+ "type": "string"
+ },
+ {
+ "name": "boot",
+ "help": "Boot configuration",
+ "type": "string"
+ },
+ {
+ "name": "memory",
+ "help": "Memory size configuration",
+ "type": "string"
+ },
+ {
+ "name": "initrd",
+ "help": "Linux initial ramdisk file",
+ "type": "string"
+ },
+ {
+ "name": "confidential-guest-support",
+ "help": "Set confidential guest scheme to support",
+ "type": "string"
+ },
+ {
+ "name": "graphics",
+ "help": "Set on/off to enable/disable graphics emulation",
+ "type": "boolean"
+ },
+ {
+ "name": "usb",
+ "help": "Set on/off to enable/disable usb",
+ "type": "boolean"
+ },
+ {
+ "name": "firmware",
+ "help": "Firmware image",
+ "type": "string"
+ },
+ {
+ "name": "memory-encryption",
+ "help": "Set memory encryption object to use",
+ "type": "string"
+ },
+ {
+ "name": "smp",
+ "help": "CPU topology",
+ "type": "string"
+ },
+ {
+ "name": "dump-guest-core",
+ "help": "Include guest memory in a core dump",
+ "type": "boolean"
+ },
+ {
+ "name": "phandle-start",
+ "help": "The first phandle ID we may generate dynamically",
+ "type": "number"
+ },
+ {
+ "name": "dumpdtb",
+ "help": "Dump current dtb to a file and quit",
+ "type": "string"
+ },
+ {
+ "name": "memory-backend",
+ "help": "Set RAM backendValid value is ID of hostmem based backend",
+ "type": "string"
+ },
+ {
+ "name": "dtb",
+ "help": "Linux kernel device tree file",
+ "type": "string"
+ },
+ {
+ "name": "mem-merge",
+ "help": "Enable/disable memory merge support",
+ "type": "boolean"
+ },
+ {
+ "name": "append",
+ "help": "Linux kernel command line",
+ "type": "string"
+ },
+ {
+ "name": "suppress-vmdesc",
+ "help": "Set on to disable self-describing migration",
+ "type": "boolean"
+ }
+ ],
+ "option": "machine"
+ },
+ {
+ "parameters": [
+ {
+ "name": "rendernode",
+ "type": "string"
+ },
+ {
+ "name": "gl",
+ "type": "boolean"
+ },
+ {
+ "name": "head",
+ "type": "number"
+ },
+ {
+ "name": "display",
+ "type": "string"
+ },
+ {
+ "name": "seamless-migration",
+ "type": "boolean"
+ },
+ {
+ "name": "playback-compression",
+ "type": "boolean"
+ },
+ {
+ "name": "agent-mouse",
+ "type": "boolean"
+ },
+ {
+ "name": "streaming-video",
+ "type": "string"
+ },
+ {
+ "name": "zlib-glz-wan-compression",
+ "type": "string"
+ },
+ {
+ "name": "jpeg-wan-compression",
+ "type": "string"
+ },
+ {
+ "name": "image-compression",
+ "type": "string"
+ },
+ {
+ "name": "plaintext-channel",
+ "type": "string"
+ },
+ {
+ "name": "tls-channel",
+ "type": "string"
+ },
+ {
+ "name": "tls-ciphers",
+ "type": "string"
+ },
+ {
+ "name": "x509-dh-key-file",
+ "type": "string"
+ },
+ {
+ "name": "x509-cacert-file",
+ "type": "string"
+ },
+ {
+ "name": "x509-cert-file",
+ "type": "string"
+ },
+ {
+ "name": "x509-key-password",
+ "type": "string"
+ },
+ {
+ "name": "x509-key-file",
+ "type": "string"
+ },
+ {
+ "name": "x509-dir",
+ "type": "string"
+ },
+ {
+ "name": "sasl",
+ "type": "boolean"
+ },
+ {
+ "name": "disable-agent-file-xfer",
+ "type": "boolean"
+ },
+ {
+ "name": "disable-copy-paste",
+ "type": "boolean"
+ },
+ {
+ "name": "disable-ticketing",
+ "type": "boolean"
+ },
+ {
+ "name": "password-secret",
+ "type": "string"
+ },
+ {
+ "name": "unix",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv6",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv4",
+ "type": "boolean"
+ },
+ {
+ "name": "addr",
+ "type": "string"
+ },
+ {
+ "name": "tls-port",
+ "type": "number"
+ },
+ {
+ "name": "port",
+ "type": "number"
+ }
+ ],
+ "option": "spice"
+ },
+ {
+ "parameters": [
+ {
+ "name": "timeout",
+ "help": "Request timeout in seconds (default 0 = no timeout)",
+ "type": "number"
+ },
+ {
+ "name": "initiator-name",
+ "help": "Initiator iqn name to use when connecting",
+ "type": "string"
+ },
+ {
+ "name": "header-digest",
+ "help": "HeaderDigest setting. {CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
+ "type": "string"
+ },
+ {
+ "name": "password-secret",
+ "help": "ID of the secret providing password for CHAP authentication to target",
+ "type": "string"
+ },
+ {
+ "name": "password",
+ "help": "password for CHAP authentication to target",
+ "type": "string"
+ },
+ {
+ "name": "user",
+ "help": "username for CHAP authentication to target",
+ "type": "string"
+ }
+ ],
+ "option": "iscsi"
+ },
+ {
+ "parameters": [
+ {
+ "name": "resourcecontrol",
+ "type": "string"
+ },
+ {
+ "name": "spawn",
+ "type": "string"
+ },
+ {
+ "name": "elevateprivileges",
+ "type": "string"
+ },
+ {
+ "name": "obsolete",
+ "type": "string"
+ },
+ {
+ "name": "enable",
+ "type": "boolean"
+ }
+ ],
+ "option": "sandbox"
+ },
+ {
+ "parameters": [
+ {
+ "name": "dmode",
+ "type": "number"
+ },
+ {
+ "name": "fmode",
+ "type": "number"
+ },
+ {
+ "name": "sock_fd",
+ "type": "number"
+ },
+ {
+ "name": "socket",
+ "type": "string"
+ },
+ {
+ "name": "multidevs",
+ "type": "string"
+ },
+ {
+ "name": "readonly",
+ "type": "boolean"
+ },
+ {
+ "name": "writeout",
+ "type": "string"
+ },
+ {
+ "name": "security_model",
+ "type": "string"
+ },
+ {
+ "name": "mount_tag",
+ "type": "string"
+ },
+ {
+ "name": "path",
+ "type": "string"
+ },
+ {
+ "name": "fsdriver",
+ "type": "string"
+ }
+ ],
+ "option": "virtfs"
+ },
+ {
+ "parameters": [
+ {
+ "name": "throttling.iops-size",
+ "help": "when limiting by iops max size of an I/O in bytes",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write-max-length",
+ "help": "length of the bps-write-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read-max-length",
+ "help": "length of the bps-read-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total-max-length",
+ "help": "length of the bps-total-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write-max-length",
+ "help": "length of the iops-write-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read-max-length",
+ "help": "length of the iops-read-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total-max-length",
+ "help": "length of the iops-total-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write-max",
+ "help": "total bytes write burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read-max",
+ "help": "total bytes read burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total-max",
+ "help": "total bytes burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write-max",
+ "help": "I/O operations write burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read-max",
+ "help": "I/O operations read burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total-max",
+ "help": "I/O operations burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write",
+ "help": "limit write bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read",
+ "help": "limit read bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total",
+ "help": "limit total bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write",
+ "help": "limit write operations per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read",
+ "help": "limit read operations per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total",
+ "help": "limit total I/O operations per second",
+ "type": "number"
+ },
+ {
+ "name": "dmode",
+ "type": "number"
+ },
+ {
+ "name": "fmode",
+ "type": "number"
+ },
+ {
+ "name": "sock_fd",
+ "type": "number"
+ },
+ {
+ "name": "socket",
+ "type": "string"
+ },
+ {
+ "name": "multidevs",
+ "type": "string"
+ },
+ {
+ "name": "readonly",
+ "type": "boolean"
+ },
+ {
+ "name": "writeout",
+ "type": "string"
+ },
+ {
+ "name": "security_model",
+ "type": "string"
+ },
+ {
+ "name": "path",
+ "type": "string"
+ },
+ {
+ "name": "fsdriver",
+ "type": "string"
+ }
+ ],
+ "option": "fsdev"
+ },
+ {
+ "parameters": [
+ {
+ "name": "power-control",
+ "type": "boolean"
+ },
+ {
+ "name": "audiodev",
+ "type": "string"
+ },
+ {
+ "name": "non-adaptive",
+ "type": "boolean"
+ },
+ {
+ "name": "lossy",
+ "type": "boolean"
+ },
+ {
+ "name": "sasl-authz",
+ "type": "string"
+ },
+ {
+ "name": "tls-authz",
+ "type": "string"
+ },
+ {
+ "name": "sasl",
+ "type": "boolean"
+ },
+ {
+ "name": "key-delay-ms",
+ "type": "number"
+ },
+ {
+ "name": "lock-key-sync",
+ "type": "boolean"
+ },
+ {
+ "name": "reverse",
+ "type": "boolean"
+ },
+ {
+ "name": "password-secret",
+ "type": "string"
+ },
+ {
+ "name": "password",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv6",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv4",
+ "type": "boolean"
+ },
+ {
+ "name": "to",
+ "type": "number"
+ },
+ {
+ "name": "connections",
+ "type": "number"
+ },
+ {
+ "name": "head",
+ "type": "number"
+ },
+ {
+ "name": "display",
+ "type": "string"
+ },
+ {
+ "name": "share",
+ "type": "string"
+ },
+ {
+ "name": "tls-creds",
+ "type": "string"
+ },
+ {
+ "name": "websocket",
+ "type": "string"
+ },
+ {
+ "name": "vnc",
+ "type": "string"
+ }
+ ],
+ "option": "vnc"
+ },
+ {
+ "parameters": [
+ {
+ "name": "chroot",
+ "type": "string"
+ },
+ {
+ "name": "async-teardown",
+ "type": "boolean"
+ }
+ ],
+ "option": "run-with"
+ },
+ {
+ "parameters": [
+ {
+ "name": "watchdog",
+ "type": "string"
+ },
+ {
+ "name": "panic",
+ "type": "string"
+ },
+ {
+ "name": "reboot",
+ "type": "string"
+ },
+ {
+ "name": "shutdown",
+ "type": "string"
+ }
+ ],
+ "option": "action"
+ },
+ {
+ "parameters": [
+ {
+ "name": "gen_id",
+ "help": "Sets id of the object generating the fw_cfg blob to be inserted",
+ "type": "string"
+ },
+ {
+ "name": "string",
+ "help": "Sets content of the blob to be inserted from a string",
+ "type": "string"
+ },
+ {
+ "name": "file",
+ "help": "Sets the name of the file from which the fw_cfg blob will be loaded",
+ "type": "string"
+ },
+ {
+ "name": "name",
+ "help": "Sets the fw_cfg name of the blob to be inserted",
+ "type": "string"
+ }
+ ],
+ "option": "fw_cfg"
+ },
+ {
+ "parameters": [],
+ "option": ""
+ },
+ {
+ "parameters": [
+ {
+ "name": "rrsnapshot",
+ "type": "string"
+ },
+ {
+ "name": "rrfile",
+ "type": "string"
+ },
+ {
+ "name": "rr",
+ "type": "string"
+ },
+ {
+ "name": "sleep",
+ "type": "boolean"
+ },
+ {
+ "name": "align",
+ "type": "boolean"
+ },
+ {
+ "name": "shift",
+ "type": "string"
+ }
+ ],
+ "option": "icount"
+ },
+ {
+ "parameters": [],
+ "option": "numa"
+ },
+ {
+ "parameters": [
+ {
+ "name": "debug-threads",
+ "help": "When enabled, name the individual threads; defaults off.\nNOTE: The thread names are for debugging and not a\nstable API.",
+ "type": "boolean"
+ },
+ {
+ "name": "process",
+ "help": "Sets the name of the QEMU process, as shown in top etc",
+ "type": "string"
+ },
+ {
+ "name": "guest",
+ "help": "Sets the name of the guest.\nThis name will be displayed in the SDL window caption.\nThe name will also be used for the VNC server",
+ "type": "string"
+ }
+ ],
+ "option": "name"
+ },
+ {
+ "parameters": [
+ {
+ "name": "guest-name",
+ "help": "Prepends guest name for error messages but only if -name guest is set otherwise option is ignored\n",
+ "type": "boolean"
+ },
+ {
+ "name": "timestamp",
+ "type": "boolean"
+ }
+ ],
+ "option": "msg"
+ },
+ {
+ "parameters": [
+ {
+ "name": "cpu-pm",
+ "type": "boolean"
+ },
+ {
+ "name": "mem-lock",
+ "type": "boolean"
+ }
+ ],
+ "option": "overcommit"
+ },
+ {
+ "parameters": [],
+ "option": "tpmdev"
+ },
+ {
+ "parameters": [],
+ "option": "object"
+ },
+ {
+ "parameters": [
+ {
+ "name": "opaque",
+ "help": "free-form string used to describe fd",
+ "type": "string"
+ },
+ {
+ "name": "set",
+ "help": "ID of the fd set to add fd to",
+ "type": "number"
+ },
+ {
+ "name": "fd",
+ "help": "file descriptor of which a duplicate is added to fd set",
+ "type": "number"
+ }
+ ],
+ "option": "add-fd"
+ },
+ {
+ "parameters": [
+ {
+ "name": "strict",
+ "type": "boolean"
+ },
+ {
+ "name": "reboot-timeout",
+ "type": "number"
+ },
+ {
+ "name": "splash-time",
+ "type": "number"
+ },
+ {
+ "name": "splash",
+ "type": "string"
+ },
+ {
+ "name": "menu",
+ "type": "boolean"
+ },
+ {
+ "name": "once",
+ "type": "string"
+ },
+ {
+ "name": "order",
+ "type": "string"
+ }
+ ],
+ "option": "boot-opts"
+ },
+ {
+ "parameters": [
+ {
+ "name": "maxcpus",
+ "type": "number"
+ },
+ {
+ "name": "threads",
+ "type": "number"
+ },
+ {
+ "name": "cores",
+ "type": "number"
+ },
+ {
+ "name": "clusters",
+ "type": "number"
+ },
+ {
+ "name": "dies",
+ "type": "number"
+ },
+ {
+ "name": "sockets",
+ "type": "number"
+ },
+ {
+ "name": "books",
+ "type": "number"
+ },
+ {
+ "name": "drawers",
+ "type": "number"
+ },
+ {
+ "name": "cpus",
+ "type": "number"
+ }
+ ],
+ "option": "smp-opts"
+ },
+ {
+ "parameters": [
+ {
+ "name": "maxmem",
+ "type": "size"
+ },
+ {
+ "name": "slots",
+ "type": "number"
+ },
+ {
+ "name": "size",
+ "type": "size"
+ }
+ ],
+ "option": "memory"
+ },
+ {
+ "parameters": [],
+ "option": "accel"
+ },
+ {
+ "parameters": [
+ {
+ "name": "romfile",
+ "type": "string"
+ },
+ {
+ "name": "bootindex",
+ "type": "number"
+ }
+ ],
+ "option": "option-rom"
+ },
+ {
+ "parameters": [
+ {
+ "name": "file",
+ "type": "string"
+ },
+ {
+ "name": "events",
+ "type": "string"
+ },
+ {
+ "name": "enable",
+ "type": "string"
+ }
+ ],
+ "option": "trace"
+ },
+ {
+ "parameters": [
+ {
+ "name": "pretty",
+ "type": "boolean"
+ },
+ {
+ "name": "chardev",
+ "type": "string"
+ },
+ {
+ "name": "mode",
+ "type": "string"
+ }
+ ],
+ "option": "mon"
+ },
+ {
+ "parameters": [
+ {
+ "name": "value",
+ "type": "string"
+ },
+ {
+ "name": "property",
+ "type": "string"
+ },
+ {
+ "name": "driver",
+ "type": "string"
+ }
+ ],
+ "option": "global"
+ },
+ {
+ "parameters": [
+ {
+ "name": "driftfix",
+ "type": "string"
+ },
+ {
+ "name": "clock",
+ "type": "string"
+ },
+ {
+ "name": "base",
+ "type": "string"
+ }
+ ],
+ "option": "rtc"
+ },
+ {
+ "parameters": [],
+ "option": "net"
+ },
+ {
+ "parameters": [],
+ "option": "nic"
+ },
+ {
+ "parameters": [],
+ "option": "netdev"
+ },
+ {
+ "parameters": [],
+ "option": "device"
+ },
+ {
+ "parameters": [
+ {
+ "name": "abstract",
+ "type": "boolean"
+ },
+ {
+ "name": "tight",
+ "default": "on",
+ "type": "boolean"
+ },
+ {
+ "name": "clipboard",
+ "type": "boolean"
+ },
+ {
+ "name": "mouse",
+ "type": "boolean"
+ },
+ {
+ "name": "logappend",
+ "type": "boolean"
+ },
+ {
+ "name": "logfile",
+ "type": "string"
+ },
+ {
+ "name": "append",
+ "type": "boolean"
+ },
+ {
+ "name": "chardev",
+ "type": "string"
+ },
+ {
+ "name": "size",
+ "type": "size"
+ },
+ {
+ "name": "debug",
+ "type": "number"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "signal",
+ "type": "boolean"
+ },
+ {
+ "name": "mux",
+ "type": "boolean"
+ },
+ {
+ "name": "rows",
+ "type": "number"
+ },
+ {
+ "name": "cols",
+ "type": "number"
+ },
+ {
+ "name": "height",
+ "type": "number"
+ },
+ {
+ "name": "width",
+ "type": "number"
+ },
+ {
+ "name": "websocket",
+ "type": "boolean"
+ },
+ {
+ "name": "tls-authz",
+ "type": "string"
+ },
+ {
+ "name": "tls-creds",
+ "type": "string"
+ },
+ {
+ "name": "tn3270",
+ "type": "boolean"
+ },
+ {
+ "name": "telnet",
+ "type": "boolean"
+ },
+ {
+ "name": "reconnect",
+ "type": "number"
+ },
+ {
+ "name": "nodelay",
+ "type": "boolean"
+ },
+ {
+ "name": "delay",
+ "type": "boolean"
+ },
+ {
+ "name": "server",
+ "type": "boolean"
+ },
+ {
+ "name": "wait",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv6",
+ "type": "boolean"
+ },
+ {
+ "name": "ipv4",
+ "type": "boolean"
+ },
+ {
+ "name": "to",
+ "type": "number"
+ },
+ {
+ "name": "localport",
+ "type": "string"
+ },
+ {
+ "name": "localaddr",
+ "type": "string"
+ },
+ {
+ "name": "fd",
+ "type": "string"
+ },
+ {
+ "name": "port",
+ "type": "string"
+ },
+ {
+ "name": "host",
+ "type": "string"
+ },
+ {
+ "name": "input-path",
+ "type": "string"
+ },
+ {
+ "name": "path",
+ "type": "string"
+ },
+ {
+ "name": "backend",
+ "type": "string"
+ }
+ ],
+ "option": "chardev"
+ },
+ {
+ "parameters": [
+ {
+ "name": "copy-on-read",
+ "help": "copy read data from backing file into image file",
+ "type": "boolean"
+ },
+ {
+ "name": "werror",
+ "help": "write error action",
+ "type": "string"
+ },
+ {
+ "name": "rerror",
+ "help": "read error action",
+ "type": "string"
+ },
+ {
+ "name": "read-only",
+ "help": "open drive file as read-only",
+ "type": "boolean"
+ },
+ {
+ "name": "file",
+ "help": "file name",
+ "type": "string"
+ },
+ {
+ "name": "if",
+ "help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
+ "type": "string"
+ },
+ {
+ "name": "media",
+ "help": "media type (disk, cdrom)",
+ "type": "string"
+ },
+ {
+ "name": "index",
+ "help": "index number",
+ "type": "number"
+ },
+ {
+ "name": "unit",
+ "help": "unit number (i.e. lun for scsi)",
+ "type": "number"
+ },
+ {
+ "name": "bus",
+ "help": "bus number",
+ "type": "number"
+ },
+ {
+ "name": "stats-account-failed",
+ "help": "whether to account for failed I/O operations in the statistics",
+ "type": "boolean"
+ },
+ {
+ "name": "stats-account-invalid",
+ "help": "whether to account for invalid I/O operations in the statistics",
+ "type": "boolean"
+ },
+ {
+ "name": "detect-zeroes",
+ "help": "try to optimize zero writes (off, on, unmap)",
+ "type": "string"
+ },
+ {
+ "name": "throttling.group",
+ "help": "name of the block throttling group",
+ "type": "string"
+ },
+ {
+ "name": "throttling.iops-size",
+ "help": "when limiting by iops max size of an I/O in bytes",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write-max-length",
+ "help": "length of the bps-write-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read-max-length",
+ "help": "length of the bps-read-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total-max-length",
+ "help": "length of the bps-total-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write-max-length",
+ "help": "length of the iops-write-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read-max-length",
+ "help": "length of the iops-read-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total-max-length",
+ "help": "length of the iops-total-max burst period, in seconds",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write-max",
+ "help": "total bytes write burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read-max",
+ "help": "total bytes read burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total-max",
+ "help": "total bytes burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write-max",
+ "help": "I/O operations write burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read-max",
+ "help": "I/O operations read burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total-max",
+ "help": "I/O operations burst",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-write",
+ "help": "limit write bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-read",
+ "help": "limit read bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.bps-total",
+ "help": "limit total bytes per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-write",
+ "help": "limit write operations per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-read",
+ "help": "limit read operations per second",
+ "type": "number"
+ },
+ {
+ "name": "throttling.iops-total",
+ "help": "limit total I/O operations per second",
+ "type": "number"
+ },
+ {
+ "name": "werror",
+ "help": "write error action",
+ "type": "string"
+ },
+ {
+ "name": "format",
+ "help": "disk format (raw, qcow2, ...)",
+ "type": "string"
+ },
+ {
+ "name": "cache.writeback",
+ "help": "Enable writeback mode",
+ "type": "boolean"
+ },
+ {
+ "name": "aio",
+ "help": "host AIO implementation (threads, native, io_uring)",
+ "type": "string"
+ },
+ {
+ "name": "snapshot",
+ "help": "enable/disable snapshot mode",
+ "type": "boolean"
+ },
+ {
+ "name": "force-share",
+ "help": "always accept other writers (default: off)",
+ "type": "boolean"
+ },
+ {
+ "name": "discard",
+ "help": "discard operation (ignore/off, unmap/on)",
+ "type": "string"
+ },
+ {
+ "name": "auto-read-only",
+ "help": "Node can become read-only if opening read-write fails",
+ "type": "boolean"
+ },
+ {
+ "name": "cache.no-flush",
+ "help": "Ignore flush requests",
+ "type": "boolean"
+ },
+ {
+ "name": "cache.direct",
+ "help": "Bypass software writeback cache on the host",
+ "type": "boolean"
+ },
+ {
+ "name": "driver",
+ "help": "Block driver to use for the node",
+ "type": "string"
+ },
+ {
+ "name": "node-name",
+ "help": "Node name of the block device node",
+ "type": "string"
+ }
+ ],
+ "option": "drive"
+ }
+ ],
+ "id": "libvirt-23"
+}
+
+{
+ "execute": "query-migrate-capabilities",
+ "id": "libvirt-24"
+}
+
+{
+ "return": [
+ {
+ "state": false,
+ "capability": "xbzrle"
+ },
+ {
+ "state": false,
+ "capability": "rdma-pin-all"
+ },
+ {
+ "state": false,
+ "capability": "auto-converge"
+ },
+ {
+ "state": false,
+ "capability": "zero-blocks"
+ },
+ {
+ "state": false,
+ "capability": "compress"
+ },
+ {
+ "state": false,
+ "capability": "events"
+ },
+ {
+ "state": false,
+ "capability": "postcopy-ram"
+ },
+ {
+ "state": false,
+ "capability": "x-colo"
+ },
+ {
+ "state": false,
+ "capability": "release-ram"
+ },
+ {
+ "state": false,
+ "capability": "block"
+ },
+ {
+ "state": false,
+ "capability": "return-path"
+ },
+ {
+ "state": false,
+ "capability": "pause-before-switchover"
+ },
+ {
+ "state": false,
+ "capability": "multifd"
+ },
+ {
+ "state": false,
+ "capability": "dirty-bitmaps"
+ },
+ {
+ "state": false,
+ "capability": "postcopy-blocktime"
+ },
+ {
+ "state": false,
+ "capability": "late-block-activate"
+ },
+ {
+ "state": false,
+ "capability": "x-ignore-shared"
+ },
+ {
+ "state": false,
+ "capability": "validate-uuid"
+ },
+ {
+ "state": false,
+ "capability": "background-snapshot"
+ },
+ {
+ "state": false,
+ "capability": "zero-copy-send"
+ },
+ {
+ "state": false,
+ "capability": "postcopy-preempt"
+ },
+ {
+ "state": false,
+ "capability": "switchover-ack"
+ },
+ {
+ "state": false,
+ "capability": "dirty-limit"
+ },
+ {
+ "state": false,
+ "capability": "mapped-ram"
+ }
+ ],
+ "id": "libvirt-24"
+}
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
new file mode 100644
index 0000000000..7fe971fc3a
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
@@ -0,0 +1,96 @@
+<qemuCaps>
+ <emulator>/usr/bin/qemu-system-sparc</emulator>
+ <qemuctime>0</qemuctime>
+ <selfctime>0</selfctime>
+ <selfvers>0</selfvers>
+ <flag name='sdl'/>
+ <flag name='spice'/>
+ <flag name='scsi-disk.channel'/>
+ <flag name='scsi-block'/>
+ <flag name='seccomp-sandbox'/>
+ <flag name='vnc'/>
+ <flag name='rng-random'/>
+ <flag name='rng-egd'/>
+ <flag name='migrate-rdma'/>
+ <flag name='spice-gl'/>
+ <flag name='spice-rendernode'/>
+ <flag name='chardev-reconnect'/>
+ <flag name='nbd-tls'/>
+ <flag name='pr-manager-helper'/>
+ <flag name='screendump_device'/>
+ <flag name='egl-headless'/>
+ <flag name='memory-backend-memfd'/>
+ <flag name='memory-backend-memfd.hugetlb'/>
+ <flag name='egl-headless.rendernode'/>
+ <flag name='memory-backend-file.pmem'/>
+ <flag name='nbd-bitmap'/>
+ <flag name='migration-file-drop-cache'/>
+ <flag name='dbus-vmstate'/>
+ <flag name='incremental-backup'/>
+ <flag name='drive-nvme'/>
+ <flag name='smp-dies'/>
+ <flag name='rng-builtin'/>
+ <flag name='query-named-block-nodes.flat'/>
+ <flag name='blockdev-snapshot.allow-write-only-overlay'/>
+ <flag name='blockdev-reopen'/>
+ <flag name='fsdev.multidevs'/>
+ <flag name='aio.io_uring'/>
+ <flag name='tcg'/>
+ <flag name='numa.hmat'/>
+ <flag name='block-export-add'/>
+ <flag name='netdev.vhost-vdpa'/>
+ <flag name='ncr53c90'/>
+ <flag name='memory-backend-file.x-use-canonical-path-for-ramblock-id'/>
+ <flag name='migration-param.block-bitmap-mapping'/>
+ <flag name='vnc-power-control'/>
+ <flag name='object.qapified'/>
+ <flag name='rotation-rate'/>
+ <flag name='compat-deprecated'/>
+ <flag name='input-linux'/>
+ <flag name='confidential-guest-support'/>
+ <flag name='set-action'/>
+ <flag name='memory-backend-file.reserve'/>
+ <flag name='netdev.json'/>
+ <flag name='query-dirty-rate'/>
+ <flag name='rbd-encryption'/>
+ <flag name='sev-guest-kernel-hashes'/>
+ <flag name='device.json+hotplug'/>
+ <flag name='calc-dirty-rate'/>
+ <flag name='dirtyrate-param.mode'/>
+ <flag name='blockdev.nbd.tls-hostname'/>
+ <flag name='memory-backend-file.prealloc-threads'/>
+ <flag name='chardev.qemu-vdagent'/>
+ <flag name='display-dbus'/>
+ <flag name='iothread.thread-pool-max'/>
+ <flag name='migration.blocked-reasons'/>
+ <flag name='query-stats'/>
+ <flag name='query-stats-schemas'/>
+ <flag name='thread-context'/>
+ <flag name='screenshot-format-png'/>
+ <flag name='netdev.stream'/>
+ <flag name='cryptodev-backend-lkcf'/>
+ <flag name='netdev.stream.reconnect'/>
+ <flag name='rbd-encryption-layering'/>
+ <flag name='rbd-encryption-luks-any'/>
+ <flag name='qcow2-discard-no-unref'/>
+ <flag name='run-with.async-teardown'/>
+ <flag name='virtio-blk-vhost-vdpa'/>
+ <flag name='smp-clusters'/>
+ <flag name='blockjob.backing-mask-protocol'/>
+ <flag name='display-reload'/>
+ <flag name='netdev.user'/>
+ <version>9000000</version>
+ <microcodeVersion>0</microcodeVersion>
+ <package>qemu-9.0.0-1.fc40</package>
+ <arch>sparc</arch>
+ <machine type='tcg' name='SS-5' maxCpus='1' default='yes' defaultCPU='Fujitsu-MB86904-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='SS-20' maxCpus='4' defaultCPU='TI-SuperSparc-II-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='LX' maxCpus='1' defaultCPU='TI-MicroSparc-I-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='SPARCClassic' maxCpus='1' defaultCPU='TI-MicroSparc-I-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='leon3_generic' maxCpus='4' defaultCPU='LEON3-sparc-cpu' defaultRAMid='leon3.ram' acpi='no'/>
+ <machine type='tcg' name='SPARCbook' maxCpus='1' defaultCPU='TI-MicroSparc-I-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='SS-4' maxCpus='1' defaultCPU='Fujitsu-MB86904-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='SS-600MP' maxCpus='4' defaultCPU='TI-SuperSparc-II-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='SS-10' maxCpus='4' defaultCPU='TI-SuperSparc-II-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+ <machine type='tcg' name='Voyager' maxCpus='1' defaultCPU='Fujitsu-MB86904-sparc-cpu' defaultRAMid='sun4m.ram' acpi='no'/>
+</qemuCaps>
diff --git a/tests/qemuxmlconfdata/sparc-minimal.sparc-latest.args b/tests/qemuxmlconfdata/sparc-minimal.sparc-latest.args
index b285efa615..9d09b33003 100644
--- a/tests/qemuxmlconfdata/sparc-minimal.sparc-latest.args
+++ b/tests/qemuxmlconfdata/sparc-minimal.sparc-latest.args
@@ -9,10 +9,11 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-redhat62sparc/.config \
/usr/bin/qemu-system-sparc \
-name guest=redhat62sparc,debug-threads=on \
-S \
--object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain--1-redhat62sparc/master-key.aes \
--machine SS-5,usb=off,dump-guest-core=off \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-redhat62sparc/master-key.aes"}' \
+-machine SS-5,usb=off,dump-guest-core=off,memory-backend=sun4m.ram \
-accel tcg \
-m size=512000k \
+-object '{"qom-type":"memory-backend-ram","id":"sun4m.ram","size":524288000}' \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid 00010203-0405-4607-8809-0a0b0c0d0e0f \
@@ -26,10 +27,9 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-redhat62sparc/.config \
-boot strict=on \
-blockdev '{"driver":"file","filename":"/home/berrange/VirtualMachines/redhat-6.2-sparc.img","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"qcow2","file":"libvirt-2-storage"}' \
--device scsi-hd,bus=scsi.0,scsi-id=0,device_id=drive-scsi0-0-0-0,drive=libvirt-2-format,id=scsi0-0-0-0,bootindex=1 \
--blockdev '{"driver":"file","filename":"/home/berrange/VirtualMachines/redhat-6.2-sparc.iso","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw","file":"libvirt-1-storage"}' \
--device scsi-cd,bus=scsi.0,scsi-id=1,device_id=drive-scsi0-0-0-1,drive=libvirt-1-format,id=scsi0-0-0-1 \
+-device '{"driver":"scsi-hd","bus":"scsi.0","scsi-id":0,"device_id":"drive-scsi0-0-0-0","drive":"libvirt-2-format","id":"scsi0-0-0-0","bootindex":1}' \
+-blockdev '{"driver":"file","filename":"/home/berrange/VirtualMachines/redhat-6.2-sparc.iso","node-name":"libvirt-1-storage","read-only":true}' \
+-device '{"driver":"scsi-cd","bus":"scsi.0","scsi-id":1,"device_id":"drive-scsi0-0-0-1","drive":"libvirt-1-storage","id":"scsi0-0-0-1"}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
--
2.45.2
2
1
The 10.5.0 release of both libvirt and libvirt-python is tagged and
signed tarballs are available at
https://download.libvirt.org/
https://download.libvirt.org/python/
Thanks everybody who helped with this release by sending patches,
reviewing, testing, or providing feedback. Your work is greatly
appreciated.
* New features
* Introduce SEV-SNP support
SEV-SNP is introduced as another type of ``<launchSecurity/>``. Its support
is reported in both domain capabilities and ``virt-host-validate``.
* Improvements
* tools: virt-pki-validate has been rewritten in C
The ``virt-pki-validate`` shell script has been rewritten as a C program,
providing an output format that matches ``virt-host-validate``, removing
the dependency on ``certtool`` and providing more comprehensive checks
of the certificate properties.
* qemu: implement iommu coldplug/unplug
The ``<iommu/>`` device can be now cold plugged and/or cold unplugged.
* Pass shutoff reason to release hook
Sometimes in release hook it is useful to know if the VM shutdown was
graceful or not. This is especially useful to do cleanup based on the VM
shutdown failure reason in release hook. Starting with this release the
last argument 'extra' is used to pass VM shutoff reason in the call to
release hook.
* nodedev: improve DASD detection
In newer DASD driver versions the ID_TYPE tag is supported. This tag is
missing after a system reboot but when the ccw device is set offline and
online the tag is included. To fix this version independently we need to
check if a device detected as type disk is actually a DASD to maintain the
node object consistency and not end up with multiple node objects for
DASDs.
* Bug fixes
* remote_daemon_dispatch: Unref sasl session when closing client connection
A memory leak was identified when a client started SASL but then suddenly
closed connection. This is now fixed.
* qemu: Fix migration with disabled vmx-* CPU features
Migrating a domain with some vmx-* CPU features marked as disabled could
have failed as the destination would incorrectly expect those features to
be enabled after starting QEMU.
* qemu: Fix ``libvirtd``/``virtqemud`` crash when VM shuts down during migration
The libvirt daemon could crash when a VM was shut down while being migrated
to another host.
Enjoy.
Jirka
1
0
Current ch driver supports restore only for domains without any network
configuration defined. This was because libvirt explicitly passes network fds
and CH did not had support to restore with new net FDS. This support has been
added recently, https://github.com/cloud-hypervisor/cloud-hypervisor/pull/6402
The changes in this patch series majorly include moving to socket communication
for restore api, create new net fds and pass them via SCM_RIGHTS to CH.
Purna Pavan Chandra (8):
ch: report response message instead of just code
ch: Pass net ids explicitly during vm creation
ch: refactor chProcessAddNetworkDevices
ch: poll with -1 in chSocketRecv
ch: use monitor socket fd to send restore request
ch: refactor virCHMonitorSaveVM
ch: support restore with net devices
ch: kill CH process if restore fails
src/ch/ch_driver.c | 9 +-
src/ch/ch_monitor.c | 62 +++++++-----
src/ch/ch_monitor.h | 6 +-
src/ch/ch_process.c | 225 ++++++++++++++++++++++++++++++++++----------
4 files changed, 223 insertions(+), 79 deletions(-)
--
2.34.1
3
14
There are some distributions that consider switching from SLIRP to just
passt. While libvirt wires no defaults and leaves this kind of
decisions onto upper layers, it can help mgmt apps do the decision by
reporting passt support in domain capabilities.
Michal Prívozník (8):
libvirt_private.syms: Export virDomainNetBackendType enum handlers
qemu_capabilities: Introduce QEMU_CAPS_NETDEV_USER
qemu_validate: Validate net backends against QEMU caps
domain_capabilities: Introduce netdev capabilities
qemu_capabilities: Fill supported net backend types
conf: Accept 'default' backend type for <interface type='user'/>
qemu_validate: Use domaincaps to validate supported net backend type
qemu_domain: Set 'passt' net backend if 'default' is unsupported
docs/formatdomaincaps.rst | 25 +++++++++++++++++++
src/conf/domain_capabilities.c | 13 ++++++++++
src/conf/domain_capabilities.h | 8 ++++++
src/conf/domain_conf.c | 5 +++-
src/conf/schemas/domaincaps.rng | 10 ++++++++
src/conf/schemas/domaincommon.rng | 1 +
src/libvirt_private.syms | 2 ++
src/qemu/qemu_capabilities.c | 23 +++++++++++++++++
src/qemu/qemu_capabilities.h | 4 +++
src/qemu/qemu_domain.c | 19 +++++++++++---
src/qemu/qemu_validate.c | 14 ++++++++---
.../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 5 ++++
.../qemu_4.2.0-virt.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_4.2.0.s390x.xml | 5 ++++
tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 5 ++++
.../qemu_5.0.0-tcg-virt.riscv64.xml | 5 ++++
.../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml | 5 ++++
.../qemu_5.0.0-virt.aarch64.xml | 5 ++++
.../qemu_5.0.0-virt.riscv64.xml | 5 ++++
tests/domaincapsdata/qemu_5.0.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_5.0.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_5.1.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_5.1.0-tcg.x86_64.xml | 5 ++++
tests/domaincapsdata/qemu_5.1.0.sparc.xml | 5 ++++
tests/domaincapsdata/qemu_5.1.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_5.2.0-q35.x86_64.xml | 5 ++++
.../qemu_5.2.0-tcg-virt.riscv64.xml | 5 ++++
.../domaincapsdata/qemu_5.2.0-tcg.x86_64.xml | 5 ++++
.../qemu_5.2.0-virt.aarch64.xml | 5 ++++
.../qemu_5.2.0-virt.riscv64.xml | 5 ++++
tests/domaincapsdata/qemu_5.2.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_5.2.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_5.2.0.s390x.xml | 5 ++++
tests/domaincapsdata/qemu_5.2.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.0.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.0.0-tcg.x86_64.xml | 5 ++++
.../qemu_6.0.0-virt.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_6.0.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_6.0.0.s390x.xml | 5 ++++
tests/domaincapsdata/qemu_6.0.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.1.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.1.0-tcg.x86_64.xml | 5 ++++
tests/domaincapsdata/qemu_6.1.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 5 ++++
.../qemu_6.2.0-virt.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_6.2.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 5 ++++
.../qemu_7.0.0-hvf.aarch64+hvf.xml | 5 ++++
.../domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 5 ++++
.../qemu_7.0.0-virt.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_7.0.0.aarch64.xml | 5 ++++
tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 5 ++++
.../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 5 ++++
tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 5 ++++
tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 5 ++++
.../qemu_7.2.0-hvf.x86_64+hvf.xml | 6 +++++
.../domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 6 +++++
.../qemu_7.2.0-tcg.x86_64+hvf.xml | 6 +++++
.../domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 6 +++++
tests/domaincapsdata/qemu_7.2.0.ppc.xml | 6 +++++
tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 6 +++++
.../qemu_8.0.0-tcg-virt.riscv64.xml | 6 +++++
.../domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 6 +++++
.../qemu_8.0.0-virt.riscv64.xml | 6 +++++
tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 6 +++++
tests/domaincapsdata/qemu_8.1.0.s390x.xml | 6 +++++
tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 6 +++++
.../qemu_8.2.0-tcg-virt.loongarch64.xml | 6 +++++
.../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 6 +++++
.../qemu_8.2.0-virt.aarch64.xml | 6 +++++
.../qemu_8.2.0-virt.loongarch64.xml | 6 +++++
tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 6 +++++
tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 6 +++++
tests/domaincapsdata/qemu_8.2.0.s390x.xml | 6 +++++
tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 6 +++++
tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 6 +++++
.../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 6 +++++
tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 6 +++++
.../caps_4.2.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_4.2.0_s390x.xml | 1 +
.../caps_4.2.0_x86_64.xml | 1 +
.../caps_5.0.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1 +
.../caps_5.0.0_riscv64.xml | 1 +
.../caps_5.0.0_x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_5.1.0_sparc.xml | 1 +
.../caps_5.1.0_x86_64.xml | 1 +
.../caps_5.2.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 1 +
.../caps_5.2.0_riscv64.xml | 1 +
.../qemucapabilitiesdata/caps_5.2.0_s390x.xml | 1 +
.../caps_5.2.0_x86_64.xml | 1 +
.../caps_6.0.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_6.0.0_s390x.xml | 1 +
.../caps_6.0.0_x86_64.xml | 1 +
.../caps_6.1.0_x86_64.xml | 1 +
.../caps_6.2.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 +
.../caps_6.2.0_x86_64.xml | 1 +
.../caps_7.0.0_aarch64+hvf.xml | 1 +
.../caps_7.0.0_aarch64.xml | 1 +
.../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 +
.../caps_7.0.0_x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 +
.../caps_7.1.0_x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 +
.../caps_7.2.0_x86_64+hvf.xml | 1 +
.../caps_7.2.0_x86_64.xml | 1 +
.../caps_8.0.0_riscv64.xml | 1 +
.../caps_8.0.0_x86_64.xml | 1 +
.../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 +
.../caps_8.1.0_x86_64.xml | 1 +
.../caps_8.2.0_aarch64.xml | 1 +
.../caps_8.2.0_armv7l.xml | 1 +
.../caps_8.2.0_loongarch64.xml | 1 +
.../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 +
.../caps_8.2.0_x86_64.xml | 1 +
.../caps_9.0.0_x86_64.xml | 1 +
.../caps_9.1.0_x86_64.xml | 1 +
137 files changed, 608 insertions(+), 8 deletions(-)
--
2.44.2
2
16
While changing the portgroup attribute causes incorrect
behavior, this option is disabled for hot-plug.
Resolves: https://issues.redhat.com/browse/RHEL-7299
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 4a3f4f657e..355f742535 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3884,6 +3884,13 @@ qemuDomainChangeNet(virQEMUDriver *driver,
goto cleanup;
}
+ if (newdev->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
+ STRNEQ_NULLABLE(olddev->data.network.portgroup, newdev->data.network.portgroup)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("cannot modify network device portgroup attribute"));
+ goto cleanup;
+ }
+
/* allocate new actual device to compare to old - we will need to
* free it if we fail for any reason
*/
--
2.45.2
2
1
28 Jun '24
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
NEWS.rst | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst
index 1ea98599db..5557018f33 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -65,6 +65,11 @@ v10.5.0 (unreleased)
have failed as the destination would incorrectly expect those features to
be enabled after starting QEMU.
+ * qemu: Fix ``libvirtd``/``virtqemud`` crash when VM shuts down during migration
+
+ The libvirt daemon could crash when a VM was shut down while being migrated
+ to another host.
+
v10.4.0 (2024-06-03)
====================
--
2.45.2
2
1
[PATCH] NEWS: Document features/improvements/bug fixes I've participated in
by Michal Privoznik 28 Jun '24
by Michal Privoznik 28 Jun '24
28 Jun '24
There are some features/improvements/bug fixes I've either
contributed or reviewed/merged. Document them for upcoming
release.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
NEWS.rst | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst
index bc8acc62d4..d675c869a4 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -16,6 +16,10 @@ v10.5.0 (unreleased)
* **Removed features**
* **New features**
+ * Introduce SEV-SNP support
+
+ SEV-SNP is introduced as another type of ``<launchSecurity/>``. Its support
+ is reported in both domain capabilities and ``virt-host-validate``.
* **Improvements**
@@ -26,8 +30,34 @@ v10.5.0 (unreleased)
the dependency on ``certtool`` and providing more comprehensive checks
of the certificate properties.
+ * qemu: implement iommu coldplug/unplug
+
+ The ``<iommu/>`` device can be now cold plugged and/or cold unplugged.
+
+ * Pass shutoff reason to release hook
+
+ Sometimes in release hook it is useful to know if the VM shutdown was
+ graceful or not. This is especially useful to do cleanup based on the VM
+ shutdown failure reason in release hook. String with this release the last
+ argument 'extra' is used to pass VM shutoff reason in the call to release
+ hook.
+
+ * nodedev: improve DASD detection
+
+ In newer DASD driver versions the ID_TYPE tag is supported. This tag is
+ missing after a system reboot but when the ccw device is set offline and
+ online the tag is included. To fix this version independently we need to
+ check if devices detected as type disk is actually a DASD to maintain
+ the node object consistency and not end up with multiple node objects
+ for DASDs.
+
* **Bug fixes**
+ * remote_daemon_dispatch: Unref sasl session when closing client connection
+
+ A memory leak was identified when a client started SASL but then suddenly
+ closed connection. This is now fixed.
+
v10.4.0 (2024-06-03)
====================
--
2.44.2
4
3
28 Jun '24
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
NEWS.rst | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst
index b0b893b484..1ea98599db 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -59,6 +59,12 @@ v10.5.0 (unreleased)
A memory leak was identified when a client started SASL but then suddenly
closed connection. This is now fixed.
+ * qemu: Fix migration with disabled vmx-* CPU features
+
+ Migrating a domain with some vmx-* CPU features marked as disabled could
+ have failed as the destination would incorrectly expect those features to
+ be enabled after starting QEMU.
+
v10.4.0 (2024-06-03)
====================
--
2.45.1
2
1
When enabling switchover-ack on qemu from libvirt, the .party value
was set to both source and target; however, qemuMigrationParamsCheck()
only takes that into account to validate that the remote side of the
migration supports the flag if it is marked optional or auto/always on.
In the case of switchover-ack, when enabled on only the dst and not
the src, the migration will fail if the src qemu does not support
switchover-ack, as the dst qemu will issue a switchover-ack msg:
qemu/migration/savevm.c ->
loadvm_process_command ->
migrate_send_rp_switchover_ack(mis) ->
migrate_send_rp_message(mis, MIG_RP_MSG_SWITCHOVER_ACK, 0, NULL)
Since the src qemu doesn't understand messages with header_type ==
MIG_RP_MSG_SWITCHOVER_ACK, qemu will kill the migration with error:
qemu-kvm: RP: Received invalid message 0x0007 length 0x0000
qemu-kvm: Unable to write to socket: Bad file descriptor
Looking at the original commit [1] for optional migration capabilities,
it seems that the spirit of optional handling was to enhance a given
existing capability where possible. Given that switchover-ack
exclusively depends on return-path, adding it as optional to that cap
feels right.
[1] 61e34b08568 ("qemu: Add support for optional migration capabilities")
Fixes: 1cc7737f69e ("qemu: add support for qemu switchover-ack")
Signed-off-by: Jon Kohler <jon(a)nutanix.com>
Cc: Alex Williamson <alex.williamson(a)redhat.com>
Cc: Avihai Horon <avihaih(a)nvidia.com>
Cc: Jiri Denemark <jdenemar(a)redhat.com>
Cc: Markus Armbruster <armbru(a)redhat.com>
Cc: Peter Xu <peterx(a)redhat.com>
Cc: YangHang Liu <yanghliu(a)redhat.com>
---
src/qemu/qemu_migration_params.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 9593b6ba65..98822012cc 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -210,17 +210,13 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
{.match = QEMU_MIGRATION_FLAG_FORBIDDEN,
.flag = VIR_MIGRATE_TUNNELLED,
.cap = QEMU_MIGRATION_CAP_RETURN_PATH,
+ .optional = QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
.party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
{.match = QEMU_MIGRATION_FLAG_REQUIRED,
.flag = VIR_MIGRATE_ZEROCOPY,
.cap = QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
.party = QEMU_MIGRATION_SOURCE},
-
- {.match = QEMU_MIGRATION_FLAG_FORBIDDEN,
- .flag = VIR_MIGRATE_TUNNELLED,
- .cap = QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
- .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
};
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to
--
2.43.0
2
1
[libvirt PATCH] vircgroup: fix g_variant_new_parsed format string causing abort
by Pavel Hrdina 28 Jun '24
by Pavel Hrdina 28 Jun '24
28 Jun '24
The original code was incorrect and never tested because at the time of
implementing it the cgroup file `io.weight` was not available.
Resolves: https://issues.redhat.com/browse/RHEL-45185
Introduced-by: 9c1693eff427661616ce1bd2795688f87288a412
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/util/vircgroupv1.c | 2 +-
src/util/vircgroupv2.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
index 77c7e209ce..c1f0562249 100644
--- a/src/util/vircgroupv1.c
+++ b/src/util/vircgroupv1.c
@@ -1225,7 +1225,7 @@ virCgroupV1SetBlkioDeviceWeight(virCgroup *group,
if (group->unitName) {
GVariant *value = NULL;
- value = g_variant_new_parsed("[(%s, uint64 %u)]", path, weight);
+ value = g_variant_new_parsed("[(%s, %t)]", path, weight);
return virCgroupSetValueDBus(group->unitName, "BlockIODeviceWeight", value);
} else {
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index db115e25f7..eaf5ae98f6 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -867,7 +867,7 @@ virCgroupV2SetBlkioDeviceWeight(virCgroup *group,
if (group->unitName) {
GVariant *value = NULL;
- value = g_variant_new_parsed("[(%s, uint64 %u)]", path, weight);
+ value = g_variant_new_parsed("[(%s, %t)]", path, weight);
return virCgroupSetValueDBus(group->unitName, "IODeviceWeight", value);
} else {
--
2.45.2
2
1
I have just tagged v10.5.0-rc1 in the repository and pushed signed
tarballs to https://download.libvirt.org/
Please give the release candidate some testing and in case you find a
serious issue which should have a fix in the upcoming release, feel
free to reply to this thread to make sure the issue is more visible.
If you have not done so yet, please update NEWS.rst to document any
significant change you made since the last release.
Thanks,
Jirka
1
1
27 Jun '24
This series of rfc patches adds support for loading the RSS eBPF
program and passing it to the QEMU.
Comments and suggestions would be useful.
QEMU with vhost may work with RSS through eBPF. To load eBPF,
the capabilities required that Libvirt may provide.
eBPF program and maps may be unique for particular QEMU and
Libvirt retrieves eBPF through qapi.
For now, there is only "RSS" eBPF object in QEMU, in the future,
there may be another one(g.e. network filters).
That's why in Libvirt added logic to load and store any
eBPF object that QEMU provides using qapi schema.
One of the reasons why this series of patches is in RFC are tests.
To this series of patches, the tests were added.
For now, the tests are synthetic, the proper "reply" file should
be generated with a new "caps" file. Currently, there are changes
in caps-9.0.0* files. There was added support for ebpf_rss_fds feature,
and request-ebpf command.
Also, there was added new config for qemuConfig - allowEBPF.
This config allows to enable/disable eBPF blob loading explicitly.
This is required for qemuxmlconf tests - where some test expects that
RSS would not support eBPF.
So, overall, the tests are required for review, comment, and discussion
how we want them to be implemented in the future.
For virtio-net RSS, the document has not changed.
```
<interface type="network">
<model type="virtio"/>
<driver queues="4" rss="on" rss_hash_report="off"/>
<interface type="network">
```
Simplified routine for RSS:
* Libvirt retrieves eBPF "RSS" and load it.
* Libvirt passes file descriptors to virtio-net with property "ebpf_rss_fds" ("rss" property should be "on" too).
* if fds was provided - QEMU using eBPF RSS implementation.
* if fds was not provided - QEMU tries to load eBPF RSS in own context and use it.
* if eBPF RSS was not loaded - QEMU uses "in-qemu" RSS(vhost not supported).
Changes since RFC v2:
* refactored and rebased.
* applied changes according to the Qemu.
* added basic test.
Changes since RFC v1:
* changed eBPF format saved in the XML cache.
* refactored and checked with syntax test.
* refactored patch hunks.
Andrew Melnychenko (6):
qemu_monitor: Added QEMU's "request-ebpf" support.
qemu_capabilities: Added logic for retrieving eBPF objects from QEMU.
qemu_interface: Added routine for loading the eBPF objects.
qemu_command: Added "ebpf_rss_fds" support for virtio-net.
qemu_conf: Added configuration to optionally disable eBPF loading.
tests: Added tests for eBPF blob loading.
meson.build | 7 +
meson_options.txt | 1 +
src/qemu/meson.build | 1 +
src/qemu/qemu_capabilities.c | 126 +++++++++++
src/qemu/qemu_capabilities.h | 6 +
src/qemu/qemu_command.c | 63 ++++++
src/qemu/qemu_conf.c | 2 +
src/qemu/qemu_conf.h | 2 +
src/qemu/qemu_domain.c | 4 +
src/qemu/qemu_domain.h | 3 +
src/qemu/qemu_interface.c | 83 ++++++++
src/qemu/qemu_interface.h | 4 +
src/qemu/qemu_monitor.c | 13 ++
src/qemu/qemu_monitor.h | 3 +
src/qemu/qemu_monitor_json.c | 26 +++
src/qemu/qemu_monitor_json.h | 3 +
.../caps_9.0.0_x86_64.replies | 199 ++++++++++--------
.../caps_9.0.0_x86_64.xml | 4 +
tests/qemuxml2argvmock.c | 21 ++
.../net-virtio-rss-bpf.x86_64-latest.args | 37 ++++
.../net-virtio-rss-bpf.x86_64-latest.xml | 46 ++++
tests/qemuxmlconfdata/net-virtio-rss-bpf.xml | 46 ++++
tests/qemuxmlconftest.c | 4 +
23 files changed, 612 insertions(+), 92 deletions(-)
create mode 100644 tests/qemuxmlconfdata/net-virtio-rss-bpf.x86_64-latest.args
create mode 100644 tests/qemuxmlconfdata/net-virtio-rss-bpf.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/net-virtio-rss-bpf.xml
--
2.44.0
3
19
[PATCH v2] security_manager: Ensure top lock is acquired before nested locks
by hongmianquan 27 Jun '24
by hongmianquan 27 Jun '24
27 Jun '24
Fix libvirtd hang since fork() was called while another thread had
security manager locked.
We have the stack security driver, which internally manages other security drivers,
just call them "top" and "nested".
We call virSecurityStackPreFork() to lock the top one, and it also locks
and then unlocks the nested drivers prior to fork. Then in qemuSecurityPostFork(),
it unlocks the top one, but not the nested ones. Thus, if one of the nested
drivers ("dac" or "selinux") is still locked, it will cause a deadlock.
We discovered this case: the nested list obtained through the qemuSecurityGetNested()
will be locked for subsequent use, such as in virQEMUDriverCreateCapabilities(),
where the nested list is locked using qemuSecurityGetDOI, but the top one is not locked beforehand.
The problem stack is as follows:
libvirtd thread1 libvirtd thread2 child libvirtd
| | |
| | |
virsh capabilities qemuProcessLanuch |
| | |
| lock top |
| | |
lock nested | |
| | |
| fork------------------->|(nested lock held by thread1)
| | |
| | |
unlock nested unlock top unlock top
|
|
qemuSecuritySetSocketLabel
|
|
lock nested (deadlock)
In this commit, we ensure that the top lock is acquired before the nested lock,
so during fork, it's not possible for another task to acquire the nested lock.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1303031
Signed-off-by: hongmianquan <hongmianquan(a)bytedance.com>
---
src/libvirt_private.syms | 3 ++-
src/qemu/qemu_conf.c | 9 ++++++++-
src/qemu/qemu_driver.c | 16 +++++++++-------
src/qemu/qemu_security.h | 2 ++
src/security/security_manager.c | 22 ++++++++++++++++++++++
src/security/security_manager.h | 2 ++
6 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index bac4a8a366..39cdb90772 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1806,7 +1806,8 @@ virSecurityManagerTransactionAbort;
virSecurityManagerTransactionCommit;
virSecurityManagerTransactionStart;
virSecurityManagerVerify;
-
+virSecurityManagerStackLock;
+virSecurityManagerStackUnlock;
# security/security_util.h
virSecurityXATTRNamespaceDefined;
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 4050a82341..21f0739fd5 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1380,6 +1380,9 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
return NULL;
}
+ /* Ensure top lock is acquired before nested locks */
+ qemuSecurityStackLock(driver->securityManager);
+
/* access sec drivers and create a sec model for each one */
if (!(sec_managers = qemuSecurityGetNested(driver->securityManager)))
return NULL;
@@ -1402,8 +1405,10 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
lbl = qemuSecurityGetBaseLabel(sec_managers[i], virtTypes[j]);
type = virDomainVirtTypeToString(virtTypes[j]);
if (lbl &&
- virCapabilitiesHostSecModelAddBaseLabel(sm, type, lbl) < 0)
+ virCapabilitiesHostSecModelAddBaseLabel(sm, type, lbl) < 0) {
+ qemuSecurityStackUnlock(driver->securityManager);
return NULL;
+ }
}
VIR_DEBUG("Initialized caps for security driver \"%s\" with "
@@ -1412,6 +1417,8 @@ virCaps *virQEMUDriverCreateCapabilities(virQEMUDriver *driver)
caps->host.numa = virCapabilitiesHostNUMANewHost();
caps->host.cpu = virQEMUDriverGetHostCPU(driver);
+
+ qemuSecurityStackUnlock(driver->securityManager);
return g_steal_pointer(&caps);
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fc1704f4fc..c980a0990f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -560,7 +560,6 @@ qemuStateInitialize(bool privileged,
bool autostart = true;
size_t i;
const char *defsecmodel = NULL;
- g_autofree virSecurityManager **sec_managers = NULL;
g_autoptr(virIdentity) identity = virIdentityGetCurrent();
qemu_driver = g_new0(virQEMUDriver, 1);
@@ -835,11 +834,8 @@ qemuStateInitialize(bool privileged,
if (!qemu_driver->qemuCapsCache)
goto error;
- if (!(sec_managers = qemuSecurityGetNested(qemu_driver->securityManager)))
- goto error;
-
- if (sec_managers[0] != NULL)
- defsecmodel = qemuSecurityGetModel(sec_managers[0]);
+ if (qemu_driver->securityManager != NULL)
+ defsecmodel = qemuSecurityGetModel(qemu_driver->securityManager);
if (!(qemu_driver->xmlopt = virQEMUDriverCreateXMLConf(qemu_driver,
defsecmodel)))
@@ -5663,7 +5659,12 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom,
ret = 0;
} else {
int len = 0;
- virSecurityManager ** mgrs = qemuSecurityGetNested(driver->securityManager);
+ virSecurityManager ** mgrs = NULL;
+
+ /* Ensure top lock is acquired before nested locks */
+ qemuSecurityStackLock(driver->securityManager);
+
+ mgrs = qemuSecurityGetNested(driver->securityManager);
if (!mgrs)
goto cleanup;
@@ -5688,6 +5689,7 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom,
}
cleanup:
+ qemuSecurityStackUnlock(driver->securityManager);
virDomainObjEndAPI(&vm);
return ret;
}
diff --git a/src/qemu/qemu_security.h b/src/qemu/qemu_security.h
index 41da33debc..19fcb3c939 100644
--- a/src/qemu/qemu_security.h
+++ b/src/qemu/qemu_security.h
@@ -151,3 +151,5 @@ int qemuSecurityCommandRun(virQEMUDriver *driver,
#define qemuSecuritySetTapFDLabel virSecurityManagerSetTapFDLabel
#define qemuSecurityStackAddNested virSecurityManagerStackAddNested
#define qemuSecurityVerify virSecurityManagerVerify
+#define qemuSecurityStackLock virSecurityManagerStackLock
+#define qemuSecurityStackUnlock virSecurityManagerStackUnlock
\ No newline at end of file
diff --git a/src/security/security_manager.c b/src/security/security_manager.c
index 24f2f3d3dc..c49c4f708f 100644
--- a/src/security/security_manager.c
+++ b/src/security/security_manager.c
@@ -989,6 +989,28 @@ virSecurityManagerGetNested(virSecurityManager *mgr)
return list;
}
+/*
+ * Usually called before virSecurityManagerGetNested().
+ * We need to ensure locking the stack security manager before
+ * locking the nested security manager to maintain the correct
+ * synchronization state.
+ * It must be followed by a call virSecurityManagerStackUnlock().
+ */
+void
+virSecurityManagerStackLock(virSecurityManager *mgr)
+{
+ if (STREQ("stack", mgr->drv->name))
+ virObjectLock(mgr);
+}
+
+
+void
+virSecurityManagerStackUnlock(virSecurityManager *mgr)
+{
+ if (STREQ("stack", mgr->drv->name))
+ virObjectUnlock(mgr);
+}
+
/**
* virSecurityManagerDomainSetPathLabel:
diff --git a/src/security/security_manager.h b/src/security/security_manager.h
index a416af3215..bb6d22bc31 100644
--- a/src/security/security_manager.h
+++ b/src/security/security_manager.h
@@ -158,6 +158,8 @@ int virSecurityManagerSetTapFDLabel(virSecurityManager *mgr,
char *virSecurityManagerGetMountOptions(virSecurityManager *mgr,
virDomainDef *vm);
virSecurityManager ** virSecurityManagerGetNested(virSecurityManager *mgr);
+void virSecurityManagerStackLock(virSecurityManager *mgr);
+void virSecurityManagerStackUnlock(virSecurityManager *mgr);
typedef enum {
VIR_SECURITY_DOMAIN_IMAGE_LABEL_BACKING_CHAIN = 1 << 0,
--
2.11.0
1
0
Any modification of iothreads attribute is prohibit, the original setup
must be identical with updated version of xml.
Resolves: https://issues.redhat.com/browse/RHEL-23607
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/qemu/qemu_domain.c | 47 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 1a90311ca5..6d7b939a31 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -8484,6 +8484,53 @@ qemuDomainDiskChangeSupported(virDomainDiskDef *disk,
CHECK_EQ(discard, "discard", true);
CHECK_EQ(iothread, "iothread", true);
+ /* check if new or original disk contains iothreads information
+ * if yes, they must be identical, any changes are prohibit*/
+
+ if (!!disk->iothreads != !!orig_disk->iothreads) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("cannot modify field '%1$s' of the disk"),
+ "iothreads");
+ return false;
+ }
+
+ if (disk->iothreads && orig_disk->iothreads) {
+ GSList *n, *m;
+
+ m = disk->iothreads;
+
+ for (n = orig_disk->iothreads; n; n = n->next) {
+ size_t i;
+ virDomainDiskIothreadDef *n_data = (virDomainDiskIothreadDef *) n->data;
+ virDomainDiskIothreadDef *m_data = (virDomainDiskIothreadDef *) m->data;
+
+ if (n_data->id != m_data->id || n_data->nqueues != m_data->nqueues) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("cannot modify field '%1$s' of the disk"),
+ "iothreads");
+ return false;
+ }
+
+ for (i = 0; i < n_data->nqueues; i++) {
+ if (n_data->queues[i] != m_data->queues[i]) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("cannot modify field '%1$s' of the disk"),
+ "iothreads");
+ return false;
+ }
+ }
+
+ m = m->next;
+
+ if (!m && n->next) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("cannot modify field '%1$s' of the disk"),
+ "iothreads");
+ return false;
+ }
+ }
+ }
+
CHECK_STREQ_NULLABLE(domain_name,
"backenddomain");
--
2.45.2
1
0
[libvirt RFC PATCH 0/2] qemu: do not use deprecated options for new virtiofsd
by Ján Tomko 25 Jun '24
by Ján Tomko 25 Jun '24
25 Jun '24
Depends on https://gitlab.com/virtio-fs/virtiofsd/-/merge_requests/231
Ján Tomko (2):
qemu: fill capabilities for virtiofsd
qemu: do not use deprecated options for new virtiofsd
src/conf/domain_conf.h | 1 +
src/qemu/qemu_vhost_user.c | 59 +++++++++++++++++++++++++
src/qemu/qemu_vhost_user.h | 12 ++++++
src/qemu/qemu_virtiofs.c | 88 ++++++++++++++++++++++++++------------
4 files changed, 132 insertions(+), 28 deletions(-)
--
2.45.2
1
2
25 Jun '24
This is a promised follow up to:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/7QQ…
Michal Prívozník (8):
libvirt_private.syms: Export virDomainLaunchSecurity enum handlers
qemuxmlconftest; Explicitly enable QEMU_CAPS_SEV_SNP_GUEST for
"launch-security-sev-snp"
qemu_capabilities: Probe SEV capabilities even for
QEMU_CAPS_SEV_SNP_GUEST
domcaps: Report launchSecurity
qemu: Fill launchSecurity in domaincaps
qemu_validate: Use domaincaps to validate supported launchSecurity
type
virt-host-validate: Move AMD SEV into a separate func
virt-host-validate: Detect SEV-ES and SEV-SNP
docs/formatdomaincaps.rst | 10 +++
src/conf/domain_capabilities.c | 14 ++++
src/conf/domain_capabilities.h | 9 ++
src/conf/schemas/domaincaps.rng | 10 +++
src/libvirt_private.syms | 2 +
src/qemu/qemu_capabilities.c | 24 +++++-
src/qemu/qemu_capabilities.h | 3 +
src/qemu/qemu_validate.c | 29 +++----
.../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 3 +
.../qemu_4.2.0-virt.aarch64.xml | 3 +
tests/domaincapsdata/qemu_4.2.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_4.2.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_4.2.0.s390x.xml | 3 +
tests/domaincapsdata/qemu_4.2.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_5.0.0-q35.x86_64.xml | 3 +
.../qemu_5.0.0-tcg-virt.riscv64.xml | 3 +
.../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml | 3 +
.../qemu_5.0.0-virt.aarch64.xml | 3 +
.../qemu_5.0.0-virt.riscv64.xml | 3 +
tests/domaincapsdata/qemu_5.0.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_5.0.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_5.0.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_5.1.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_5.1.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_5.1.0.sparc.xml | 3 +
tests/domaincapsdata/qemu_5.1.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_5.2.0-q35.x86_64.xml | 3 +
.../qemu_5.2.0-tcg-virt.riscv64.xml | 3 +
.../domaincapsdata/qemu_5.2.0-tcg.x86_64.xml | 3 +
.../qemu_5.2.0-virt.aarch64.xml | 3 +
.../qemu_5.2.0-virt.riscv64.xml | 3 +
tests/domaincapsdata/qemu_5.2.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_5.2.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_5.2.0.s390x.xml | 3 +
tests/domaincapsdata/qemu_5.2.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_6.0.0-q35.x86_64.xml | 5 ++
.../domaincapsdata/qemu_6.0.0-tcg.x86_64.xml | 5 ++
.../qemu_6.0.0-virt.aarch64.xml | 3 +
tests/domaincapsdata/qemu_6.0.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_6.0.0.s390x.xml | 5 ++
tests/domaincapsdata/qemu_6.0.0.x86_64.xml | 5 ++
.../domaincapsdata/qemu_6.1.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_6.1.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_6.1.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_6.2.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml | 3 +
.../qemu_6.2.0-virt.aarch64.xml | 3 +
tests/domaincapsdata/qemu_6.2.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_6.2.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_6.2.0.x86_64.xml | 3 +
.../qemu_7.0.0-hvf.aarch64+hvf.xml | 3 +
.../domaincapsdata/qemu_7.0.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml | 3 +
.../qemu_7.0.0-virt.aarch64.xml | 3 +
tests/domaincapsdata/qemu_7.0.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_7.0.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_7.0.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_7.1.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_7.1.0.ppc64.xml | 3 +
tests/domaincapsdata/qemu_7.1.0.x86_64.xml | 3 +
.../qemu_7.2.0-hvf.x86_64+hvf.xml | 3 +
.../domaincapsdata/qemu_7.2.0-q35.x86_64.xml | 3 +
.../qemu_7.2.0-tcg.x86_64+hvf.xml | 3 +
.../domaincapsdata/qemu_7.2.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_7.2.0.ppc.xml | 3 +
tests/domaincapsdata/qemu_7.2.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_8.0.0-q35.x86_64.xml | 3 +
.../qemu_8.0.0-tcg-virt.riscv64.xml | 3 +
.../domaincapsdata/qemu_8.0.0-tcg.x86_64.xml | 3 +
.../qemu_8.0.0-virt.riscv64.xml | 3 +
tests/domaincapsdata/qemu_8.0.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_8.1.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_8.1.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_8.1.0.s390x.xml | 5 ++
tests/domaincapsdata/qemu_8.1.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_8.2.0-q35.x86_64.xml | 3 +
.../qemu_8.2.0-tcg-virt.loongarch64.xml | 3 +
.../domaincapsdata/qemu_8.2.0-tcg.x86_64.xml | 3 +
.../qemu_8.2.0-virt.aarch64.xml | 3 +
.../qemu_8.2.0-virt.loongarch64.xml | 3 +
tests/domaincapsdata/qemu_8.2.0.aarch64.xml | 3 +
tests/domaincapsdata/qemu_8.2.0.armv7l.xml | 3 +
tests/domaincapsdata/qemu_8.2.0.s390x.xml | 5 ++
tests/domaincapsdata/qemu_8.2.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_9.0.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_9.0.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_9.0.0.x86_64.xml | 3 +
.../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 3 +
.../domaincapsdata/qemu_9.1.0-tcg.x86_64.xml | 3 +
tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 3 +
.../caps_9.1.0_x86_64.xml | 1 -
tests/qemuxmlconftest.c | 6 +-
tools/virt-host-validate-common.c | 83 ++++++++++++++-----
95 files changed, 413 insertions(+), 42 deletions(-)
--
2.44.2
3
12
[PATCH 0/2] qemu_command: Enable sev-guest.legacy-vm-type when possible
by Michal Privoznik 25 Jun '24
by Michal Privoznik 25 Jun '24
25 Jun '24
*** IMPORTANT ***
There's a competing patch sent to qemu-devel which when merged renders
these patches unnecessary:
https://mail.gnu.org/archive/html/qemu-devel/2024-06/msg02776.html
But I accumulated this change whilst working on previous patches that
enabled SEV SNP and figured might as well send them if QEMU patch
doesn't make it in time for our release.
Michal Prívozník (2):
qemu_capabilities: Introduce QEMU_CAPS_SEV_GUEST_LEGACY_VM_TYPE
qemu_command: Enable sev-guest.legacy-vm-type when possible
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 9 +++++++++
tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 +
.../launch-security-sev-direct.x86_64-latest.args | 2 +-
5 files changed, 14 insertions(+), 1 deletion(-)
--
2.44.2
1
2
25 Jun '24
An iSCSI device with zero hosts will result in a segmentation fault. This patch
adds a check for the number of hosts, which must be one in the case of iSCSI.
Minimal reproducing XML:
<domain type='qemu'>
<name>MyGuest</name>
<uuid>4dea22b3-1d52-d8f3-2516-782e98ab3fa0</uuid>
<os>
<type arch='x86_64'>hvm</type>
</os>
<memory>4096</memory>
<devices>
<disk type='network'>
<source name='dummy' protocol='iscsi'/>
<target dev='vda'/>
</disk>
</devices>
</domain>
Signed-off-by: Rayhan Faizel <rayhan.faizel(a)gmail.com>
---
This crashing XML was detected by the WIP fuzzer which is being developed
as part of Google Summer of Code 2024.
[Changes in v2]
- Added testcase for iSCSI disk definitions with zero hosts
src/qemu/qemu_block.c | 6 ++++
...iscsi-zero-hosts-invalid.x86_64-latest.err | 1 +
...iscsi-zero-hosts-invalid.x86_64-latest.xml | 35 +++++++++++++++++++
.../disk-network-iscsi-zero-hosts-invalid.xml | 27 ++++++++++++++
tests/qemuxmlconftest.c | 2 ++
5 files changed, 71 insertions(+)
create mode 100644 tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.err
create mode 100644 tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.xml
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index 738b72d7ea..d6cdf521c4 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -602,6 +602,12 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSource *src,
* }
*/
+ if (src->nhosts != 1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("iSCSI protocol accepts only one host"));
+ return NULL;
+ }
+
target = g_strdup(src->path);
/* Separate the target and lun */
diff --git a/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.err b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.err
new file mode 100644
index 0000000000..ec66bebf22
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.err
@@ -0,0 +1 @@
+internal error: iSCSI protocol accepts only one host
diff --git a/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.xml b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.xml
new file mode 100644
index 0000000000..ad556180ab
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.x86_64-latest.xml
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='network' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1'/>
+ <target dev='vda' bus='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </disk>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+ </controller>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <audio id='1' type='none'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.xml b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.xml
new file mode 100644
index 0000000000..6369f01644
--- /dev/null
+++ b/tests/qemuxmlconfdata/disk-network-iscsi-zero-hosts-invalid.xml
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <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='network' device='disk'>
+ <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1'/>
+ <target dev='vda' bus='virtio'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 2842b44b3e..0c71db1f22 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2987,6 +2987,8 @@ mymain(void)
DO_TEST_CAPS_LATEST("net-usb")
DO_TEST_CAPS_LATEST("sound-device-virtio")
+ DO_TEST_CAPS_LATEST_FAILURE("disk-network-iscsi-zero-hosts-invalid")
+
/* check that all input files were actually used here */
if (testConfXMLCheck(existingTestCases) < 0)
ret = -1;
--
2.34.1
2
3
Add plumbing for QEMU's switchover-ack migration capability, which
helps lower the downtime during VFIO migrations. This capability is
enabled by default as long as both the source and destination support
it.
Note: switchover-ack depends on the return path capability, so this may
not be used when VIR_MIGRATE_TUNNELLED flag is set.
Extensive details about the qemu switchover-ack implementation are
available in the qemu series v6 cover letter [1] where the highlight is
the extreme reduction in guest visible downtime. In addition to the
original test results below, I saw a roughly ~20% reduction in downtime
for VFIO VGPU devices at minimum.
=== Test results ===
The below table shows the downtime of two identical migrations. In the
first migration swithcover ack is disabled and in the second it is
enabled. The migrated VM is assigned with a mlx5 VFIO device which has
300MB of device data to be migrated.
+----------------------+-----------------------+----------+
| Switchover ack | VFIO device data size | Downtime |
+----------------------+-----------------------+----------+
| Disabled | 300MB | 1900ms |
| Enabled | 300MB | 420ms |
+----------------------+-----------------------+----------+
Switchover ack gives a roughly 4.5 times improvement in downtime.
The 1480ms difference is time that is used for resource allocation for
the VFIO device in the destination. Without switchover ack, this time is
spent when the source VM is stopped and thus the downtime is much
higher. With switchover ack, the time is spent when the source VM is
still running.
[1] https://patchwork.kernel.org/project/qemu-devel/cover/20230621111201.29729-…
Signed-off-by: Jon Kohler <jon(a)nutanix.com>
Cc: Alex Williamson <alex.williamson(a)redhat.com>
Cc: Avihai Horon <avihaih(a)nvidia.com>
Cc: Markus Armbruster <armbru(a)redhat.com>
Cc: Peter Xu <peterx(a)redhat.com>
Cc: YangHang Liu <yanghliu(a)redhat.com>
---
v1
- https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/2XCW…
v1 -> v2:
- Addressed comments to simplify approach (Daniel, Jiri)
---
src/qemu/qemu_migration.h | 1 +
src/qemu/qemu_migration_params.c | 8 +++++++-
src/qemu/qemu_migration_params.h | 1 +
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index ed62fd4a91..cd89e100e1 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -62,6 +62,7 @@
VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES | \
VIR_MIGRATE_POSTCOPY_RESUME | \
VIR_MIGRATE_ZEROCOPY | \
+ VIR_MIGRATE_SWITCHOVER_ACK | \
0)
/* All supported migration parameters and their types. */
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 48f8657f71..9593b6ba65 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -105,6 +105,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability,
"return-path",
"zero-copy-send",
"postcopy-preempt",
+ "switchover-ack",
);
@@ -138,7 +139,7 @@ struct _qemuMigrationParamsAlwaysOnItem {
typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem;
struct _qemuMigrationParamsFlagMapItem {
/* Describes what to do with the capability if @flag is found.
- * When se to QEMU_MIGRATION_FLAG_REQUIRED, the capability will be
+ * When set to QEMU_MIGRATION_FLAG_REQUIRED, the capability will be
* enabled iff the specified migration flag is enabled. On the other hand
* QEMU_MIGRATION_FLAG_FORBIDDEN will enable the capability as long as
* the specified migration flag is not enabled. */
@@ -215,6 +216,11 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
.flag = VIR_MIGRATE_ZEROCOPY,
.cap = QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
.party = QEMU_MIGRATION_SOURCE},
+
+ {.match = QEMU_MIGRATION_FLAG_FORBIDDEN,
+ .flag = VIR_MIGRATE_TUNNELLED,
+ .cap = QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
+ .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
};
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 91bc6792cd..df67f1fb92 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -41,6 +41,7 @@ typedef enum {
QEMU_MIGRATION_CAP_RETURN_PATH,
QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT,
+ QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
QEMU_MIGRATION_CAP_LAST
} qemuMigrationCapability;
--
2.43.0
2
1
When starting a domain on a host which lacks a vmx-* CPU feature which
is expected to be enabled by the CPU model specified in the domain XML,
libvirt properly marks such feature as disabled in the active domain
XML. But migrating the domain to a similar host which lacks the same
vmx-* feature will fail with libvirt reporting the feature as missing.
This is because of a bug in the hack ensuring backward compatibility
libvirt running on the destination thinks the missing feature is
expected to be enabled.
https://issues.redhat.com/browse/RHEL-40899
Fixes: v10.1.0-85-g5fbfa5ab8a
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/cpu/cpu_x86.c | 44 +++++++++++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 17 deletions(-)
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 7a70eed9e7..fcbce0ec46 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -3021,10 +3021,7 @@ virCPUx86UpdateLive(virCPUDef *cpu,
if (!(map = virCPUx86GetMap()))
return -1;
- if (!(model = x86ModelFromCPU(cpu, map, -1)))
- return -1;
-
- if (hostPassthrough &&
+ if (!(model = x86ModelFromCPU(cpu, map, -1)) ||
!(modelDisabled = x86ModelFromCPU(cpu, map, VIR_CPU_FEATURE_DISABLE)))
return -1;
@@ -3037,12 +3034,19 @@ virCPUx86UpdateLive(virCPUDef *cpu,
for (i = 0; i < map->nfeatures; i++) {
virCPUx86Feature *feature = map->features[i];
virCPUFeaturePolicy expected = VIR_CPU_FEATURE_LAST;
+ bool explicit = false;
+ bool ignore = false;
- if (x86DataIsSubset(&model->data, &feature->data))
+ if (x86DataIsSubset(&model->data, &feature->data)) {
+ explicit = true;
expected = VIR_CPU_FEATURE_REQUIRE;
- else if (!hostPassthrough ||
- x86DataIsSubset(&modelDisabled->data, &feature->data))
+ } else if (x86DataIsSubset(&modelDisabled->data, &feature->data)) {
+ explicit = true;
+ expected = VIR_CPU_FEATURE_DISABLE;
+ } else if (!hostPassthrough) {
+ /* implicitly disabled */
expected = VIR_CPU_FEATURE_DISABLE;
+ }
if (x86DataIsSubset(&enabled, &feature->data) &&
x86DataIsSubset(&disabled, &feature->data)) {
@@ -3052,30 +3056,36 @@ virCPUx86UpdateLive(virCPUDef *cpu,
return -1;
}
+ /* Features enabled or disabled by the hypervisor are ignored by
+ * check='full' in case they were added to the model later and not
+ * explicitly mentioned in the CPU definition. This matches how libvirt
+ * behaved before the features were added.
+ */
+ if (!explicit &&
+ g_strv_contains((const char **) model->addedFeatures, feature->name))
+ ignore = true;
+
if (expected == VIR_CPU_FEATURE_DISABLE &&
x86DataIsSubset(&enabled, &feature->data)) {
VIR_DEBUG("Feature '%s' enabled by the hypervisor", feature->name);
- /* Extra features enabled by the hypervisor are ignored by
- * check='full' in case they were added to the model later for
- * backward compatibility with the older definition of the model.
- */
- if (cpu->check == VIR_CPU_CHECK_FULL &&
- !g_strv_contains((const char **) model->addedFeatures, feature->name)) {
+ if (cpu->check == VIR_CPU_CHECK_FULL && !ignore)
virBufferAsprintf(&bufAdded, "%s,", feature->name);
- } else {
+ else
virCPUDefUpdateFeature(cpu, feature->name, VIR_CPU_FEATURE_REQUIRE);
- }
}
if (x86DataIsSubset(&disabled, &feature->data) ||
(expected == VIR_CPU_FEATURE_REQUIRE &&
!x86DataIsSubset(&enabled, &feature->data))) {
VIR_DEBUG("Feature '%s' disabled by the hypervisor", feature->name);
- if (cpu->check == VIR_CPU_CHECK_FULL)
+
+ if (cpu->check == VIR_CPU_CHECK_FULL && !ignore) {
virBufferAsprintf(&bufRemoved, "%s,", feature->name);
- else
+ } else {
virCPUDefUpdateFeature(cpu, feature->name, VIR_CPU_FEATURE_DISABLE);
+ x86DataSubtract(&disabled, &feature->data);
+ }
}
}
--
2.45.1
2
1
Add plumbing for QEMU's switchover-ack migration capability, which
helps lower the downtime during VFIO migrations. This capability is
enabled by default as long as both the source and destination support
it.
Note: switchover-ack depends on the return path capability, so this may
not be used when VIR_MIGRATE_TUNNELLED flag is set.
Extensive details about the qemu switchover-ack implementation are
available in the qemu series v6 cover letter [1] where the highlight is
the extreme reduction in guest visible downtime. In addition to the
original test results below, I saw a roughly ~20% reduction in downtime
for VFIO VGPU devices at minimum.
=== Test results ===
The below table shows the downtime of two identical migrations. In the
first migration swithcover ack is disabled and in the second it is
enabled. The migrated VM is assigned with a mlx5 VFIO device which has
300MB of device data to be migrated.
+----------------------+-----------------------+----------+
| Switchover ack | VFIO device data size | Downtime |
+----------------------+-----------------------+----------+
| Disabled | 300MB | 1900ms |
| Enabled | 300MB | 420ms |
+----------------------+-----------------------+----------+
Switchover ack gives a roughly 4.5 times improvement in downtime.
The 1480ms difference is time that is used for resource allocation for
the VFIO device in the destination. Without switchover ack, this time is
spent when the source VM is stopped and thus the downtime is much
higher. With switchover ack, the time is spent when the source VM is
still running.
[1] https://patchwork.kernel.org/project/qemu-devel/cover/20230621111201.29729-…
Signed-off-by: Jon Kohler <jon(a)nutanix.com>
Cc: Alex Williamson <alex.williamson(a)redhat.com>
Cc: Avihai Horon <avihaih(a)nvidia.com>
Cc: Markus Armbruster <armbru(a)redhat.com>
Cc: Peter Xu <peterx(a)redhat.com>
Cc: YangHang Liu <yanghliu(a)redhat.com>
---
include/libvirt/libvirt-domain.h | 11 +++++++++++
src/libvirt-domain.c | 20 ++++++++++++++++++++
src/qemu/qemu_migration.h | 1 +
src/qemu/qemu_migration_params.c | 8 +++++++-
src/qemu/qemu_migration_params.h | 1 +
5 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 2f5b01bbfe..9543629f30 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1100,6 +1100,17 @@ typedef enum {
* Since: 8.5.0
*/
VIR_MIGRATE_ZEROCOPY = (1 << 20),
+
+ /* Use switchover ack migration capability to reduce downtime on VFIO
+ * device migration. This prevents the source from stopping the VM and
+ * completing the migration until an ACK is received from the destination
+ * that it's OK to do so. Thus, a VFIO device can make sure that its
+ * initial bytes were sent and loaded in the destination before the
+ * source VM is stopped.
+ *
+ * Since: 10.5.0
+ */
+ VIR_MIGRATE_SWITCHOVER_ACK = (1 << 21),
} virDomainMigrateFlags;
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 7c6b93963c..786fef317d 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -3822,6 +3822,10 @@ virDomainMigrate(virDomainPtr domain,
VIR_MIGRATE_PARALLEL,
error);
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_MIGRATE_TUNNELLED,
+ VIR_MIGRATE_SWITCHOVER_ACK,
+ error);
+
VIR_REQUIRE_FLAG_GOTO(VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES,
VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC,
error);
@@ -4021,6 +4025,10 @@ virDomainMigrate2(virDomainPtr domain,
VIR_MIGRATE_PARALLEL,
error);
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_MIGRATE_TUNNELLED,
+ VIR_MIGRATE_SWITCHOVER_ACK,
+ error);
+
VIR_REQUIRE_FLAG_GOTO(VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES,
VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC,
error);
@@ -4497,6 +4505,10 @@ virDomainMigrateToURI(virDomainPtr domain,
VIR_MIGRATE_PARALLEL,
error);
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_MIGRATE_TUNNELLED,
+ VIR_MIGRATE_SWITCHOVER_ACK,
+ error);
+
if (virDomainMigrateUnmanagedCheckCompat(domain, flags) < 0)
goto error;
@@ -4577,6 +4589,10 @@ virDomainMigrateToURI2(virDomainPtr domain,
VIR_MIGRATE_PARALLEL,
error);
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_MIGRATE_TUNNELLED,
+ VIR_MIGRATE_SWITCHOVER_ACK,
+ error);
+
if (virDomainMigrateUnmanagedCheckCompat(domain, flags) < 0)
goto error;
@@ -4656,6 +4672,10 @@ virDomainMigrateToURI3(virDomainPtr domain,
VIR_MIGRATE_PARALLEL,
error);
+ VIR_EXCLUSIVE_FLAGS_GOTO(VIR_MIGRATE_TUNNELLED,
+ VIR_MIGRATE_SWITCHOVER_ACK,
+ error);
+
if (virDomainMigrateUnmanagedCheckCompat(domain, flags) < 0)
goto error;
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index ed62fd4a91..cd89e100e1 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -62,6 +62,7 @@
VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES | \
VIR_MIGRATE_POSTCOPY_RESUME | \
VIR_MIGRATE_ZEROCOPY | \
+ VIR_MIGRATE_SWITCHOVER_ACK | \
0)
/* All supported migration parameters and their types. */
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 48f8657f71..9593b6ba65 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -105,6 +105,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability,
"return-path",
"zero-copy-send",
"postcopy-preempt",
+ "switchover-ack",
);
@@ -138,7 +139,7 @@ struct _qemuMigrationParamsAlwaysOnItem {
typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem;
struct _qemuMigrationParamsFlagMapItem {
/* Describes what to do with the capability if @flag is found.
- * When se to QEMU_MIGRATION_FLAG_REQUIRED, the capability will be
+ * When set to QEMU_MIGRATION_FLAG_REQUIRED, the capability will be
* enabled iff the specified migration flag is enabled. On the other hand
* QEMU_MIGRATION_FLAG_FORBIDDEN will enable the capability as long as
* the specified migration flag is not enabled. */
@@ -215,6 +216,11 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
.flag = VIR_MIGRATE_ZEROCOPY,
.cap = QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
.party = QEMU_MIGRATION_SOURCE},
+
+ {.match = QEMU_MIGRATION_FLAG_FORBIDDEN,
+ .flag = VIR_MIGRATE_TUNNELLED,
+ .cap = QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
+ .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
};
/* Translation from VIR_MIGRATE_PARAM_* typed parameters to
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 91bc6792cd..df67f1fb92 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -41,6 +41,7 @@ typedef enum {
QEMU_MIGRATION_CAP_RETURN_PATH,
QEMU_MIGRATION_CAP_ZERO_COPY_SEND,
QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT,
+ QEMU_MIGRATION_CAP_SWITCHOVER_ACK,
QEMU_MIGRATION_CAP_LAST
} qemuMigrationCapability;
--
2.43.0
4
8
This patch adds some previously missing test cases that test for
proper firewall rule creation when the following are included in the
network definition:
* <forward dev='blah'>
* no forward element (an "isolated" network)
* nat port range when only ipv4 is nat-ed
* nat port range when both ipv4 & ipv6 are nated
Signed-off-by: Laine Stump <laine(a)redhat.com>
---
If you ack this, please also push it, as I'm on vacation and only
sporadically connected.
.../forward-dev-linux.iptables | 154 +++++++
.../forward-dev-linux.nftables | 158 +++++++
tests/networkxml2firewalldata/forward-dev.xml | 10 +
.../isolated-linux.iptables | 159 ++++++++
.../isolated-linux.nftables | 64 +++
tests/networkxml2firewalldata/isolated.xml | 15 +
.../nat-port-range-ipv6-linux.iptables | 317 ++++++++++++++
.../nat-port-range-ipv6-linux.nftables | 386 ++++++++++++++++++
.../nat-port-range-ipv6.xml | 20 +
.../nat-port-range-linux.iptables | 283 +++++++++++++
.../nat-port-range-linux.nftables | 314 ++++++++++++++
.../nat-port-range.xml | 20 +
tests/networkxml2firewalltest.c | 5 +
13 files changed, 1905 insertions(+)
create mode 100644 tests/networkxml2firewalldata/forward-dev-linux.iptables
create mode 100644 tests/networkxml2firewalldata/forward-dev-linux.nftables
create mode 100644 tests/networkxml2firewalldata/forward-dev.xml
create mode 100644 tests/networkxml2firewalldata/isolated-linux.iptables
create mode 100644 tests/networkxml2firewalldata/isolated-linux.nftables
create mode 100644 tests/networkxml2firewalldata/isolated.xml
create mode 100644 tests/networkxml2firewalldata/nat-port-range-ipv6-linux.iptables
create mode 100644 tests/networkxml2firewalldata/nat-port-range-ipv6-linux.nftables
create mode 100644 tests/networkxml2firewalldata/nat-port-range-ipv6.xml
create mode 100644 tests/networkxml2firewalldata/nat-port-range-linux.iptables
create mode 100644 tests/networkxml2firewalldata/nat-port-range-linux.nftables
create mode 100644 tests/networkxml2firewalldata/nat-port-range.xml
diff --git a/tests/networkxml2firewalldata/forward-dev-linux.iptables b/tests/networkxml2firewalldata/forward-dev-linux.iptables
new file mode 100644
index 0000000000..bc483c4512
--- /dev/null
+++ b/tests/networkxml2firewalldata/forward-dev-linux.iptables
@@ -0,0 +1,154 @@
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 192.168.122.0/24 \
+--in-interface virbr0 \
+--out-interface enp0s7 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 192.168.122.0/24 \
+--in-interface enp0s7 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 '!' \
+--destination 192.168.122.0/24 \
+--out-interface enp0s7 \
+--jump MASQUERADE
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p udp '!' \
+--destination 192.168.122.0/24 \
+--out-interface enp0s7 \
+--jump MASQUERADE \
+--to-ports 1024-65535
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p tcp '!' \
+--destination 192.168.122.0/24 \
+--out-interface enp0s7 \
+--jump MASQUERADE \
+--to-ports 1024-65535
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--out-interface enp0s7 \
+--source 192.168.122.0/24 \
+--destination 255.255.255.255/32 \
+--jump RETURN
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--out-interface enp0s7 \
+--source 192.168.122.0/24 \
+--destination 224.0.0.0/24 \
+--jump RETURN
+iptables \
+-w \
+--table mangle \
+--insert LIBVIRT_PRT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump CHECKSUM \
+--checksum-fill
diff --git a/tests/networkxml2firewalldata/forward-dev-linux.nftables b/tests/networkxml2firewalldata/forward-dev-linux.nftables
new file mode 100644
index 0000000000..8badb74beb
--- /dev/null
+++ b/tests/networkxml2firewalldata/forward-dev-linux.nftables
@@ -0,0 +1,158 @@
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+ip \
+saddr \
+192.168.122.0/24 \
+iif \
+virbr0 \
+oifname \
+enp0s7 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+iifname \
+enp0s7 \
+oif \
+virbr0 \
+ip \
+daddr \
+192.168.122.0/24 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+oifname \
+enp0s7 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+oifname \
+enp0s7 \
+counter \
+masquerade \
+to \
+:1024-65535
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+oifname \
+enp0s7 \
+counter \
+masquerade \
+to \
+:1024-65535
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+oifname \
+enp0s7 \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+255.255.255.255/32 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+oifname \
+enp0s7 \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+224.0.0.0/24 \
+counter \
+return
diff --git a/tests/networkxml2firewalldata/forward-dev.xml b/tests/networkxml2firewalldata/forward-dev.xml
new file mode 100644
index 0000000000..8e49d3984d
--- /dev/null
+++ b/tests/networkxml2firewalldata/forward-dev.xml
@@ -0,0 +1,10 @@
+<network>
+ <name>default</name>
+ <bridge name="virbr0"/>
+ <forward mode='nat' dev='enp0s7'/>
+ <ip address="192.168.122.1" netmask="255.255.255.0">
+ <dhcp>
+ <range start="192.168.122.2" end="192.168.122.254"/>
+ </dhcp>
+ </ip>
+</network>
diff --git a/tests/networkxml2firewalldata/isolated-linux.iptables b/tests/networkxml2firewalldata/isolated-linux.iptables
new file mode 100644
index 0000000000..135189ce41
--- /dev/null
+++ b/tests/networkxml2firewalldata/isolated-linux.iptables
@@ -0,0 +1,159 @@
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 547 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 546 \
+--jump ACCEPT
+iptables \
+-w \
+--table mangle \
+--insert LIBVIRT_PRT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump CHECKSUM \
+--checksum-fill
diff --git a/tests/networkxml2firewalldata/isolated-linux.nftables b/tests/networkxml2firewalldata/isolated-linux.nftables
new file mode 100644
index 0000000000..d1b4dac178
--- /dev/null
+++ b/tests/networkxml2firewalldata/isolated-linux.nftables
@@ -0,0 +1,64 @@
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
diff --git a/tests/networkxml2firewalldata/isolated.xml b/tests/networkxml2firewalldata/isolated.xml
new file mode 100644
index 0000000000..0e3bed10d1
--- /dev/null
+++ b/tests/networkxml2firewalldata/isolated.xml
@@ -0,0 +1,15 @@
+<network>
+ <name>default</name>
+ <bridge name="virbr0"/>
+ <ip address="192.168.122.1" netmask="255.255.255.0">
+ <dhcp>
+ <range start="192.168.122.2" end="192.168.122.254"/>
+ </dhcp>
+ </ip>
+ <ip address="192.168.128.1" netmask="255.255.255.0"/>
+ <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" >
+ <dhcp>
+ <range start="2001:db8:ca2:2:1::10" end="2001:db8:ca2:2:1::ff" />
+ </dhcp>
+ </ip>
+</network>
diff --git a/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.iptables b/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.iptables
new file mode 100644
index 0000000000..c2e845cc4f
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.iptables
@@ -0,0 +1,317 @@
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 547 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 546 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 192.168.122.0/24 \
+--in-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 192.168.122.0/24 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p udp '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p tcp '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+--destination 255.255.255.255/32 \
+--jump RETURN
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+--destination 224.0.0.0/24 \
+--jump RETURN
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 192.168.128.0/24 \
+--in-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 192.168.128.0/24 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+-p udp '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+-p tcp '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+--destination 255.255.255.255/32 \
+--jump RETURN
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+--destination 224.0.0.0/24 \
+--jump RETURN
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 2001:db8:ca2:2::/64 \
+--in-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 2001:db8:ca2:2::/64 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+ip6tables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 2001:db8:ca2:2::/64 '!' \
+--destination 2001:db8:ca2:2::/64 \
+--jump MASQUERADE
+ip6tables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 2001:db8:ca2:2::/64 \
+-p udp '!' \
+--destination 2001:db8:ca2:2::/64 \
+--jump MASQUERADE \
+--to-ports 500-1000
+ip6tables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 2001:db8:ca2:2::/64 \
+-p tcp '!' \
+--destination 2001:db8:ca2:2::/64 \
+--jump MASQUERADE \
+--to-ports 500-1000
+ip6tables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 2001:db8:ca2:2::/64 \
+--destination ff02::/16 \
+--jump RETURN
+iptables \
+-w \
+--table mangle \
+--insert LIBVIRT_PRT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump CHECKSUM \
+--checksum-fill
diff --git a/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.nftables b/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.nftables
new file mode 100644
index 0000000000..ceaed6fa40
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range-ipv6-linux.nftables
@@ -0,0 +1,386 @@
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+ip \
+saddr \
+192.168.122.0/24 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+ip \
+daddr \
+192.168.122.0/24 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+255.255.255.255/32 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+224.0.0.0/24 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+ip \
+saddr \
+192.168.128.0/24 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+ip \
+daddr \
+192.168.128.0/24 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+255.255.255.255/32 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+224.0.0.0/24 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_output \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+ip6 \
+daddr \
+2001:db8:ca2:2::/64 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_nat \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+ip6 \
+daddr \
+'!=' \
+2001:db8:ca2:2::/64 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+ip6 \
+daddr \
+'!=' \
+2001:db8:ca2:2::/64 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+ip6 \
+daddr \
+'!=' \
+2001:db8:ca2:2::/64 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_nat \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+ip6 \
+daddr \
+ff02::/16 \
+counter \
+return
diff --git a/tests/networkxml2firewalldata/nat-port-range-ipv6.xml b/tests/networkxml2firewalldata/nat-port-range-ipv6.xml
new file mode 100644
index 0000000000..9a70764fa0
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range-ipv6.xml
@@ -0,0 +1,20 @@
+<network>
+ <name>default</name>
+ <bridge name="virbr0"/>
+ <forward mode='nat'>
+ <nat ipv6='yes'>
+ <port start='500' end='1000'/>
+ </nat>
+ </forward>
+ <ip address="192.168.122.1" netmask="255.255.255.0">
+ <dhcp>
+ <range start="192.168.122.2" end="192.168.122.254"/>
+ </dhcp>
+ </ip>
+ <ip address="192.168.128.1" netmask="255.255.255.0"/>
+ <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" >
+ <dhcp>
+ <range start="2001:db8:ca2:2:1::10" end="2001:db8:ca2:2:1::ff" />
+ </dhcp>
+ </ip>
+</network>
diff --git a/tests/networkxml2firewalldata/nat-port-range-linux.iptables b/tests/networkxml2firewalldata/nat-port-range-linux.iptables
new file mode 100644
index 0000000000..8e5c2c8193
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range-linux.iptables
@@ -0,0 +1,283 @@
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 67 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--in-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--out-interface virbr0 \
+--jump REJECT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWX \
+--in-interface virbr0 \
+--out-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol tcp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 53 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_INP \
+--in-interface virbr0 \
+--protocol udp \
+--destination-port 547 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_OUT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 546 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 192.168.122.0/24 \
+--in-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 192.168.122.0/24 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p udp '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+-p tcp '!' \
+--destination 192.168.122.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+--destination 255.255.255.255/32 \
+--jump RETURN
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.122.0/24 \
+--destination 224.0.0.0/24 \
+--jump RETURN
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 192.168.128.0/24 \
+--in-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 192.168.128.0/24 \
+--out-interface virbr0 \
+--match conntrack \
+--ctstate ESTABLISHED,RELATED \
+--jump ACCEPT
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+-p udp '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+-p tcp '!' \
+--destination 192.168.128.0/24 \
+--jump MASQUERADE \
+--to-ports 500-1000
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+--destination 255.255.255.255/32 \
+--jump RETURN
+iptables \
+-w \
+--table nat \
+--insert LIBVIRT_PRT \
+--source 192.168.128.0/24 \
+--destination 224.0.0.0/24 \
+--jump RETURN
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWO \
+--source 2001:db8:ca2:2::/64 \
+--in-interface virbr0 \
+--jump ACCEPT
+ip6tables \
+-w \
+--table filter \
+--insert LIBVIRT_FWI \
+--destination 2001:db8:ca2:2::/64 \
+--out-interface virbr0 \
+--jump ACCEPT
+iptables \
+-w \
+--table mangle \
+--insert LIBVIRT_PRT \
+--out-interface virbr0 \
+--protocol udp \
+--destination-port 68 \
+--jump CHECKSUM \
+--checksum-fill
diff --git a/tests/networkxml2firewalldata/nat-port-range-linux.nftables b/tests/networkxml2firewalldata/nat-port-range-linux.nftables
new file mode 100644
index 0000000000..1dc37a26ec
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range-linux.nftables
@@ -0,0 +1,314 @@
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_output \
+iif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+counter \
+reject
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_cross \
+iif \
+virbr0 \
+oif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+ip \
+saddr \
+192.168.122.0/24 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+ip \
+daddr \
+192.168.122.0/24 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.122.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+255.255.255.255/32 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.122.0/24 \
+ip \
+daddr \
+224.0.0.0/24 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_output \
+ip \
+saddr \
+192.168.128.0/24 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_input \
+oif \
+virbr0 \
+ip \
+daddr \
+192.168.128.0/24 \
+ct \
+state \
+related,established \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+udp \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+meta \
+l4proto \
+tcp \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+'!=' \
+192.168.128.0/24 \
+counter \
+masquerade \
+to \
+:500-1000
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+255.255.255.255/32 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip \
+libvirt_network \
+guest_nat \
+ip \
+saddr \
+192.168.128.0/24 \
+ip \
+daddr \
+224.0.0.0/24 \
+counter \
+return
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_output \
+ip6 \
+saddr \
+2001:db8:ca2:2::/64 \
+iif \
+virbr0 \
+counter \
+accept
+nft \
+-ae insert \
+rule \
+ip6 \
+libvirt_network \
+guest_input \
+ip6 \
+daddr \
+2001:db8:ca2:2::/64 \
+oif \
+virbr0 \
+counter \
+accept
diff --git a/tests/networkxml2firewalldata/nat-port-range.xml b/tests/networkxml2firewalldata/nat-port-range.xml
new file mode 100644
index 0000000000..81b29d3b72
--- /dev/null
+++ b/tests/networkxml2firewalldata/nat-port-range.xml
@@ -0,0 +1,20 @@
+<network>
+ <name>default</name>
+ <bridge name="virbr0"/>
+ <forward mode='nat'>
+ <nat>
+ <port start='500' end='1000'/>
+ </nat>
+ </forward>
+ <ip address="192.168.122.1" netmask="255.255.255.0">
+ <dhcp>
+ <range start="192.168.122.2" end="192.168.122.254"/>
+ </dhcp>
+ </ip>
+ <ip address="192.168.128.1" netmask="255.255.255.0"/>
+ <ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" >
+ <dhcp>
+ <range start="2001:db8:ca2:2:1::10" end="2001:db8:ca2:2:1::ff" />
+ </dhcp>
+ </ip>
+</network>
diff --git a/tests/networkxml2firewalltest.c b/tests/networkxml2firewalltest.c
index 4cabe39d1d..f7b87ff798 100644
--- a/tests/networkxml2firewalltest.c
+++ b/tests/networkxml2firewalltest.c
@@ -198,6 +198,11 @@ mymain(void)
DO_TEST("nat-ipv6");
DO_TEST("nat-ipv6-masquerade");
DO_TEST("route-default");
+ DO_TEST("forward-dev");
+ DO_TEST("isolated");
+ DO_TEST("forward-dev");
+ DO_TEST("nat-port-range");
+ DO_TEST("nat-port-range-ipv6");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--
2.45.2
2
1
[PATCH] tests: fix broken nftables test data so that individual tests are successful
by Laine Stump 24 Jun '24
by Laine Stump 24 Jun '24
24 Jun '24
When the chain names and table name used by the nftables firewall
backend were changed in commit
958aa7f274904eb8e4678a43eac845044f0dcc38, I forgot to change the test
data file base.nftables, which has the extra "list" and "add
chain/table" commands that are generated for the first test case of
networkxml2firewalltest.c. When the full set of tests is run, the
first test will be an iptables test case, so those extra commands
won't be added to any of the nftables cases, and so the data in
base.nftables never matches, and the tests are all successful.
However, if the test are limited with, e.g. VIR_TEST_RANGE=2 (test #2
will be the nftables version of the 1st test case), then the commands
to add nftables table/chains *will* be generated in the test output,
and so the test will fail. Because I was only running the entire test
series after the initial commits of nftables tests, I didn't notice
this. Until now.
base.nftables has now been updated to reflect the current names for
chains/table, and running individual test cases is once again
successful.
Fixes: 958aa7f274904eb8e4678a43eac845044f0dcc38
Signed-off-by: Laine Stump <laine(a)redhat.com>
---
tests/networkxml2firewalldata/base.nftables | 202 ++++----------------
1 file changed, 42 insertions(+), 160 deletions(-)
diff --git a/tests/networkxml2firewalldata/base.nftables b/tests/networkxml2firewalldata/base.nftables
index 4f1f475a85..a064318739 100644
--- a/tests/networkxml2firewalldata/base.nftables
+++ b/tests/networkxml2firewalldata/base.nftables
@@ -2,255 +2,137 @@ nft \
list \
table \
ip \
-libvirt
+libvirt_network
nft \
add \
table \
ip \
-libvirt
+libvirt_network
nft \
add \
chain \
ip \
-libvirt \
-INPUT \
-'{ type filter hook input priority 0; policy accept; }'
-nft \
-add \
-chain \
-ip \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
'{ type filter hook forward priority 0; policy accept; }'
nft \
add \
chain \
ip \
-libvirt \
-OUTPUT \
-'{ type filter hook output priority 0; policy accept; }'
-nft \
-add \
-chain \
-ip \
-libvirt \
-LIBVIRT_INP
-nft \
-insert \
-rule \
-ip \
-libvirt \
-INPUT \
-counter \
-jump \
-LIBVIRT_INP
-nft \
-add \
-chain \
-ip \
-libvirt \
-LIBVIRT_OUT
-nft \
-insert \
-rule \
-ip \
-libvirt \
-OUTPUT \
-counter \
-jump \
-LIBVIRT_OUT
-nft \
-add \
-chain \
-ip \
-libvirt \
-LIBVIRT_FWO
+libvirt_network \
+guest_output
nft \
insert \
rule \
ip \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWO
+guest_output
nft \
add \
chain \
ip \
-libvirt \
-LIBVIRT_FWI
+libvirt_network \
+guest_input
nft \
insert \
rule \
ip \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWI
+guest_input
nft \
add \
chain \
ip \
-libvirt \
-LIBVIRT_FWX
+libvirt_network \
+guest_cross
nft \
insert \
rule \
ip \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWX
+guest_cross
nft \
add \
chain \
ip \
-libvirt \
-POSTROUTING \
+libvirt_network \
+guest_nat \
'{ type nat hook postrouting priority 100; policy accept; }'
nft \
-add \
-chain \
-ip \
-libvirt \
-LIBVIRT_PRT
-nft \
-insert \
-rule \
-ip \
-libvirt \
-POSTROUTING \
-counter \
-jump \
-LIBVIRT_PRT
-nft \
list \
table \
ip6 \
-libvirt
+libvirt_network
nft \
add \
table \
ip6 \
-libvirt
+libvirt_network
nft \
add \
chain \
ip6 \
-libvirt \
-INPUT \
-'{ type filter hook input priority 0; policy accept; }'
-nft \
-add \
-chain \
-ip6 \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
'{ type filter hook forward priority 0; policy accept; }'
nft \
add \
chain \
ip6 \
-libvirt \
-OUTPUT \
-'{ type filter hook output priority 0; policy accept; }'
-nft \
-add \
-chain \
-ip6 \
-libvirt \
-LIBVIRT_INP
-nft \
-insert \
-rule \
-ip6 \
-libvirt \
-INPUT \
-counter \
-jump \
-LIBVIRT_INP
-nft \
-add \
-chain \
-ip6 \
-libvirt \
-LIBVIRT_OUT
-nft \
-insert \
-rule \
-ip6 \
-libvirt \
-OUTPUT \
-counter \
-jump \
-LIBVIRT_OUT
-nft \
-add \
-chain \
-ip6 \
-libvirt \
-LIBVIRT_FWO
+libvirt_network \
+guest_output
nft \
insert \
rule \
ip6 \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWO
+guest_output
nft \
add \
chain \
ip6 \
-libvirt \
-LIBVIRT_FWI
+libvirt_network \
+guest_input
nft \
insert \
rule \
ip6 \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWI
+guest_input
nft \
add \
chain \
ip6 \
-libvirt \
-LIBVIRT_FWX
+libvirt_network \
+guest_cross
nft \
insert \
rule \
ip6 \
-libvirt \
-FORWARD \
+libvirt_network \
+forward \
counter \
jump \
-LIBVIRT_FWX
+guest_cross
nft \
add \
chain \
ip6 \
-libvirt \
-POSTROUTING \
+libvirt_network \
+guest_nat \
'{ type nat hook postrouting priority 100; policy accept; }'
-nft \
-add \
-chain \
-ip6 \
-libvirt \
-LIBVIRT_PRT
-nft \
-insert \
-rule \
-ip6 \
-libvirt \
-POSTROUTING \
-counter \
-jump \
-LIBVIRT_PRT
--
2.45.2
3
3
The attribute 'discard_no_unref' is not allowed to be changed while
the virtual machine is running.
Resolves: https://issues.redhat.com/browse/RHEL-37542
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/qemu/qemu_domain.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2c8f5b1aad..1a90311ca5 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -8459,6 +8459,7 @@ qemuDomainDiskChangeSupported(virDomainDiskDef *disk,
CHECK_EQ(ioeventfd, "ioeventfd", true);
CHECK_EQ(event_idx, "event_idx", true);
CHECK_EQ(copy_on_read, "copy_on_read", true);
+ CHECK_EQ(discard_no_unref, "discard_no_unref", true);
/* "snapshot" is a libvirt internal field and thus can be changed */
/* startupPolicy is allowed to be updated. Therefore not checked here. */
CHECK_EQ(transient, "transient", true);
--
2.45.2
2
1
This brings libvirt in sync qith qemu commit
02d9c38236cf8c9826e5c5be61780c4444cb4ae0.
Tim Wiederhake (10):
cpu_map: Add missing feature "fred"
cpu_map: Add missing feature "lkgs"
cpu_map: Add missing feature "wrmsrns"
cpu_map: Add missing feature "lam"
cpu_map: Add missing feature "overflow-recov"
cpu_map: Add missing feature "succor"
cpu_map: Add missing feature "rfds-no"
cpu_map: Add missing feature "rfds-clear"
cpu_map: Add missing feature "vmx-nested-exception"
cpu_map: Ignore feature "kvm-asyncpf-vmexit"
src/cpu_map/sync_qemu_features_i386.py | 1 +
src/cpu_map/x86_features.xml | 29 +++++++++++++++++++
...86_64-cpuid-EPYC-7502-32-Core-disabled.xml | 2 +-
.../x86_64-cpuid-EPYC-7502-32-Core-guest.xml | 2 ++
.../x86_64-cpuid-EPYC-7502-32-Core-host.xml | 2 ++
...86_64-cpuid-EPYC-7601-32-Core-disabled.xml | 2 +-
.../x86_64-cpuid-EPYC-7601-32-Core-guest.xml | 2 ++
.../x86_64-cpuid-EPYC-7601-32-Core-host.xml | 2 ++
...-cpuid-EPYC-7601-32-Core-ibpb-disabled.xml | 2 +-
..._64-cpuid-EPYC-7601-32-Core-ibpb-guest.xml | 2 ++
...6_64-cpuid-EPYC-7601-32-Core-ibpb-host.xml | 2 ++
...-cpuid-Hygon-C86-7185-32-core-disabled.xml | 2 +-
..._64-cpuid-Hygon-C86-7185-32-core-guest.xml | 2 ++
...6_64-cpuid-Hygon-C86-7185-32-core-host.xml | 2 ++
...puid-Ryzen-7-1800X-Eight-Core-disabled.xml | 2 +-
...4-cpuid-Ryzen-7-1800X-Eight-Core-guest.xml | 2 ++
...64-cpuid-Ryzen-7-1800X-Eight-Core-host.xml | 2 ++
...4-cpuid-Ryzen-9-3900X-12-Core-disabled.xml | 2 +-
...6_64-cpuid-Ryzen-9-3900X-12-Core-guest.xml | 2 ++
...86_64-cpuid-Ryzen-9-3900X-12-Core-host.xml | 2 ++
.../domaincapsdata/qemu_9.1.0-q35.x86_64.xml | 3 ++
tests/domaincapsdata/qemu_9.1.0.x86_64.xml | 3 ++
...host-model-fallback-kvm.x86_64-latest.args | 2 +-
...cpu-host-model-features.x86_64-latest.args | 2 +-
.../cpu-host-model-kvm.x86_64-latest.args | 2 +-
...st-model-nofallback-kvm.x86_64-latest.args | 2 +-
26 files changed, 70 insertions(+), 10 deletions(-)
--
2.43.0
2
11
Commit 23c47944882b added parsing of serial ports connected to vspc, but
the VM can also have a network serial port with an empty filename or no
filename at all. Parse these the same way, as a <serial type='null'>.
Resolves: https://issues.redhat.com/browse/RHEL-32182
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/vmx/vmx.c | 2 +-
tests/vmx2xmldata/esx-in-the-wild-13.vmx | 4 ++++
tests/vmx2xmldata/esx-in-the-wild-13.xml | 3 +++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index d90b41d2ad14..d082a0766010 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -3065,7 +3065,7 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port,
(*def)->target.port = port;
(*def)->source->type = VIR_DOMAIN_CHR_TYPE_PIPE;
(*def)->source->data.file.path = g_steal_pointer(&fileName);
- } else if (STRCASEEQ(fileType, "network") && vspc) {
+ } else if (STRCASEEQ(fileType, "network") && (vspc || !fileName || STREQ(fileName, ""))) {
(*def)->target.port = port;
(*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL;
} else if (STRCASEEQ(fileType, "network")) {
diff --git a/tests/vmx2xmldata/esx-in-the-wild-13.vmx b/tests/vmx2xmldata/esx-in-the-wild-13.vmx
index 1016acab28d8..d67e01814e93 100644
--- a/tests/vmx2xmldata/esx-in-the-wild-13.vmx
+++ b/tests/vmx2xmldata/esx-in-the-wild-13.vmx
@@ -29,6 +29,10 @@ serial0.fileName = "ZmVybmV0IGdBQUFBQUJrdFotaW8yclpkRXR6N3dBcDdyYkFMaWFUMVd4RENJ
serial0.vspc = "telnets://10.28.100.26:18979#thumbprint=18:F5:79:E5:73:A5:22:83:C0:57:B9:B4:FA:CE:60:19:F1:12:F5:7B"
serial0.yieldOnMsrRead = "TRUE"
serial0.present = "TRUE"
+serial1.fileType = "network"
+serial1.fileName = ""
+serial1.yieldOnMsrRead = "TRUE"
+serial1.present = "TRUE"
displayName = "Test-Mig-VM-1 (01ce57d0-4e20-41a5-8b6c-bcbf49a032ec)"
annotation = "name:Test-Mig-VM-1|0Auserid:962314ba515c48388a0e95c0961709ff|0Ausername:admin|0Aprojectid:b06b5f77b6bb442f85b1c67cff980ef9|0Aprojectname:MIS|0Aflavor:name:mig-test-flavor|0Aflavor:memory_mb:1024|0Aflavor:vcpus:1|0Aflavor:ephemeral_gb:0|0Aflavor:root_gb:10|0Aflavor:swap:0|0Aimageid:8b90d6fa-20ab-4adf-8015-aad3dddb246c|0Apackage:20.6.2|0A"
guestOS = "other-64"
diff --git a/tests/vmx2xmldata/esx-in-the-wild-13.xml b/tests/vmx2xmldata/esx-in-the-wild-13.xml
index 552c9a2a1a26..e6ef947d501f 100644
--- a/tests/vmx2xmldata/esx-in-the-wild-13.xml
+++ b/tests/vmx2xmldata/esx-in-the-wild-13.xml
@@ -43,6 +43,9 @@ package:20.6.2
<serial type='null'>
<target port='0'/>
</serial>
+ <serial type='null'>
+ <target port='1'/>
+ </serial>
<console type='null'>
<target type='serial' port='0'/>
</console>
--
2.45.1
3
2
Adjusting how DASDs are handled as recently ID_* tags are also included
in the udev information which causes the problems reported by
https://issues.redhat.com/browse/RHEL-39497
Removing the filtering of offline ccw devices as these devices are
available in the system and also are used to set them online again. The
state information is made available in the ccw capability as an optional
state element.
Boris Fiuczynski (4):
nodedev: refactor storage type fixup
nodedev: improve DASD detection
nodedev: prevent invalid DASD node object creation
nodedev: add ccw device state and remove fencing
src/conf/node_device_conf.c | 24 +++++++++++++
src/conf/node_device_conf.h | 11 ++++++
src/conf/schemas/nodedev.rng | 8 +++++
src/node_device/node_device_udev.c | 56 +++++++++++++++++++++++++-----
4 files changed, 90 insertions(+), 9 deletions(-)
--
2.45.0
3
11
[RFC PATCH 0/1] support deprecated-props from query-cpu-model-expansion
by Collin Walling 19 Jun '24
by Collin Walling 19 Jun '24
19 Jun '24
Overview
========
QEMU will soon support reporting an optional array of deprecated features for an expanded CPU model via the query-cpu-model-expansion command. The intended use of this data is to make it easier for a user to define a CPU model with features flagged as deprecated set to disabled, thus rendering the guest migratable to future hardware that will out-right drop support for said features.
Attached to this cover letter is only half of the bigger picture. I've updated the CPU model expansion ABI to parse the new array (if it's available) and store the result in a string list within the qemuMonitorCPUModelInfo struct. I also propose an approach on how to store/retrieve the list of deprecated features in the qemuCaps cache file. All feedback on this patch is certainly welcome. Please note: I do not provide any updates to the respective qemuCaps tests right now.
The main goal of this post is to discuss the other half of the design: reporting and enabling a CPU model with deprecated features disabled. I believe the ideal solution involves a way for the user to easily configure their guest with this new data. Two ideas I currently have are outlined below. Other approaches are encouraged.
Notes
=====
- In my example below, I am running on a z14.2 machine.
- The features that are flagged as deprecated for this model are: bpb, csske, cte, te.
- The discussion regarding the QEMU changes can be found here: https://mail.gnu.org/archive/html/qemu-devel/2024-04/msg04605.html
Example of Desired Changes
==========================
Here is what I'd like the resulting guest's transient XML to look like for the <cpu> section (I have trimmed the features list for brevity):
...
<cpu mode='custom' match='exact' check='partial'>
<model fallback='forbid'>z14.2-base</model>
<feature policy='require' name='aen'/>
<feature policy='require' name='cmmnt'/>
<feature policy='require' name='aefsi'/>
...
<feature policy='disable' name='cte'/> ***
<feature policy='require' name='ais'/>
<feature policy='disable' name='bpb'/> ***
<feature policy='require' name='ctop'/>
<feature policy='require' name='gs'/>
<feature policy='require' name='ppa15'/>
<feature policy='require' name='zpci'/>
<feature policy='require' name='sea_esop2'/>
<feature policy='disable' name='te'/> ***
<feature policy='require' name='cmm'/>
<feature policy='disable' name='csske'/> ***
</cpu>
...
Ideas
=====
New Host CPU Model
------------------
Create a new CPU model that is a mirror of the host CPU model with deprecated features turned off. Let's call this model "host-recommended". A user may define this model in the guest XML as they would any other CPU model:
<cpu mode='host-recommended' check='partial'/>
Just as how host-model works, anything defined nested in the <cpu> tag will be ignored.
This model could potentially be listed in the domcapabilities output after the host-model:
<cpu>
<mode name='host-passthrough' supported='yes'>
...
</mode>
...
<mode name='host-model' supported='yes'>
...
</mode>
<mode name='host-recommended' supported='yes'>
...
<feature policy='disable' name='cte'/>
<feature policy='require' name='ais'/>
<feature policy='disable' name='bpb'/>
<feature policy='require' name='ctop'/>
<feature policy='require' name='gs'/>
<feature policy='require' name='ppa15'/>
<feature policy='require' name='zpci'/>
<feature policy='require' name='sea_esop2'/>
<feature policy='disable' name='te'/>
<feature policy='require' name='cmm'/>
<feature policy='disable' name='csske'/>
</cpu>
New Nested Element Under <cpu>
------------------------------
Create a new optional XML element nested under the <cpu> tag that may be used to disable deprecated features. This approach is more explicit compared to creating a new CPU model, and allows the user to disable these features when defining a specific model other than host-model. Here is an example of what the guest's defined XML for the CPU could look like:
<cpu mode='host-model' check='partial'>
<deprecated_features>off</deprecated_features>
</cpu>
However, a conflict arises with this approach: parameter priority. It would need to be discussed what the expected behavior should be if a user defines a guest with both a mode to disable deprecated features and any deprecated features listed with the 'require' policy, e.g.:
<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>z13.2-base</model>
<!-- which one takes priority? -->
<deprecated_features>off</deprecated_features>
<feature policy='require' name='csske'/>
</cpu>
Another conflict is setting this option to "on" would have no effect on the CPU model (I can't think of a reason why someone would want to explicitly enable these features). This may not communicate well to the user.
To report these features, a <deprecatedProperties> tag could be added to the domcapabilities output using the same format I use in my proposed patch for the qemu capabilities file:
<cpu>
<mode name='host-passthrough' supported='yes'>
...
</mode>
...
<mode name='host-model' supported='yes'>
...
</mode>
<deprecatedProperties>
<property name='bpb'/>
<property name='te'/>
<property name='cte'/>
<property name='csske'/>
</deprecatedProperties>
</cpu>
Please let me know your thoughts. Once an approach is agreed upon, I will begin development.
Collin Walling (1):
qemu: monitor: parse deprecated-props from query-cpu-model-expansion
response
src/qemu/qemu_capabilities.c | 30 ++++++++++++++++++++++++++++++
src/qemu/qemu_monitor.h | 2 ++
src/qemu/qemu_monitor_json.c | 29 ++++++++++++++++++++++++-----
3 files changed, 56 insertions(+), 5 deletions(-)
--
2.43.0
3
8
Remove unused declaration of the virDomainDiskFindByBusAndDst().
Signed-off-by: Adam Julis <ajulis(a)redhat.com>
---
src/conf/domain_conf.h | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a06f015444..cdab6ef2da 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3558,10 +3558,6 @@ void virDomainDiskSetFormat(virDomainDiskDef *def, int format);
virDomainControllerDef *
virDomainDeviceFindSCSIController(const virDomainDef *def,
const virDomainDeviceDriveAddress *addr);
-virDomainDiskDef *virDomainDiskFindByBusAndDst(virDomainDef *def,
- int bus,
- char *dst);
-
virDomainControllerDef *virDomainControllerDefNew(virDomainControllerType type);
void virDomainControllerDefFree(virDomainControllerDef *def);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainControllerDef, virDomainControllerDefFree);
--
2.45.0
2
1
[PATCH v2 00/20] node_dev_udev: use workerpool and improve nodedev events
by Marc Hartmayer 19 Jun '24
by Marc Hartmayer 19 Jun '24
19 Jun '24
When an udev event occurs for a mediated device (mdev) the mdev config data
requires an update via mdevctl as the udev event does not contain all config
data. This update needs to occur immediately and to be finished before the
libvirt nodedev event is issued to keep the API usage reliable.
Changelog:
v1->v2:
+ squashed old patches 3 and 17 (comments from Jonathon and Boris)
+ added r-b's from Jonathon and Boris
+ worked in comments from Jonathon to old patch 15
+ added comment why only one worker can currently be used
+ added patch `node_device_udev: remove incorrect G_GNUC_UNUSED`
RFCv1->v1:
+ removed some of my own s-o-b's that were accidentally inserted in the RFC
+ added r-b's from Boris and Jonathon
+ worked in comments from Boris and Jonathon, but I did not inline
"nodeDeviceDefResetMdevActiveConfig" as I'm not sure whether this improves
the readability
+ reworked patch "[RFC PATCH v1 11/15] node_device_udev: Use
`stateShutdownPrepare` and `stateShutdownWait`"
+ reworked patch "node_device_udev: Use a worker pool for processing events and
emitting nodedev event"
+ added patches:
- node_device_udev: Move responsibility to release `(init|udev)Thread` to `udevEventDataDispose`
- node_device_udev: Fix leak of mdevctlLock, udevThreadCond, and mdevCtlMonitor
- node_device_udev: nodeStateShutdownPrepare: Disconnect the signals explicitly
- node_device_udev: Pass the driver state as parameter in prepartion for the next commit
- node_device_udev: Add support for `g_autoptr` to `udevEventData
- node_device_udev: Pass the `udevEventData` via parameter and use refcounting
Boris Fiuczynski (3):
nodedev: fix mdev add udev event data handling
nodedev: immediate update of active config on udev events
nodedev: reset active config data on udev remove event
Marc Hartmayer (17):
node_device_udev: Set @def to NULL
node_device_udev: Remove the timeout if the data is disposed
node_device_udev: Test for mdevctlTimeout != -1
node_device_udev: Don't take `mdevctlLock` for `mdevctl list` and add
comments about locking
node_device_udev: Take lock if `driver->privateData` is modified
node_device_udev: Add prefix `udev` for udev related data
node_device_udev: Inline `udevRemoveOneDevice`
node_device_udev: Move responsibility to release `(init|udev)Thread`
to `udevEventDataDispose`
node_device_udev: Fix leak of mdevctlLock, udevThreadCond, and
mdevCtlMonitors
node_device_udev: Introduce and use `stateShutdownPrepare` and
`stateShutdownWait`
node_device_udev: nodeStateShutdownPrepare: Disconnect the signals
explicitly
node_device_udev: Pass the driver state as parameter in preparation
for the next commit
node_device_udev: Use a worker pool for processing events and emitting
nodedev event
node_device_udev: Make the code easier to read
node_device_udev: Add support for `g_autoptr` to `udevEventData`
node_device_udev: Pass the `udevEventData` via parameter and use
refcounting
node_device_udev: remove incorrect G_GNUC_UNUSED
src/node_device/node_device_driver.h | 5 +-
src/util/virmdev.h | 4 +
src/conf/node_device_conf.c | 10 +-
src/node_device/node_device_driver.c | 28 +-
src/node_device/node_device_udev.c | 516 ++++++++++++++++++---------
src/test/test_driver.c | 11 +-
src/util/virmdev.c | 20 ++
src/libvirt_private.syms | 2 +
8 files changed, 398 insertions(+), 198 deletions(-)
base-commit: c38720b337f74337ec94c0fe2e97a7c2c57188ae
--
2.34.1
3
27