[libvirt] [PATCH v2 00/31] qemu: Store default CPU in domain XML

When starting a domain without a CPU model specified in the domain XML, QEMU will choose a default one. Which is fine unless the domain gets migrated to another host because libvirt doesn't perform any CPU ABI checks and the virtual CPU provided by QEMU on the destination host can differ from the one on the source host. With QEMU 4.2.0 we can probe for the default CPU model used by QEMU for a particular machine type and store it in the domain XML. This way the chosen CPU model is more visible to users and libvirt will make sure the guest will see the exact same CPU after migration. https://bugzilla.redhat.com/show_bug.cgi?id=1598151 https://bugzilla.redhat.com/show_bug.cgi?id=1598162 --- Some patches were too large so I decided to shorten them before sending to the list. You can check the full version of this series with git fetch https://gitlab.com/jirkade/libvirt cpu-default-type Jiri Denemark (31): tests: Add capabilities for QEMU 4.2.0 on s390x domcapstest: Add test case for QEMU 4.2.0 on s390x conf: Use VIR_AUTO* in virDomainCapsCPUModelsAdd conf: Drop nameLen parameter from virDomainCapsCPUModelsAdd qemu: Copy CPU models in virQEMUCapsGetCPUDefinitions qemu: Filter models in virQEMUCapsGetCPUDefinitions qemu: Use virQEMUCapsGetCPUDefinitions more qemu: Use VIR_AUTOPTR in qemuMonitorJSONGetCPUDefinitions qemu: Change return type of virQEMUCapsFetchCPUDefinitions qemu: Introduce qemuMonitorCPUDefs struct qemu: Flatten qemuMonitorCPUDefs.cpus build: Export virStringListCopy internal API qemu: Add qemuMonitorCPUDefsCopy qemu: Use VIR_AUTOFREE in virQEMUCapsLoadCPUModels qemu: Introduce virQEMUCapsCPUDefsToModels qemu: Rename virQEMUCaps{Get,Fetch}CPUDefinitions qemu: Split virQEMUCapsFetchCPUModels qemu: Switch qemuCaps to use qemuMonitorCPUDefs conf: Drop unused virDomainCapsCPUModelsFilter conf: Drop virDomainCapsCPUModelsAddSteal qemu: Store typename from query-cpu-definitions in qemuCaps qemu: Probe for default CPU types qemu: Introduce virQEMUCapsGetMachineDefaultCPU qemu: Drop unused virQEMUCapsGetDefaultMachine qemu: Use VIR_AUTOUNREF in qemuDomainDefPostParse conf: Define VIR_AUTOPTR for virCPUDef qemuxml2*test: Add test cases for default CPU models on aarch64 qemuxml2*test: Add test cases for default CPU models on ppc64 qemuxml2*test: Add test cases for default CPU models on s390x qemuxml2*test: Add test cases for default CPU models on x86_64 qemu: Store default CPU in domain XML src/conf/cpu_conf.h | 1 + src/conf/domain_capabilities.c | 86 +- src/conf/domain_capabilities.h | 8 - src/libvirt_private.syms | 3 +- src/qemu/qemu_capabilities.c | 358 +- src/qemu/qemu_capabilities.h | 15 +- src/qemu/qemu_domain.c | 84 +- src/qemu/qemu_driver.c | 4 +- src/qemu/qemu_monitor.c | 74 +- src/qemu/qemu_monitor.h | 18 +- src/qemu/qemu_monitor_json.c | 82 +- src/qemu/qemu_monitor_json.h | 2 +- src/qemu/qemu_process.c | 24 +- tests/cputest.c | 7 +- .../domaincapsschemadata/qemu_4.2.0.s390x.xml | 202 + tests/domaincapstest.c | 4 + .../caps_2.10.0.aarch64.xml | 126 +- .../caps_2.10.0.ppc64.xml | 512 +- .../caps_2.10.0.s390x.xml | 264 +- .../caps_2.10.0.x86_64.xml | 132 +- .../caps_2.11.0.s390x.xml | 264 +- .../caps_2.11.0.x86_64.xml | 136 +- .../caps_2.12.0.aarch64.xml | 136 +- .../caps_2.12.0.ppc64.xml | 516 +- .../caps_2.12.0.s390x.xml | 264 +- .../caps_2.12.0.x86_64.xml | 180 +- .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 512 +- .../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 256 +- .../caps_2.9.0.x86_64.xml | 128 +- .../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 516 +- .../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 272 +- .../caps_3.0.0.x86_64.xml | 184 +- .../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 516 +- .../caps_3.1.0.x86_64.xml | 196 +- .../caps_4.0.0.aarch64.xml | 148 +- .../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 516 +- .../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 284 +- .../caps_4.0.0.x86_64.xml | 196 +- .../caps_4.1.0.x86_64.xml | 400 +- .../caps_4.2.0.aarch64.xml | 242 +- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 574 +- .../caps_4.2.0.s390x.replies | 22414 ++++++++++++++++ .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 3345 +++ .../caps_4.2.0.x86_64.xml | 492 +- tests/qemumonitorjsontest.c | 38 +- ...fault-cpu-kvm-virt-4.2.aarch64-latest.args | 38 + .../aarch64-default-cpu-kvm-virt-4.2.xml | 20 + ...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 39 + .../aarch64-default-cpu-tcg-virt-4.2.xml | 20 + .../disk-cache.x86_64-latest.args | 1 + .../disk-cdrom-network.x86_64-latest.args | 1 + .../disk-cdrom-tray.x86_64-latest.args | 1 + .../disk-copy_on_read.x86_64-latest.args | 1 + .../disk-detect-zeroes.x86_64-latest.args | 1 + .../disk-floppy-q35-2_11.x86_64-latest.args | 1 + .../disk-floppy-q35-2_9.x86_64-latest.args | 1 + .../os-firmware-bios.x86_64-latest.args | 1 + ...os-firmware-efi-secboot.x86_64-latest.args | 1 + .../os-firmware-efi.x86_64-latest.args | 1 + ...ault-cpu-kvm-pseries-2.7.ppc64-latest.args | 38 + .../ppc64-default-cpu-kvm-pseries-2.7.xml | 22 + ...ault-cpu-kvm-pseries-3.1.ppc64-latest.args | 38 + .../ppc64-default-cpu-kvm-pseries-3.1.xml | 22 + ...ault-cpu-kvm-pseries-4.2.ppc64-latest.args | 38 + .../ppc64-default-cpu-kvm-pseries-4.2.xml | 22 + ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 39 + .../ppc64-default-cpu-tcg-pseries-2.7.xml | 22 + ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 39 + .../ppc64-default-cpu-tcg-pseries-3.1.xml | 22 + ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 39 + .../ppc64-default-cpu-tcg-pseries-4.2.xml | 22 + ...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 31 + .../s390-default-cpu-kvm-ccw-virtio-4.2.xml | 16 + ...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 32 + .../s390-default-cpu-tcg-ccw-virtio-4.2.xml | 16 + .../tpm-emulator-tpm2-enc.x86_64-latest.args | 1 + .../tpm-emulator-tpm2.x86_64-latest.args | 1 + .../tpm-emulator.x86_64-latest.args | 1 + .../tseg-explicit-size.x86_64-latest.args | 1 + .../vhost-vsock-auto.x86_64-latest.args | 1 + .../vhost-vsock.x86_64-latest.args | 1 + ...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 37 + .../x86_64-default-cpu-kvm-pc-4.2.xml | 24 + ...default-cpu-kvm-q35-4.2.x86_64-latest.args | 42 + .../x86_64-default-cpu-kvm-q35-4.2.xml | 24 + ...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 37 + .../x86_64-default-cpu-tcg-pc-4.2.xml | 24 + ...default-cpu-tcg-q35-4.2.x86_64-latest.args | 42 + .../x86_64-default-cpu-tcg-q35-4.2.xml | 24 + tests/qemuxml2argvtest.c | 15 + ...efault-cpu-kvm-virt-4.2.aarch64-latest.xml | 38 + ...efault-cpu-tcg-virt-4.2.aarch64-latest.xml | 41 + .../os-firmware-bios.x86_64-latest.xml | 3 + .../os-firmware-efi-secboot.x86_64-latest.xml | 3 + .../os-firmware-efi.x86_64-latest.xml | 3 + ...fault-cpu-kvm-pseries-2.7.ppc64-latest.xml | 45 + ...fault-cpu-kvm-pseries-3.1.ppc64-latest.xml | 45 + ...fault-cpu-kvm-pseries-4.2.ppc64-latest.xml | 45 + ...fault-cpu-tcg-pseries-2.7.ppc64-latest.xml | 48 + ...fault-cpu-tcg-pseries-3.1.ppc64-latest.xml | 48 + ...fault-cpu-tcg-pseries-4.2.ppc64-latest.xml | 48 + ...lt-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml | 23 + ...lt-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml | 26 + .../tpm-emulator-tpm2-enc.x86_64-latest.xml | 3 + .../tpm-emulator-tpm2.x86_64-latest.xml | 3 + .../tpm-emulator.x86_64-latest.xml | 3 + .../tpm-passthrough-crb.x86_64-latest.xml | 3 + .../tpm-passthrough.x86_64-latest.xml | 3 + ...4-default-cpu-kvm-pc-4.2.x86_64-latest.xml | 40 + ...-default-cpu-kvm-q35-4.2.x86_64-latest.xml | 63 + ...4-default-cpu-tcg-pc-4.2.x86_64-latest.xml | 40 + ...-default-cpu-tcg-q35-4.2.x86_64-latest.xml | 63 + tests/qemuxml2xmltest.c | 15 + 113 files changed, 31926 insertions(+), 4317 deletions(-) create mode 100644 tests/domaincapsschemadata/qemu_4.2.0.s390x.xml create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml -- 2.23.0

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch .../caps_4.2.0.s390x.replies | 22414 ++++++++++++++++ .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 3345 +++ 2 files changed, 25759 insertions(+) create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies new file mode 100644 index 0000000000..68d70de415 --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies @@ -0,0 +1,22414 @@ +{ + "execute": "qmp_capabilities", + "id": "libvirt-1" +} + +{ + "return": { + }, + "id": "libvirt-1" +} + +{ + "execute": "query-version", + "id": "libvirt-2" +} + +{ + "return": { + "qemu": { + "micro": 50, + "minor": 1, + "major": 4 + }, + "package": "v4.1.0-1484-g3779d18011" + }, + "id": "libvirt-2" +} ... diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml new file mode 100644 index 0000000000..1c9a383816 --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml @@ -0,0 +1,3345 @@ +<qemuCaps> + <qemuctime>0</qemuctime> + <selfctime>0</selfctime> + <selfvers>0</selfvers> + <flag name='kvm'/> ... -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:37PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
.../caps_4.2.0.s390x.replies | 22414 ++++++++++++++++ .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 3345 +++ 2 files changed, 25759 insertions(+) create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.replies create mode 100644 tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch .../domaincapsschemadata/qemu_4.2.0.s390x.xml | 202 ++++++++++++++++++ tests/domaincapstest.c | 4 + 2 files changed, 206 insertions(+) create mode 100644 tests/domaincapsschemadata/qemu_4.2.0.s390x.xml diff --git a/tests/domaincapsschemadata/qemu_4.2.0.s390x.xml b/tests/domaincapsschemadata/qemu_4.2.0.s390x.xml new file mode 100644 index 0000000000..1ca3b78251 --- /dev/null +++ b/tests/domaincapsschemadata/qemu_4.2.0.s390x.xml @@ -0,0 +1,202 @@ +<domainCapabilities> + <path>/usr/bin/qemu-system-s390x</path> + <domain>kvm</domain> + <machine>s390-ccw-virtio-4.2</machine> + <arch>s390x</arch> + <vcpu max='248'/> + <iothreads supported='yes'/> + <os supported='yes'> + <enum name='firmware'/> + <loader supported='yes'> + <value>/usr/share/AAVMF/AAVMF_CODE.fd</value> + <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value> + <value>/usr/share/OVMF/OVMF_CODE.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'/> + <mode name='host-model' supported='yes'> + <model fallback='forbid'>z13.2-base</model> + <feature policy='require' name='aen'/> + <feature policy='require' name='aefsi'/> + <feature policy='require' name='msa5'/> + <feature policy='require' name='msa4'/> + <feature policy='require' name='msa3'/> + <feature policy='require' name='msa2'/> + <feature policy='require' name='msa1'/> + <feature policy='require' name='sthyi'/> + <feature policy='require' name='edat'/> + <feature policy='require' name='ri'/> + <feature policy='require' name='edat2'/> + <feature policy='require' name='vx'/> + <feature policy='require' name='ipter'/> + <feature policy='require' name='ap'/> + <feature policy='require' name='esop'/> + <feature policy='require' name='apft'/> + <feature policy='require' name='apqci'/> + <feature policy='require' name='cte'/> + <feature policy='require' name='bpb'/> + <feature policy='require' name='ppa15'/> + <feature policy='require' name='zpci'/> + <feature policy='require' name='sea_esop2'/> + <feature policy='require' name='te'/> + <feature policy='require' name='cmm'/> + </mode> + <mode name='custom' supported='yes'> + <model usable='yes'>z800-base</model> + <model usable='yes'>z890.2-base</model> + <model usable='yes'>z9EC.2</model> + <model usable='yes'>z13.2</model> + <model usable='yes'>z990.5-base</model> + <model usable='yes'>z9BC-base</model> + <model usable='yes'>z890.2</model> + <model usable='yes'>z890</model> + <model usable='yes'>z9BC</model> + <model usable='yes'>z13</model> + <model usable='yes'>z196</model> + <model usable='yes'>z13s</model> + <model usable='yes'>z990.3</model> + <model usable='yes'>z13s-base</model> + <model usable='yes'>z9EC</model> + <model usable='no'>gen15a</model> + <model usable='no'>z14ZR1-base</model> + <model usable='no'>z14.2-base</model> + <model usable='yes'>z900.3-base</model> + <model usable='yes'>z13.2-base</model> + <model usable='yes'>z196.2-base</model> + <model usable='yes'>zBC12-base</model> + <model usable='yes'>z9BC.2-base</model> + <model usable='yes'>z900.2-base</model> + <model usable='yes'>z9EC.3</model> + <model usable='yes'>zEC12</model> + <model usable='yes'>z900</model> + <model usable='yes'>z114-base</model> + <model usable='yes'>zEC12-base</model> + <model usable='yes'>z10EC.2</model> + <model usable='yes'>z10EC-base</model> + <model usable='yes'>z900.3</model> + <model usable='no'>z14ZR1</model> + <model usable='yes'>z10BC</model> + <model usable='yes'>z10BC.2-base</model> + <model usable='yes'>z9BC.2</model> + <model usable='yes'>z990.2</model> + <model usable='yes'>z990</model> + <model usable='no'>z14</model> + <model usable='no'>gen15b-base</model> + <model usable='yes'>z990.4</model> + <model usable='yes'>max</model> + <model usable='yes'>z10EC.2-base</model> + <model usable='no'>gen15a-base</model> + <model usable='yes'>z800</model> + <model usable='yes'>zEC12.2</model> + <model usable='yes'>z10EC</model> + <model usable='yes'>z990.2-base</model> + <model usable='yes'>z900-base</model> + <model usable='yes'>z10BC.2</model> + <model usable='yes'>z9EC-base</model> + <model usable='yes'>z9EC.3-base</model> + <model usable='yes'>z114</model> + <model usable='yes'>z890.3</model> + <model usable='yes'>z196-base</model> + <model usable='yes'>z9EC.2-base</model> + <model usable='yes'>z196.2</model> + <model usable='yes'>z990-base</model> + <model usable='no'>z14.2</model> + <model usable='yes'>z900.2</model> + <model usable='yes'>z890-base</model> + <model usable='yes'>z10EC.3</model> + <model usable='no'>z14-base</model> + <model usable='yes'>z990.4-base</model> + <model usable='yes'>z10EC.3-base</model> + <model usable='yes'>z10BC-base</model> + <model usable='yes'>z13-base</model> + <model usable='yes'>z990.3-base</model> + <model usable='yes'>zEC12.2-base</model> + <model usable='yes'>zBC12</model> + <model usable='yes'>z890.3-base</model> + <model usable='yes'>z990.5</model> + <model usable='no'>gen15b</model> + <model usable='no'>qemu</model> + </mode> + </cpu> + <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> + <value>virtio-transitional</value> + <value>virtio-non-transitional</value> + </enum> + </disk> + <graphics supported='yes'> + <enum name='type'> + <value>sdl</value> + <value>vnc</value> + </enum> + </graphics> + <video supported='yes'> + <enum name='modelType'> + <value>virtio</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>usb</value> + <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'> + <value>virtio</value> + <value>virtio-transitional</value> + <value>virtio-non-transitional</value> + </enum> + <enum name='backendModel'> + <value>random</value> + <value>egd</value> + </enum> + </rng> + </devices> + <features> + <gic supported='no'/> + <vmcoreinfo supported='no'/> + <genid supported='no'/> + <sev supported='no'/> + </features> +</domainCapabilities> diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index db14114cba..667311c2bd 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -468,6 +468,10 @@ mymain(void) "/usr/bin/qemu-system-aarch64", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.2.0", "caps_4.2.0", + "/usr/bin/qemu-system-s390x", NULL, + "s390x", VIR_DOMAIN_VIRT_KVM); + virObjectUnref(cfg); virFileWrapperClearPrefixes(); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:38PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
.../domaincapsschemadata/qemu_4.2.0.s390x.xml | 202 ++++++++++++++++++ tests/domaincapstest.c | 4 + 2 files changed, 206 insertions(+) create mode 100644 tests/domaincapsschemadata/qemu_4.2.0.s390x.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/conf/domain_capabilities.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index b0fdd15d6c..3224ec3f52 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -246,25 +246,20 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, virDomainCapsCPUUsable usable, char **blockers) { - char *nameCopy = NULL; - char **blockersCopy = NULL; + VIR_AUTOFREE(char *) nameCopy = NULL; + VIR_AUTOSTRINGLIST blockersCopy = NULL; if (VIR_STRNDUP(nameCopy, name, nameLen) < 0) - goto error; + return -1; if (virStringListCopy(&blockersCopy, (const char **)blockers) < 0) - goto error; + return -1; if (virDomainCapsCPUModelsAddSteal(cpuModels, &nameCopy, usable, &blockersCopy) < 0) - goto error; + return -1; return 0; - - error: - VIR_FREE(nameCopy); - virStringListFree(blockersCopy); - return -1; } -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:39PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - no change
src/conf/domain_capabilities.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> with the following squashed in: diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 3224ec3f52..a143386d0b 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -246,7 +246,7 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, virDomainCapsCPUUsable usable, char **blockers) { - VIR_AUTOFREE(char *) nameCopy = NULL; + g_autofree char *nameCopy = NULL; VIR_AUTOSTRINGLIST blockersCopy = NULL; if (VIR_STRNDUP(nameCopy, name, nameLen) < 0)

All callers use nameLen == -1 anyway. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/conf/domain_capabilities.c | 7 +++---- src/conf/domain_capabilities.h | 1 - src/qemu/qemu_capabilities.c | 2 +- tests/cputest.c | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index 3224ec3f52..ab8ebb650d 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -171,7 +171,7 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) for (i = 0; i < old->nmodels; i++) { if (virDomainCapsCPUModelsAdd(cpuModels, - old->models[i].name, -1, + old->models[i].name, old->models[i].usable, old->models[i].blockers) < 0) goto error; @@ -204,7 +204,7 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, continue; if (virDomainCapsCPUModelsAdd(cpuModels, - old->models[i].name, -1, + old->models[i].name, old->models[i].usable, old->models[i].blockers) < 0) goto error; @@ -242,14 +242,13 @@ virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, - ssize_t nameLen, virDomainCapsCPUUsable usable, char **blockers) { VIR_AUTOFREE(char *) nameCopy = NULL; VIR_AUTOSTRINGLIST blockersCopy = NULL; - if (VIR_STRNDUP(nameCopy, name, nameLen) < 0) + if (VIR_STRDUP(nameCopy, name) < 0) return -1; if (virStringListCopy(&blockersCopy, (const char **)blockers) < 0) diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 3a92194602..e3bd8d423e 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -204,7 +204,6 @@ int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char ***blockers); int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, - ssize_t nameLen, virDomainCapsCPUUsable usable, char **blockers); virDomainCapsCPUModelPtr diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index efd71d69c5..14939fc91d 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1879,7 +1879,7 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, } for (i = 0; i < count; i++) { - if (virDomainCapsCPUModelsAdd(cpus, name[i], -1, usable, NULL) < 0) + if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0) return -1; } diff --git a/tests/cputest.c b/tests/cputest.c index e3937c6fd6..7f47e3b601 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -863,7 +863,7 @@ cpuTestUpdateLive(const void *arg) usable = hvModel->usable; } - if (virDomainCapsCPUModelsAdd(models, expected->model, -1, + if (virDomainCapsCPUModelsAdd(models, expected->model, usable, blockers) < 0) goto cleanup; @@ -973,7 +973,7 @@ cpuTestInitModels(const char **list) return NULL; for (model = list; *model; model++) { - if (virDomainCapsCPUModelsAdd(cpus, *model, -1, + if (virDomainCapsCPUModelsAdd(cpus, *model, VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL) < 0) goto error; } -- 2.23.0

Rather than returning a direct pointer the list stored in qemuCaps the function now creates a new copy of the CPU models list. The main purpose of this seemingly useless change is to update callers to free the result returned by virQEMUCapsGetCPUDefinitions because the internals of this function will change significantly in the following patches. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 23 ++++++++++++++++++----- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 7 +++++-- tests/cputest.c | 1 - 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 14939fc91d..a40bf99aa3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1891,10 +1891,17 @@ virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainVirtType type) { + virDomainCapsCPUModelsPtr cpuModels; + if (type == VIR_DOMAIN_VIRT_KVM) - return qemuCaps->kvmCPUModels; + cpuModels = qemuCaps->kvmCPUModels; else - return qemuCaps->tcgCPUModels; + cpuModels = qemuCaps->tcgCPUModels; + + if (!cpuModels) + return NULL; + + return virDomainCapsCPUModelsCopy(cpuModels); } @@ -3125,6 +3132,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, virCPUDefPtr cpu, bool migratable) { + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; virCPUDataPtr data = NULL; int ret = -1; @@ -3134,7 +3142,9 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, if (!(data = virQEMUCapsGetCPUModelX86Data(qemuCaps, model, migratable))) goto cleanup; - if (cpuDecode(cpu, data, virQEMUCapsGetCPUDefinitions(qemuCaps, type)) < 0) + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + + if (cpuDecode(cpu, data, cpuModels) < 0) goto cleanup; ret = 0; @@ -3217,10 +3227,13 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) { goto error; } else if (rc == 1) { + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); - hostCPU = virQEMUCapsProbeHostCPU(hostArch, - virQEMUCapsGetCPUDefinitions(qemuCaps, type)); + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + hostCPU = virQEMUCapsProbeHostCPU(hostArch, cpuModels); + if (!hostCPU || virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6ce6348593..15c69667a5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13913,7 +13913,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, virQEMUCapsPtr qemuCaps = NULL; virArch arch; virDomainVirtType virttype; - virDomainCapsCPUModelsPtr cpuModels; + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; bool migratable; virCPUDefPtr cpu = NULL; char *cpustr = NULL; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9c50c4a1d8..58192612b0 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6122,6 +6122,8 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, /* nothing to update for host-passthrough */ if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) { + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + if (def->cpu->check == VIR_CPU_CHECK_PARTIAL && virCPUCompare(caps->host.arch, virQEMUCapsGetHostModel(qemuCaps, def->virtType, @@ -6134,8 +6136,9 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0) return -1; - if (virCPUTranslate(def->os.arch, def->cpu, - virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0) + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType); + + if (virCPUTranslate(def->os.arch, def->cpu, cpuModels) < 0) return -1; def->cpu->fallback = VIR_CPU_FALLBACK_FORBID; diff --git a/tests/cputest.c b/tests/cputest.c index 7f47e3b601..3aa8fd7bf3 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -551,7 +551,6 @@ cpuTestGetCPUModels(const struct data *data, return -1; *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM); - virObjectRef(*models); virObjectUnref(qemuCaps); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:41PM +0200, Jiri Denemark wrote:
Rather than returning a direct pointer the list stored in qemuCaps the function now creates a new copy of the CPU models list.
The main purpose of this seemingly useless change is to update callers to free the result returned by virQEMUCapsGetCPUDefinitions because the internals of this function will change significantly in the following patches.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - no change
src/qemu/qemu_capabilities.c | 23 ++++++++++++++++++----- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 7 +++++-- tests/cputest.c | 1 - 4 files changed, 24 insertions(+), 9 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> with the following squashed in: diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 264c7fc429..36500435fd 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -139,6 +139,8 @@ struct _virDomainCapsCPUModels { virDomainCapsCPUModelPtr models; }; +G_DEFINE_AUTOPTR_CLEANUP_FUNC(virDomainCapsCPUModels, virObjectUnref); + typedef struct _virDomainCapsCPU virDomainCapsCPU; typedef virDomainCapsCPU *virDomainCapsCPUPtr; struct _virDomainCapsCPU { diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a875896a73..e1750751b4 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3132,7 +3132,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, virCPUDefPtr cpu, bool migratable) { - VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; virCPUDataPtr data = NULL; int ret = -1; @@ -3227,7 +3227,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu, false)) < 0) { goto error; } else if (rc == 1) { - VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 78ba1f6f04..d95bf92cfd 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13913,7 +13913,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, virQEMUCapsPtr qemuCaps = NULL; virArch arch; virDomainVirtType virttype; - VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; bool migratable; virCPUDefPtr cpu = NULL; char *cpustr = NULL; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 539ab7ae33..9135a90a0d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6122,7 +6122,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, /* nothing to update for host-passthrough */ if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH) { - VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + g_autoptr(virDomainCapsCPUModels) cpuModels = NULL; if (def->cpu->check == VIR_CPU_CHECK_PARTIAL && virCPUCompare(caps->host.arch,

Some callers of virQEMUCapsGetCPUDefinitions will need to filter the returned list of CPU models. Let's add the filtering parameters directly to virQEMUCapsGetCPUDefinitions to avoid copying the CPU models list twice. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 11 ++++++++--- src/qemu/qemu_capabilities.h | 4 +++- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 2 +- tests/cputest.c | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a40bf99aa3..e6a7ee4f14 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1889,7 +1889,9 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, - virDomainVirtType type) + virDomainVirtType type, + const char **modelWhitelist, + const char **modelBlacklist) { virDomainCapsCPUModelsPtr cpuModels; @@ -1901,6 +1903,9 @@ virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, if (!cpuModels) return NULL; + if (modelWhitelist || modelBlacklist) + return virDomainCapsCPUModelsFilter(cpuModels, modelWhitelist, modelBlacklist); + return virDomainCapsCPUModelsCopy(cpuModels); } @@ -3142,7 +3147,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, if (!(data = virQEMUCapsGetCPUModelX86Data(qemuCaps, model, migratable))) goto cleanup; - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type, NULL, NULL); if (cpuDecode(cpu, data, cpuModels) < 0) goto cleanup; @@ -3231,7 +3236,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type); + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type, NULL, NULL); hostCPU = virQEMUCapsProbeHostCPU(hostArch, cpuModels); if (!hostCPU || diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 10f0ce2654..67dccc522e 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -570,7 +570,9 @@ int virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, size_t count, virDomainCapsCPUUsable usable); virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, - virDomainVirtType type); + virDomainVirtType type, + const char **modelWhitelist, + const char **modelBlacklist); virDomainCapsCPUModelsPtr virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virArch arch); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 15c69667a5..802f07fe92 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13939,7 +13939,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, if (!qemuCaps) goto cleanup; - if (!(cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, virttype)) || + if (!(cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, virttype, NULL, NULL)) || cpuModels->nmodels == 0) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("QEMU '%s' does not support any CPU models for " diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 58192612b0..f37acab9e4 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6136,7 +6136,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0) return -1; - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType); + cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType, NULL, NULL); if (virCPUTranslate(def->os.arch, def->cpu, cpuModels) < 0) return -1; diff --git a/tests/cputest.c b/tests/cputest.c index 3aa8fd7bf3..4428d451cf 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -550,7 +550,7 @@ cpuTestGetCPUModels(const struct data *data, if (!(qemuCaps = cpuTestMakeQEMUCaps(data))) return -1; - *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM); + *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM, NULL, NULL); virObjectUnref(qemuCaps); -- 2.23.0

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e6a7ee4f14..b608eb1a43 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -5297,24 +5297,17 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype, VIR_CPU_MODE_CUSTOM)) { - virDomainCapsCPUModelsPtr filtered = NULL; - char **models = NULL; const char *blacklist[] = { "host", NULL }; + VIR_AUTOSTRINGLIST models = NULL; if (virCPUGetModels(domCaps->arch, &models) >= 0) { - virDomainCapsCPUModelsPtr cpus; - - if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM) - cpus = qemuCaps->kvmCPUModels; - else - cpus = qemuCaps->tcgCPUModels; - - filtered = virDomainCapsCPUModelsFilter(cpus, - (const char **)models, - blacklist); - virStringListFree(models); + domCaps->cpu.custom = virQEMUCapsGetCPUDefinitions(qemuCaps, + domCaps->virttype, + (const char **)models, + blacklist); + } else { + domCaps->cpu.custom = NULL; } - domCaps->cpu.custom = filtered; } return 0; -- 2.23.0

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_monitor_json.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index d3447dd2f3..418bdcec92 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5527,8 +5527,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefInfoPtr **cpus) { int ret = -1; - virJSONValuePtr cmd; - virJSONValuePtr reply = NULL; + VIR_AUTOPTR(virJSONValue) cmd = NULL; + VIR_AUTOPTR(virJSONValue) reply = NULL; virJSONValuePtr data; qemuMonitorCPUDefInfoPtr *cpulist = NULL; size_t n = 0; @@ -5630,8 +5630,6 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefInfoFree(cpulist[i]); VIR_FREE(cpulist); } - virJSONValueFree(cmd); - virJSONValueFree(reply); return ret; } -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:44PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - no change
src/qemu/qemu_monitor_json.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 0b8a0dd96b..387548b2bf 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5527,8 +5527,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefInfoPtr **cpus) { int ret = -1; - VIR_AUTOPTR(virJSONValue) cmd = NULL; - VIR_AUTOPTR(virJSONValue) reply = NULL; + g_autoptr(virJSONValue) cmd = NULL; + g_autoptr(virJSONValue) reply = NULL; virJSONValuePtr data; qemuMonitorCPUDefInfoPtr *cpulist = NULL; size_t n = 0;

The function would return a valid virDomainCapsCPUModelsPtr with empty CPU models list if query-cpu-definitions exists in QEMU, but returns GenericError meaning it's not in fact implemented. This behaviour is a bit strange especially after such virDomainCapsCPUModels structure is stored in capabilities XML and parsed back, which will result in NULL virDomainCapsCPUModelsPtr rather than a structure containing nothing. Let's just keep virDomainCapsCPUModelsPtr NULL if the QMP command is not implemented and change the return value to int so that callers can easily check for failure or success. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch src/qemu/qemu_capabilities.c | 34 +++++++++++++++++++++------------- src/qemu/qemu_capabilities.h | 5 +++-- src/qemu/qemu_process.c | 17 ++++++++++------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index b608eb1a43..6fa5e06edb 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2452,17 +2452,26 @@ virQEMUCapsProbeQMPMachineProps(virQEMUCapsPtr qemuCaps, } -virDomainCapsCPUModelsPtr +int virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, - virArch arch) + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels) { virDomainCapsCPUModelsPtr models = NULL; qemuMonitorCPUDefInfoPtr *cpus = NULL; int ncpus = 0; size_t i; + int ret = -1; + + *cpuModels = NULL; if ((ncpus = qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0) - return NULL; + return -1; + + if (ncpus == 0) { + ret = 0; + goto cleanup; + } /* QEMU 2.11 for Power renamed all CPU models to lower case, we need to * translate them back to libvirt's upper case model names. */ @@ -2471,7 +2480,7 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, char **name; if (virCPUGetModels(arch, &libvirtModels) < 0) - goto error; + goto cleanup; for (name = libvirtModels; name && *name; name++) { for (i = 0; i < ncpus; i++) { @@ -2480,13 +2489,13 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, VIR_FREE(cpus[i]->name); if (VIR_STRDUP(cpus[i]->name, *name) < 0) - goto error; + goto cleanup; } } } if (!(models = virDomainCapsCPUModelsNew(ncpus))) - goto error; + goto cleanup; for (i = 0; i < ncpus; i++) { virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; @@ -2498,19 +2507,18 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable, &cpus[i]->blockers) < 0) - goto error; + goto cleanup; } + VIR_STEAL_PTR(*cpuModels, models); + ret = 0; + cleanup: for (i = 0; i < ncpus; i++) qemuMonitorCPUDefInfoFree(cpus[i]); VIR_FREE(cpus); - return models; - - error: virObjectUnref(models); - models = NULL; - goto cleanup; + return ret; } @@ -2524,7 +2532,7 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps, if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS)) return 0; - if (!(models = virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch))) + if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &models) < 0) return -1; if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 67dccc522e..ba3fe3d2b6 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -573,8 +573,9 @@ virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainVirtType type, const char **modelWhitelist, const char **modelBlacklist); -virDomainCapsCPUModelsPtr virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, - virArch arch); +int virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels); typedef enum { /* Host CPU definition reported in domain capabilities. */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f37acab9e4..93fe994f8e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4353,27 +4353,30 @@ qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver, } -static virDomainCapsCPUModelsPtr +static int qemuProcessFetchCPUDefinitions(virQEMUDriverPtr driver, virDomainObjPtr vm, - qemuDomainAsyncJob asyncJob) + qemuDomainAsyncJob asyncJob, + virDomainCapsCPUModelsPtr *cpuModels) { qemuDomainObjPrivatePtr priv = vm->privateData; virDomainCapsCPUModelsPtr models = NULL; + int rc; if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) goto error; - models = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch); + rc = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch, &models); - if (qemuDomainObjExitMonitor(driver, vm) < 0) + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) goto error; - return models; + *cpuModels = models; + return 0; error: virObjectUnref(models); - return NULL; + return -1; } @@ -4398,7 +4401,7 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver, if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0) goto cleanup; - if (!(models = qemuProcessFetchCPUDefinitions(driver, vm, asyncJob)) || + if (qemuProcessFetchCPUDefinitions(driver, vm, asyncJob, &models) < 0 || virCPUTranslate(vm->def->os.arch, vm->def->cpu, models) < 0) goto cleanup; -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:45PM +0200, Jiri Denemark wrote:
The function would return a valid virDomainCapsCPUModelsPtr with empty CPU models list if query-cpu-definitions exists in QEMU, but returns GenericError meaning it's not in fact implemented. This behaviour is a bit strange especially after such virDomainCapsCPUModels structure is stored in capabilities XML and parsed back, which will result in NULL virDomainCapsCPUModelsPtr rather than a structure containing nothing.
Let's just keep virDomainCapsCPUModelsPtr NULL if the QMP command is not implemented and change the return value to int so that callers can easily check for failure or success.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
src/qemu/qemu_capabilities.c | 34 +++++++++++++++++++++------------- src/qemu/qemu_capabilities.h | 5 +++-- src/qemu/qemu_process.c | 17 ++++++++++------- 3 files changed, 34 insertions(+), 22 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Your call whether you consider squashing in the following, since VIR_STEAL_PTR still hasn't been eliminated: diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index c8b3b65aad..8e0fae54d7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2510,7 +2510,7 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, goto cleanup; } - VIR_STEAL_PTR(*cpuModels, models); + *cpuModels = g_steal_pointer(&models); ret = 0; cleanup:

It is a container for a CPU models list (qemuMonitorCPUDefInfo) and a number of elements in this list. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - v1 reviewed by Ján Tomko, but the patch had to be changed because of the previous patch src/qemu/qemu_capabilities.c | 30 +++++++++---------- src/qemu/qemu_monitor.c | 39 +++++++++++++++++++------ src/qemu/qemu_monitor.h | 14 +++++++-- src/qemu/qemu_monitor_json.c | 56 ++++++++++++++---------------------- src/qemu/qemu_monitor_json.h | 2 +- tests/qemumonitorjsontest.c | 38 +++++++++--------------- 6 files changed, 93 insertions(+), 86 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 6fa5e06edb..59af3ab6d3 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2457,18 +2457,17 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virArch arch, virDomainCapsCPUModelsPtr *cpuModels) { + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; virDomainCapsCPUModelsPtr models = NULL; - qemuMonitorCPUDefInfoPtr *cpus = NULL; - int ncpus = 0; size_t i; int ret = -1; *cpuModels = NULL; - if ((ncpus = qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0) + if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; - if (ncpus == 0) { + if (!defs) { ret = 0; goto cleanup; } @@ -2483,30 +2482,30 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, goto cleanup; for (name = libvirtModels; name && *name; name++) { - for (i = 0; i < ncpus; i++) { - if (STRCASENEQ(cpus[i]->name, *name)) + for (i = 0; i < defs->ncpus; i++) { + if (STRCASENEQ(defs->cpus[i]->name, *name)) continue; - VIR_FREE(cpus[i]->name); - if (VIR_STRDUP(cpus[i]->name, *name) < 0) + VIR_FREE(defs->cpus[i]->name); + if (VIR_STRDUP(defs->cpus[i]->name, *name) < 0) goto cleanup; } } } - if (!(models = virDomainCapsCPUModelsNew(ncpus))) + if (!(models = virDomainCapsCPUModelsNew(defs->ncpus))) goto cleanup; - for (i = 0; i < ncpus; i++) { + for (i = 0; i < defs->ncpus; i++) { virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; - if (cpus[i]->usable == VIR_TRISTATE_BOOL_YES) + if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_YES) usable = VIR_DOMCAPS_CPU_USABLE_YES; - else if (cpus[i]->usable == VIR_TRISTATE_BOOL_NO) + else if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_NO) usable = VIR_DOMCAPS_CPU_USABLE_NO; - if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable, - &cpus[i]->blockers) < 0) + if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i]->name, usable, + &defs->cpus[i]->blockers) < 0) goto cleanup; } @@ -2514,9 +2513,6 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, ret = 0; cleanup: - for (i = 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); virObjectUnref(models); return ret; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 49f9159315..d17387d27f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3538,25 +3538,48 @@ qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine) int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - VIR_DEBUG("cpus=%p", cpus); + VIR_DEBUG("cpuDefs=%p", cpuDefs); QEMU_CHECK_MONITOR(mon); - return qemuMonitorJSONGetCPUDefinitions(mon, cpus); + return qemuMonitorJSONGetCPUDefinitions(mon, cpuDefs); } void -qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu) +qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) { - if (!cpu) + size_t i; + + if (!defs) return; - virStringListFree(cpu->blockers); - VIR_FREE(cpu->name); - VIR_FREE(cpu); + for (i = 0; i < defs->ncpus; i++) { + virStringListFree(defs->cpus[i]->blockers); + VIR_FREE(defs->cpus[i]->name); + VIR_FREE(defs->cpus[i]); + } + + VIR_FREE(defs->cpus); + VIR_FREE(defs); +} + + +qemuMonitorCPUDefsPtr +qemuMonitorCPUDefsNew(size_t count) +{ + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + + if (VIR_ALLOC(defs) < 0) + return NULL; + + if (count > 0 && VIR_ALLOC_N(defs->cpus, count) < 0) + return NULL; + + defs->ncpus = count; + VIR_RETURN_PTR(defs); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 536ba7893b..359bbfca7f 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1101,9 +1101,19 @@ struct _qemuMonitorCPUDefInfo { char **blockers; /* NULL-terminated string list */ }; +typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs; +typedef qemuMonitorCPUDefs *qemuMonitorCPUDefsPtr; +struct _qemuMonitorCPUDefs { + size_t ncpus; + qemuMonitorCPUDefInfoPtr *cpus; +}; + int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus); -void qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu); + qemuMonitorCPUDefsPtr *cpuDefs); +qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count); +void qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs); +VIR_DEFINE_AUTOPTR_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); + typedef enum { QEMU_MONITOR_CPU_PROPERTY_BOOLEAN, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 418bdcec92..664f1b225e 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5524,60 +5524,57 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) { - int ret = -1; + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; VIR_AUTOPTR(virJSONValue) cmd = NULL; VIR_AUTOPTR(virJSONValue) reply = NULL; virJSONValuePtr data; - qemuMonitorCPUDefInfoPtr *cpulist = NULL; - size_t n = 0; + size_t ncpus; size_t i; - *cpus = NULL; + *cpuDefs = NULL; if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-definitions", NULL))) return -1; if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) - goto cleanup; + return -1; /* Urgh, some QEMU architectures have the query-cpu-definitions * command, but return 'GenericError' with string "Not supported", * instead of simply omitting the command entirely :-( */ - if (qemuMonitorJSONHasError(reply, "GenericError")) { - ret = 0; - goto cleanup; - } + if (qemuMonitorJSONHasError(reply, "GenericError")) + return 0; if (qemuMonitorJSONCheckReply(cmd, reply, VIR_JSON_TYPE_ARRAY) < 0) - goto cleanup; + return -1; data = virJSONValueObjectGetArray(reply, "return"); - n = virJSONValueArraySize(data); + ncpus = virJSONValueArraySize(data); - if (VIR_ALLOC_N(cpulist, n) < 0) - goto cleanup; + if (!(defs = qemuMonitorCPUDefsNew(ncpus))) + return -1; - for (i = 0; i < n; i++) { + for (i = 0; i < defs->ncpus; i++) { virJSONValuePtr child = virJSONValueArrayGet(data, i); const char *tmp; qemuMonitorCPUDefInfoPtr cpu; if (VIR_ALLOC(cpu) < 0) - goto cleanup; + return -1; - cpulist[i] = cpu; + defs->cpus[i] = cpu; if (!(tmp = virJSONValueObjectGetString(child, "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("query-cpu-definitions reply data was missing 'name'")); - goto cleanup; + return -1; } if (VIR_STRDUP(cpu->name, tmp) < 0) - goto cleanup; + return -1; if (virJSONValueObjectHasKey(child, "unavailable-features")) { virJSONValuePtr blockers; @@ -5590,7 +5587,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unavailable-features in query-cpu-definitions " "reply data was not an array")); - goto cleanup; + return -1; } len = virJSONValueArraySize(blockers); @@ -5602,7 +5599,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, cpu->usable = VIR_TRISTATE_BOOL_NO; if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0) - goto cleanup; + return -1; for (j = 0; j < len; j++) { virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j); @@ -5611,26 +5608,17 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected value in unavailable-features " "array")); - goto cleanup; + return -1; } if (VIR_STRDUP(cpu->blockers[j], virJSONValueGetString(blocker)) < 0) - goto cleanup; + return -1; } } } - ret = n; - *cpus = cpulist; - cpulist = NULL; - - cleanup: - if (cpulist) { - for (i = 0; i < n; i++) - qemuMonitorCPUDefInfoFree(cpulist[i]); - VIR_FREE(cpulist); - } - return ret; + VIR_STEAL_PTR(*cpuDefs, defs); + return 0; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 975de3759a..1b4b3abd72 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -376,7 +376,7 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, ATTRIBUTE_NONNULL(2); int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, - qemuMonitorCPUDefInfoPtr **cpus) + qemuMonitorCPUDefsPtr *cpuDefs) ATTRIBUTE_NONNULL(2); int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 1248db59f2..7b8f63b11e 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -428,10 +428,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) { const testGenericData *data = opaque; virDomainXMLOptionPtr xmlopt = data->xmlopt; - int ret = -1; - qemuMonitorCPUDefInfoPtr *cpus = NULL; - int ncpus = 0; - size_t i; + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; VIR_AUTOPTR(qemuMonitorTest) test = NULL; if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema))) @@ -453,31 +450,30 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) " } " " ]" "}") < 0) - goto cleanup; + return -1; - if ((ncpus = qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), - &cpus)) < 0) - goto cleanup; + if (qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), &defs) < 0) + return -1; - if (ncpus != 3) { + if (defs->ncpus != 3) { virReportError(VIR_ERR_INTERNAL_ERROR, - "ncpus %d is not 3", ncpus); - goto cleanup; + "ncpus %zu is not 3", defs->ncpus); + return -1; } #define CHECK_FULL(i, wantname, Usable) \ do { \ - if (STRNEQ(cpus[i]->name, (wantname))) { \ + if (STRNEQ(defs->cpus[i]->name, (wantname))) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "name %s is not %s", \ - cpus[i]->name, (wantname)); \ - goto cleanup; \ + defs->cpus[i]->name, (wantname)); \ + return -1; \ } \ - if (cpus[i]->usable != (Usable)) { \ + if (defs->cpus[i]->usable != (Usable)) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "%s: expecting usable flag %d, got %d", \ - cpus[i]->name, Usable, cpus[i]->usable); \ - goto cleanup; \ + defs->cpus[i]->name, Usable, defs->cpus[i]->usable); \ + return -1; \ } \ } while (0) @@ -496,13 +492,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) #undef CHECK_USABLE #undef CHECK_FULL - ret = 0; - - cleanup: - for (i = 0; i < ncpus; i++) - qemuMonitorCPUDefInfoFree(cpus[i]); - VIR_FREE(cpus); - return ret; + return 0; } -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:46PM +0200, Jiri Denemark wrote:
It is a container for a CPU models list (qemuMonitorCPUDefInfo) and a number of elements in this list.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - v1 reviewed by Ján Tomko, but the patch had to be changed because of the previous patch
src/qemu/qemu_capabilities.c | 30 +++++++++---------- src/qemu/qemu_monitor.c | 39 +++++++++++++++++++------ src/qemu/qemu_monitor.h | 14 +++++++-- src/qemu/qemu_monitor_json.c | 56 ++++++++++++++---------------------- src/qemu/qemu_monitor_json.h | 2 +- tests/qemumonitorjsontest.c | 38 +++++++++--------------- 6 files changed, 93 insertions(+), 86 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 3384b538d0..e4e8d2ed0c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2457,7 +2457,7 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virArch arch, virDomainCapsCPUModelsPtr *cpuModels) { - VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; virDomainCapsCPUModelsPtr models = NULL; size_t i; int ret = -1; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2cce9af929..d1a53f82cb 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3557,29 +3557,25 @@ qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) return; for (i = 0; i < defs->ncpus; i++) { - virStringListFree(defs->cpus[i]->blockers); - VIR_FREE(defs->cpus[i]->name); - VIR_FREE(defs->cpus[i]); + g_strfreev(defs->cpus[i]->blockers); + g_free(defs->cpus[i]->name); + g_free(defs->cpus[i]); } - VIR_FREE(defs->cpus); - VIR_FREE(defs); + g_free(defs->cpus); + g_free(defs); } qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count) { - VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; - - if (VIR_ALLOC(defs) < 0) - return NULL; - - if (count > 0 && VIR_ALLOC_N(defs->cpus, count) < 0) - return NULL; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; + defs = g_new0(qemuMonitorCPUDefs, 1); + defs->cpus = g_new0(qemuMonitorCPUDefInfoPtr, count); defs->ncpus = count; - VIR_RETURN_PTR(defs); + return g_steal_pointer(&defs); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 3bce9a971d..4fed575fd3 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1112,7 +1112,7 @@ int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefsPtr *cpuDefs); qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count); void qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs); -VIR_DEFINE_AUTOPTR_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); typedef enum { diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 104d3a9fc0..b114fabbe0 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -428,7 +428,7 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) { const testGenericData *data = opaque; virDomainXMLOptionPtr xmlopt = data->xmlopt; - VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; g_autoptr(qemuMonitorTest) test = NULL; if (!(test = qemuMonitorTestNewSchema(xmlopt, data->schema)))

Let's store qemuMonitorCPUDefInfo directly in the array of CPUs in qemuMonitorCPUDefs rather then using an array of pointers. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - trivial rebase src/qemu/qemu_capabilities.c | 14 +++++++------- src/qemu/qemu_monitor.c | 5 ++--- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.c | 7 +------ tests/qemumonitorjsontest.c | 8 ++++---- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 59af3ab6d3..442445aad9 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2483,11 +2483,11 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, for (name = libvirtModels; name && *name; name++) { for (i = 0; i < defs->ncpus; i++) { - if (STRCASENEQ(defs->cpus[i]->name, *name)) + if (STRCASENEQ(defs->cpus[i].name, *name)) continue; - VIR_FREE(defs->cpus[i]->name); - if (VIR_STRDUP(defs->cpus[i]->name, *name) < 0) + VIR_FREE(defs->cpus[i].name); + if (VIR_STRDUP(defs->cpus[i].name, *name) < 0) goto cleanup; } } @@ -2499,13 +2499,13 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, for (i = 0; i < defs->ncpus; i++) { virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; - if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_YES) + if (defs->cpus[i].usable == VIR_TRISTATE_BOOL_YES) usable = VIR_DOMCAPS_CPU_USABLE_YES; - else if (defs->cpus[i]->usable == VIR_TRISTATE_BOOL_NO) + else if (defs->cpus[i].usable == VIR_TRISTATE_BOOL_NO) usable = VIR_DOMCAPS_CPU_USABLE_NO; - if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i]->name, usable, - &defs->cpus[i]->blockers) < 0) + if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i].name, usable, + &defs->cpus[i].blockers) < 0) goto cleanup; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index d17387d27f..87a9d06d45 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3557,9 +3557,8 @@ qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) return; for (i = 0; i < defs->ncpus; i++) { - virStringListFree(defs->cpus[i]->blockers); - VIR_FREE(defs->cpus[i]->name); - VIR_FREE(defs->cpus[i]); + virStringListFree(defs->cpus[i].blockers); + VIR_FREE(defs->cpus[i].name); } VIR_FREE(defs->cpus); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 359bbfca7f..aa2a0e392a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1105,7 +1105,7 @@ typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs; typedef qemuMonitorCPUDefs *qemuMonitorCPUDefsPtr; struct _qemuMonitorCPUDefs { size_t ncpus; - qemuMonitorCPUDefInfoPtr *cpus; + qemuMonitorCPUDefInfoPtr cpus; }; int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 664f1b225e..de75c46dc1 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5560,12 +5560,7 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, for (i = 0; i < defs->ncpus; i++) { virJSONValuePtr child = virJSONValueArrayGet(data, i); const char *tmp; - qemuMonitorCPUDefInfoPtr cpu; - - if (VIR_ALLOC(cpu) < 0) - return -1; - - defs->cpus[i] = cpu; + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i; if (!(tmp = virJSONValueObjectGetString(child, "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 7b8f63b11e..18ccf271f5 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -463,16 +463,16 @@ testQemuMonitorJSONGetCPUDefinitions(const void *opaque) #define CHECK_FULL(i, wantname, Usable) \ do { \ - if (STRNEQ(defs->cpus[i]->name, (wantname))) { \ + if (STRNEQ(defs->cpus[i].name, (wantname))) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "name %s is not %s", \ - defs->cpus[i]->name, (wantname)); \ + defs->cpus[i].name, (wantname)); \ return -1; \ } \ - if (defs->cpus[i]->usable != (Usable)) { \ + if (defs->cpus[i].usable != (Usable)) { \ virReportError(VIR_ERR_INTERNAL_ERROR, \ "%s: expecting usable flag %d, got %d", \ - defs->cpus[i]->name, Usable, defs->cpus[i]->usable); \ + defs->cpus[i].name, Usable, defs->cpus[i].usable); \ return -1; \ } \ } while (0) -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:47PM +0200, Jiri Denemark wrote:
Let's store qemuMonitorCPUDefInfo directly in the array of CPUs in qemuMonitorCPUDefs rather then using an array of pointers.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - trivial rebase
src/qemu/qemu_capabilities.c | 14 +++++++------- src/qemu/qemu_monitor.c | 5 ++--- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.c | 7 +------ tests/qemumonitorjsontest.c | 8 ++++---- 5 files changed, 15 insertions(+), 21 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> @@ -3573,7 +3572,7 @@ qemuMonitorCPUDefsNew(size_t count) g_autoptr(qemuMonitorCPUDefs) defs = NULL; defs = g_new0(qemuMonitorCPUDefs, 1); - defs->cpus = g_new0(qemuMonitorCPUDefInfoPtr, count); + defs->cpus = g_new0(qemuMonitorCPUDefInfo, count); defs->ncpus = count; return g_steal_pointer(&defs); }

On Wed, Oct 16, 2019 at 13:15:19 +0200, Ján Tomko wrote:
On Tue, Oct 15, 2019 at 05:34:47PM +0200, Jiri Denemark wrote:
Let's store qemuMonitorCPUDefInfo directly in the array of CPUs in qemuMonitorCPUDefs rather then using an array of pointers.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - trivial rebase
src/qemu/qemu_capabilities.c | 14 +++++++------- src/qemu/qemu_monitor.c | 5 ++--- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.c | 7 +------ tests/qemumonitorjsontest.c | 8 ++++---- 5 files changed, 15 insertions(+), 21 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com>
@@ -3573,7 +3572,7 @@ qemuMonitorCPUDefsNew(size_t count) g_autoptr(qemuMonitorCPUDefs) defs = NULL;
defs = g_new0(qemuMonitorCPUDefs, 1); - defs->cpus = g_new0(qemuMonitorCPUDefInfoPtr, count); + defs->cpus = g_new0(qemuMonitorCPUDefInfo, count); defs->ncpus = count; return g_steal_pointer(&defs); }
Looks like a change in something that doesn't exist yet :-)

On Wed, Oct 16, 2019 at 05:46:24PM +0200, Jiri Denemark wrote:
On Wed, Oct 16, 2019 at 13:15:19 +0200, Ján Tomko wrote:
On Tue, Oct 15, 2019 at 05:34:47PM +0200, Jiri Denemark wrote:
Let's store qemuMonitorCPUDefInfo directly in the array of CPUs in qemuMonitorCPUDefs rather then using an array of pointers.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - trivial rebase
src/qemu/qemu_capabilities.c | 14 +++++++------- src/qemu/qemu_monitor.c | 5 ++--- src/qemu/qemu_monitor.h | 2 +- src/qemu/qemu_monitor_json.c | 7 +------ tests/qemumonitorjsontest.c | 8 ++++---- 5 files changed, 15 insertions(+), 21 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com>
@@ -3573,7 +3572,7 @@ qemuMonitorCPUDefsNew(size_t count) g_autoptr(qemuMonitorCPUDefs) defs = NULL;
defs = g_new0(qemuMonitorCPUDefs, 1); - defs->cpus = g_new0(qemuMonitorCPUDefInfoPtr, count); + defs->cpus = g_new0(qemuMonitorCPUDefInfo, count); defs->ncpus = count; return g_steal_pointer(&defs); }
Looks like a change in something that doesn't exist yet :-)
Yes, it's exactly what it looks like! :) Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/libvirt_private.syms | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 7d62df8086..1af18b880b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3077,6 +3077,7 @@ virStringIsEmpty; virStringIsPrintable; virStringListAdd; virStringListAutoFree; +virStringListCopy; virStringListFree; virStringListFreeCount; virStringListGetFirstWithPrefix; -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:48PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/libvirt_private.syms | 1 + 1 file changed, 1 insertion(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_monitor.c | 33 +++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 87a9d06d45..8d86112f30 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3582,6 +3582,39 @@ qemuMonitorCPUDefsNew(size_t count) } +int +qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr *dst, + qemuMonitorCPUDefsPtr src) +{ + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + size_t i; + + if (!src) { + *dst = NULL; + return 0; + } + + if (!(defs = qemuMonitorCPUDefsNew(src->ncpus))) + return -1; + + defs->ncpus = src->ncpus; + for (i = 0; i < src->ncpus; i++) { + qemuMonitorCPUDefInfoPtr cpuDst = defs->cpus + i; + qemuMonitorCPUDefInfoPtr cpuSrc = src->cpus + i; + + cpuDst->usable = cpuSrc->usable; + + if (VIR_STRDUP(cpuDst->name, cpuSrc->name) < 0 || + virStringListCopy(&cpuDst->blockers, + (const char **)cpuSrc->blockers) < 0) + return -1; + } + + VIR_STEAL_PTR(*dst, defs); + return 0; +} + + int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon, qemuMonitorCPUModelExpansionType type, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index aa2a0e392a..4f355c760a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1111,6 +1111,8 @@ struct _qemuMonitorCPUDefs { int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, qemuMonitorCPUDefsPtr *cpuDefs); qemuMonitorCPUDefsPtr qemuMonitorCPUDefsNew(size_t count); +int qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr *dst, + qemuMonitorCPUDefsPtr src); void qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs); VIR_DEFINE_AUTOPTR_FUNC(qemuMonitorCPUDefs, qemuMonitorCPUDefsFree); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:49PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/qemu/qemu_monitor.c | 33 +++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 2 ++ 2 files changed, 35 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index adb6befe4a..614fee98c1 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3582,7 +3582,7 @@ int qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr *dst, qemuMonitorCPUDefsPtr src) { - VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + g_autoptr(qemuMonitorCPUDefs) defs = NULL; size_t i; if (!src) { @@ -3599,14 +3599,11 @@ qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr *dst, qemuMonitorCPUDefInfoPtr cpuSrc = src->cpus + i; cpuDst->usable = cpuSrc->usable; - - if (VIR_STRDUP(cpuDst->name, cpuSrc->name) < 0 || - virStringListCopy(&cpuDst->blockers, - (const char **)cpuSrc->blockers) < 0) - return -1; + cpuDst->name = g_strdup(cpuSrc->name); + cpuDst->blockers = g_strdupv(cpuSrc->blockers); } - VIR_STEAL_PTR(*dst, defs); + *dst = g_steal_pointer(&defs); return 0; }

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 58 +++++++++++++++--------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 442445aad9..e38ad03ab5 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3474,15 +3474,10 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, virDomainVirtType type) { virDomainCapsCPUModelsPtr cpus = NULL; - xmlNodePtr *nodes = NULL; - char *str = NULL; + VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; size_t i; int n; - int ret = -1; xmlNodePtr node; - xmlNodePtr *blockerNodes = NULL; - char **blockers = NULL; - int nblockers; if (type == VIR_DOMAIN_VIRT_KVM) n = virXPathNodeSet("./cpu[@type='kvm']", ctxt, &nodes); @@ -3492,16 +3487,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (n < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to parse qemu capabilities cpus")); - goto cleanup; + return -1; } - if (n == 0) { - ret = 0; - goto cleanup; - } + if (n == 0) + return 0; if (!(cpus = virDomainCapsCPUModelsNew(n))) - goto cleanup; + return -1; if (type == VIR_DOMAIN_VIRT_KVM) qemuCaps->kvmCPUModels = cpus; @@ -3510,19 +3503,24 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, for (i = 0; i < n; i++) { int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; - - if ((str = virXMLPropString(nodes[i], "usable")) && - (usable = virDomainCapsCPUUsableTypeFromString(str)) < 0) { + VIR_AUTOFREE(char *) strUsable = NULL; + VIR_AUTOFREE(char *) name = NULL; + VIR_AUTOFREE(xmlNodePtr *) blockerNodes = NULL; + VIR_AUTOSTRINGLIST blockers = NULL; + int nblockers; + + if ((strUsable = virXMLPropString(nodes[i], "usable")) && + (usable = virDomainCapsCPUUsableTypeFromString(strUsable)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("unknown value '%s' in attribute 'usable'"), str); - goto cleanup; + _("unknown value '%s' in attribute 'usable'"), + strUsable); + return -1; } - VIR_FREE(str); - if (!(str = virXMLPropString(nodes[i], "name"))) { + if (!(name = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing cpu name in QEMU capabilities cache")); - goto cleanup; + return -1; } node = ctxt->node; @@ -3533,38 +3531,30 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (nblockers < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to parse CPU blockers in QEMU capabilities")); - goto cleanup; + return -1; } if (nblockers > 0) { size_t j; if (VIR_ALLOC_N(blockers, nblockers + 1) < 0) - goto cleanup; + return -1; for (j = 0; j < nblockers; j++) { if (!(blockers[j] = virXMLPropString(blockerNodes[j], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing blocker name in QEMU " "capabilities cache")); - goto cleanup; + return -1; } } - VIR_FREE(blockerNodes); } - if (virDomainCapsCPUModelsAddSteal(cpus, &str, usable, &blockers) < 0) - goto cleanup; + if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0) + return -1; } - ret = 0; - - cleanup: - VIR_FREE(nodes); - VIR_FREE(str); - VIR_FREE(blockerNodes); - virStringListFree(blockers); - return ret; + return 0; } -- 2.23.0

The function translates qemuMonitorCPUDefsPtr (used by QEMU caps probing code) into virDomainCapsCPUModelsPtr used by domain capabilities. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - trivial rebase src/qemu/qemu_capabilities.c | 71 +++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e38ad03ab5..87ac9bacdc 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1887,6 +1887,41 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, } +static virDomainCapsCPUModelsPtr +virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefsPtr defs, + const char **modelWhitelist, + const char **modelBlacklist) +{ + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL; + size_t i; + + if (!(cpuModels = virDomainCapsCPUModelsNew(defs->ncpus))) + return NULL; + + for (i = 0; i < defs->ncpus; i++) { + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i; + virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; + + if (modelWhitelist && !virStringListHasString(modelWhitelist, cpu->name)) + continue; + + if (modelBlacklist && virStringListHasString(modelBlacklist, cpu->name)) + continue; + + if (cpu->usable == VIR_TRISTATE_BOOL_YES) + usable = VIR_DOMCAPS_CPU_USABLE_YES; + else if (cpu->usable == VIR_TRISTATE_BOOL_NO) + usable = VIR_DOMCAPS_CPU_USABLE_NO; + + if (virDomainCapsCPUModelsAdd(cpuModels, cpu->name, + usable, cpu->blockers) < 0) + return NULL; + } + + VIR_RETURN_PTR(cpuModels); +} + + virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainVirtType type, @@ -2458,19 +2493,15 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, virDomainCapsCPUModelsPtr *cpuModels) { VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; - virDomainCapsCPUModelsPtr models = NULL; size_t i; - int ret = -1; *cpuModels = NULL; if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; - if (!defs) { - ret = 0; - goto cleanup; - } + if (!defs) + return 0; /* QEMU 2.11 for Power renamed all CPU models to lower case, we need to * translate them back to libvirt's upper case model names. */ @@ -2479,7 +2510,7 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, char **name; if (virCPUGetModels(arch, &libvirtModels) < 0) - goto cleanup; + return -1; for (name = libvirtModels; name && *name; name++) { for (i = 0; i < defs->ncpus; i++) { @@ -2488,33 +2519,15 @@ virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, VIR_FREE(defs->cpus[i].name); if (VIR_STRDUP(defs->cpus[i].name, *name) < 0) - goto cleanup; + return -1; } } } - if (!(models = virDomainCapsCPUModelsNew(defs->ncpus))) - goto cleanup; - - for (i = 0; i < defs->ncpus; i++) { - virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; - - if (defs->cpus[i].usable == VIR_TRISTATE_BOOL_YES) - usable = VIR_DOMCAPS_CPU_USABLE_YES; - else if (defs->cpus[i].usable == VIR_TRISTATE_BOOL_NO) - usable = VIR_DOMCAPS_CPU_USABLE_NO; - - if (virDomainCapsCPUModelsAddSteal(models, &defs->cpus[i].name, usable, - &defs->cpus[i].blockers) < 0) - goto cleanup; - } - - VIR_STEAL_PTR(*cpuModels, models); - ret = 0; + if (!(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL))) + return -1; - cleanup: - virObjectUnref(models); - return ret; + return 0; } -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:51PM +0200, Jiri Denemark wrote:
The function translates qemuMonitorCPUDefsPtr (used by QEMU caps probing code) into virDomainCapsCPUModelsPtr used by domain capabilities.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - trivial rebase
src/qemu/qemu_capabilities.c | 71 +++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 29 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index e38ad03ab5..87ac9bacdc 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1887,6 +1887,41 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, }
+static virDomainCapsCPUModelsPtr +virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefsPtr defs, + const char **modelWhitelist, + const char **modelBlacklist) +{ + VIR_AUTOUNREF(virDomainCapsCPUModelsPtr) cpuModels = NULL;
g_autoptr
+ size_t i; + + if (!(cpuModels = virDomainCapsCPUModelsNew(defs->ncpus))) + return NULL; + + for (i = 0; i < defs->ncpus; i++) { + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i; + virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; + + if (modelWhitelist && !virStringListHasString(modelWhitelist, cpu->name)) + continue; + + if (modelBlacklist && virStringListHasString(modelBlacklist, cpu->name)) + continue; + + if (cpu->usable == VIR_TRISTATE_BOOL_YES) + usable = VIR_DOMCAPS_CPU_USABLE_YES; + else if (cpu->usable == VIR_TRISTATE_BOOL_NO) + usable = VIR_DOMCAPS_CPU_USABLE_NO; + + if (virDomainCapsCPUModelsAdd(cpuModels, cpu->name, + usable, cpu->blockers) < 0) + return NULL; + } + + VIR_RETURN_PTR(cpuModels);
return g_steal_pointer(&cpuModels); Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

The functions return virDomainCapsCPUModelsPtr and thus they should be called *CPUModels for consistency. Functions called *CPUDefinitions will work on qemuMonitorCPUDefsPtr. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch src/qemu/qemu_capabilities.c | 28 ++++++++++++++-------------- src/qemu/qemu_capabilities.h | 14 +++++++------- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 4 ++-- tests/cputest.c | 2 +- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 87ac9bacdc..cdc3a2d4b0 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1923,10 +1923,10 @@ virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefsPtr defs, virDomainCapsCPUModelsPtr -virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, - virDomainVirtType type, - const char **modelWhitelist, - const char **modelBlacklist) +virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps, + virDomainVirtType type, + const char **modelWhitelist, + const char **modelBlacklist) { virDomainCapsCPUModelsPtr cpuModels; @@ -2488,9 +2488,9 @@ virQEMUCapsProbeQMPMachineProps(virQEMUCapsPtr qemuCaps, int -virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, - virArch arch, - virDomainCapsCPUModelsPtr *cpuModels) +virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels) { VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; size_t i; @@ -2541,7 +2541,7 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps, if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS)) return 0; - if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &models) < 0) + if (virQEMUCapsFetchCPUModels(mon, qemuCaps->arch, &models) < 0) return -1; if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) @@ -3164,7 +3164,7 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, if (!(data = virQEMUCapsGetCPUModelX86Data(qemuCaps, model, migratable))) goto cleanup; - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type, NULL, NULL); + cpuModels = virQEMUCapsGetCPUModels(qemuCaps, type, NULL, NULL); if (cpuDecode(cpu, data, cpuModels) < 0) goto cleanup; @@ -3253,7 +3253,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, type, NULL, NULL); + cpuModels = virQEMUCapsGetCPUModels(qemuCaps, type, NULL, NULL); hostCPU = virQEMUCapsProbeHostCPU(hostArch, cpuModels); if (!hostCPU || @@ -5308,10 +5308,10 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps, VIR_AUTOSTRINGLIST models = NULL; if (virCPUGetModels(domCaps->arch, &models) >= 0) { - domCaps->cpu.custom = virQEMUCapsGetCPUDefinitions(qemuCaps, - domCaps->virttype, - (const char **)models, - blacklist); + domCaps->cpu.custom = virQEMUCapsGetCPUModels(qemuCaps, + domCaps->virttype, + (const char **)models, + blacklist); } else { domCaps->cpu.custom = NULL; } diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index ba3fe3d2b6..923706c3bf 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -569,13 +569,13 @@ int virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, const char **name, size_t count, virDomainCapsCPUUsable usable); -virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps, - virDomainVirtType type, - const char **modelWhitelist, - const char **modelBlacklist); -int virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, - virArch arch, - virDomainCapsCPUModelsPtr *cpuModels); +virDomainCapsCPUModelsPtr virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps, + virDomainVirtType type, + const char **modelWhitelist, + const char **modelBlacklist); +int virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels); typedef enum { /* Host CPU definition reported in domain capabilities. */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 802f07fe92..50c07f38ad 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -13939,7 +13939,7 @@ qemuConnectBaselineHypervisorCPU(virConnectPtr conn, if (!qemuCaps) goto cleanup; - if (!(cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, virttype, NULL, NULL)) || + if (!(cpuModels = virQEMUCapsGetCPUModels(qemuCaps, virttype, NULL, NULL)) || cpuModels->nmodels == 0) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("QEMU '%s' does not support any CPU models for " diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 93fe994f8e..d1c4035c1c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4366,7 +4366,7 @@ qemuProcessFetchCPUDefinitions(virQEMUDriverPtr driver, if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) goto error; - rc = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch, &models); + rc = virQEMUCapsFetchCPUModels(priv->mon, vm->def->os.arch, &models); if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) goto error; @@ -6139,7 +6139,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, VIR_QEMU_CAPS_HOST_CPU_MIGRATABLE)) < 0) return -1; - cpuModels = virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType, NULL, NULL); + cpuModels = virQEMUCapsGetCPUModels(qemuCaps, def->virtType, NULL, NULL); if (virCPUTranslate(def->os.arch, def->cpu, cpuModels) < 0) return -1; diff --git a/tests/cputest.c b/tests/cputest.c index 4428d451cf..727e603ed7 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -550,7 +550,7 @@ cpuTestGetCPUModels(const struct data *data, if (!(qemuCaps = cpuTestMakeQEMUCaps(data))) return -1; - *models = virQEMUCapsGetCPUDefinitions(qemuCaps, VIR_DOMAIN_VIRT_KVM, NULL, NULL); + *models = virQEMUCapsGetCPUModels(qemuCaps, VIR_DOMAIN_VIRT_KVM, NULL, NULL); virObjectUnref(qemuCaps); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:52PM +0200, Jiri Denemark wrote:
The functions return virDomainCapsCPUModelsPtr and thus they should be called *CPUModels for consistency. Functions called *CPUDefinitions will work on qemuMonitorCPUDefsPtr.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
src/qemu/qemu_capabilities.c | 28 ++++++++++++++-------------- src/qemu/qemu_capabilities.h | 14 +++++++------- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 4 ++-- tests/cputest.c | 2 +- 5 files changed, 25 insertions(+), 25 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Most of the code moved to a new virQEMUCapsFetchCPUDefinitions function and the existing virQEMUCapsFetchCPUModels just becomes a small wrapper around virQEMUCapsFetchCPUDefinitions and virQEMUCapsCPUDefsToModels. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch src/qemu/qemu_capabilities.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index cdc3a2d4b0..436d65f578 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2487,15 +2487,15 @@ virQEMUCapsProbeQMPMachineProps(virQEMUCapsPtr qemuCaps, } -int -virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, - virArch arch, - virDomainCapsCPUModelsPtr *cpuModels) +static int +virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, + virArch arch, + qemuMonitorCPUDefsPtr *cpuDefs) { VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; size_t i; - *cpuModels = NULL; + *cpuDefs = NULL; if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; @@ -2524,7 +2524,24 @@ virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, } } - if (!(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL))) + VIR_STEAL_PTR(*cpuDefs, defs); + return 0; +} + + +int +virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels) +{ + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; + + *cpuModels = NULL; + + if (virQEMUCapsFetchCPUDefinitions(mon, arch, &defs) < 0) + return -1; + + if (defs && !(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL))) return -1; return 0; -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:53PM +0200, Jiri Denemark wrote:
Most of the code moved to a new virQEMUCapsFetchCPUDefinitions function and the existing virQEMUCapsFetchCPUModels just becomes a small wrapper around virQEMUCapsFetchCPUDefinitions and virQEMUCapsCPUDefsToModels.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
src/qemu/qemu_capabilities.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index cdc3a2d4b0..436d65f578 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2487,15 +2487,15 @@ virQEMUCapsProbeQMPMachineProps(virQEMUCapsPtr qemuCaps, }
-int -virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, - virArch arch, - virDomainCapsCPUModelsPtr *cpuModels) +static int +virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon, + virArch arch, + qemuMonitorCPUDefsPtr *cpuDefs) { VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; size_t i;
- *cpuModels = NULL; + *cpuDefs = NULL;
if (qemuMonitorGetCPUDefinitions(mon, &defs) < 0) return -1; @@ -2524,7 +2524,24 @@ virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, } }
- if (!(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL))) + VIR_STEAL_PTR(*cpuDefs, defs);
g_steal_pointer
+ return 0; +} + + +int +virQEMUCapsFetchCPUModels(qemuMonitorPtr mon, + virArch arch, + virDomainCapsCPUModelsPtr *cpuModels) +{ + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL;
g_autoptr
+ + *cpuModels = NULL; + + if (virQEMUCapsFetchCPUDefinitions(mon, arch, &defs) < 0) + return -1; + + if (defs && !(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL))) return -1;
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

We will need to keep some QEMU-specific data for each CPU model supported by a QEMU binary. Instead of complicating the generic virDomainCapsCPUModelsPtr, we can just directly store qemuMonitorCPUDefsPtr returned by the capabilities probing code. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - adapted to changes made by the new patches src/qemu/qemu_capabilities.c | 109 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 56 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 436d65f578..a274cef120 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -607,8 +607,8 @@ struct _virQEMUCaps { virArch arch; virHashTablePtr domCapsCache; - virDomainCapsCPUModelsPtr kvmCPUModels; - virDomainCapsCPUModelsPtr tcgCPUModels; + qemuMonitorCPUDefsPtr kvmCPUModels; + qemuMonitorCPUDefsPtr tcgCPUModels; size_t nmachineTypes; struct virQEMUCapsMachineType *machineTypes; @@ -1625,17 +1625,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) ret->arch = qemuCaps->arch; - if (qemuCaps->kvmCPUModels) { - ret->kvmCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->kvmCPUModels); - if (!ret->kvmCPUModels) - goto error; - } - - if (qemuCaps->tcgCPUModels) { - ret->tcgCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->tcgCPUModels); - if (!ret->tcgCPUModels) - goto error; - } + if (qemuMonitorCPUDefsCopy(&ret->kvmCPUModels, qemuCaps->kvmCPUModels) < 0 || + qemuMonitorCPUDefsCopy(&ret->tcgCPUModels, qemuCaps->tcgCPUModels) < 0) + goto error; if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 || virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0) @@ -1861,25 +1853,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainCapsCPUUsable usable) { size_t i; - virDomainCapsCPUModelsPtr cpus = NULL; + size_t start; + qemuMonitorCPUDefsPtr defs = NULL; if (type == VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels) - cpus = qemuCaps->kvmCPUModels; + defs = qemuCaps->kvmCPUModels; else if (type == VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels) - cpus = qemuCaps->tcgCPUModels; + defs = qemuCaps->tcgCPUModels; + + if (defs) { + start = defs->ncpus; - if (!cpus) { - if (!(cpus = virDomainCapsCPUModelsNew(count))) + if (VIR_EXPAND_N(defs->cpus, defs->ncpus, count) < 0) + return -1; + } else { + start = 0; + + if (!(defs = qemuMonitorCPUDefsNew(count))) return -1; if (type == VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModels = cpus; + qemuCaps->kvmCPUModels = defs; else - qemuCaps->tcgCPUModels = cpus; + qemuCaps->tcgCPUModels = defs; } for (i = 0; i < count; i++) { - if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0) + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + start + i; + + cpu->usable = usable; + if (VIR_STRDUP(cpu->name, name[i]) < 0) return -1; } @@ -1928,20 +1931,17 @@ virQEMUCapsGetCPUModels(virQEMUCapsPtr qemuCaps, const char **modelWhitelist, const char **modelBlacklist) { - virDomainCapsCPUModelsPtr cpuModels; + qemuMonitorCPUDefsPtr defs; if (type == VIR_DOMAIN_VIRT_KVM) - cpuModels = qemuCaps->kvmCPUModels; + defs = qemuCaps->kvmCPUModels; else - cpuModels = qemuCaps->tcgCPUModels; + defs = qemuCaps->tcgCPUModels; - if (!cpuModels) + if (!defs) return NULL; - if (modelWhitelist || modelBlacklist) - return virDomainCapsCPUModelsFilter(cpuModels, modelWhitelist, modelBlacklist); - - return virDomainCapsCPUModelsCopy(cpuModels); + return virQEMUCapsCPUDefsToModels(defs, modelWhitelist, modelBlacklist); } @@ -2001,7 +2001,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, virDomainVirtType type, virCPUMode mode) { - virDomainCapsCPUModelsPtr cpus; + qemuMonitorCPUDefsPtr cpus; switch (mode) { case VIR_CPU_MODE_HOST_PASSTHROUGH: @@ -2017,7 +2017,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, cpus = qemuCaps->kvmCPUModels; else cpus = qemuCaps->tcgCPUModels; - return cpus && cpus->nmodels > 0; + return cpus && cpus->ncpus > 0; case VIR_CPU_MODE_LAST: break; @@ -2553,18 +2553,18 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps, qemuMonitorPtr mon, bool tcg) { - virDomainCapsCPUModelsPtr models = NULL; + qemuMonitorCPUDefsPtr defs = NULL; if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS)) return 0; - if (virQEMUCapsFetchCPUModels(mon, qemuCaps->arch, &models) < 0) + if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &defs) < 0) return -1; if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) - qemuCaps->tcgCPUModels = models; + qemuCaps->tcgCPUModels = defs; else - qemuCaps->kvmCPUModels = models; + qemuCaps->kvmCPUModels = defs; return 0; } @@ -3503,7 +3503,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, xmlXPathContextPtr ctxt, virDomainVirtType type) { - virDomainCapsCPUModelsPtr cpus = NULL; + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL; VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; size_t i; int n; @@ -3523,20 +3523,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (n == 0) return 0; - if (!(cpus = virDomainCapsCPUModelsNew(n))) + if (!(defs = qemuMonitorCPUDefsNew(n))) return -1; - if (type == VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModels = cpus; - else - qemuCaps->tcgCPUModels = cpus; - for (i = 0; i < n; i++) { + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i; int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN; VIR_AUTOFREE(char *) strUsable = NULL; - VIR_AUTOFREE(char *) name = NULL; VIR_AUTOFREE(xmlNodePtr *) blockerNodes = NULL; - VIR_AUTOSTRINGLIST blockers = NULL; int nblockers; if ((strUsable = virXMLPropString(nodes[i], "usable")) && @@ -3546,8 +3540,9 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, strUsable); return -1; } + cpu->usable = usable; - if (!(name = virXMLPropString(nodes[i], "name"))) { + if (!(cpu->name = virXMLPropString(nodes[i], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing cpu name in QEMU capabilities cache")); return -1; @@ -3567,11 +3562,11 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, if (nblockers > 0) { size_t j; - if (VIR_ALLOC_N(blockers, nblockers + 1) < 0) + if (VIR_ALLOC_N(cpu->blockers, nblockers + 1) < 0) return -1; for (j = 0; j < nblockers; j++) { - if (!(blockers[j] = virXMLPropString(blockerNodes[j], "name"))) { + if (!(cpu->blockers[j] = virXMLPropString(blockerNodes[j], "name"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing blocker name in QEMU " "capabilities cache")); @@ -3579,11 +3574,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, } } } - - if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0) - return -1; } + if (type == VIR_DOMAIN_VIRT_KVM) + VIR_STEAL_PTR(qemuCaps->kvmCPUModels, defs); + else + VIR_STEAL_PTR(qemuCaps->tcgCPUModels, defs); + return 0; } @@ -3993,23 +3990,23 @@ virQEMUCapsFormatCPUModels(virQEMUCapsPtr qemuCaps, virBufferPtr buf, virDomainVirtType type) { - virDomainCapsCPUModelsPtr cpus; + qemuMonitorCPUDefsPtr defs; const char *typeStr; size_t i; if (type == VIR_DOMAIN_VIRT_KVM) { typeStr = "kvm"; - cpus = qemuCaps->kvmCPUModels; + defs = qemuCaps->kvmCPUModels; } else { typeStr = "tcg"; - cpus = qemuCaps->tcgCPUModels; + defs = qemuCaps->tcgCPUModels; } - if (!cpus) + if (!defs) return; - for (i = 0; i < cpus->nmodels; i++) { - virDomainCapsCPUModelPtr cpu = cpus->models + i; + for (i = 0; i < defs->ncpus; i++) { + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + i; virBufferAsprintf(buf, "<cpu type='%s' ", typeStr); virBufferEscapeString(buf, "name='%s'", cpu->name); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:54PM +0200, Jiri Denemark wrote:
We will need to keep some QEMU-specific data for each CPU model supported by a QEMU binary. Instead of complicating the generic virDomainCapsCPUModelsPtr, we can just directly store qemuMonitorCPUDefsPtr returned by the capabilities probing code.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - adapted to changes made by the new patches
src/qemu/qemu_capabilities.c | 109 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 56 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 436d65f578..a274cef120 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -607,8 +607,8 @@ struct _virQEMUCaps { virArch arch;
virHashTablePtr domCapsCache; - virDomainCapsCPUModelsPtr kvmCPUModels; - virDomainCapsCPUModelsPtr tcgCPUModels; + qemuMonitorCPUDefsPtr kvmCPUModels; + qemuMonitorCPUDefsPtr tcgCPUModels;
size_t nmachineTypes; struct virQEMUCapsMachineType *machineTypes; @@ -1625,17 +1625,9 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
ret->arch = qemuCaps->arch;
- if (qemuCaps->kvmCPUModels) { - ret->kvmCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->kvmCPUModels); - if (!ret->kvmCPUModels) - goto error; - } - - if (qemuCaps->tcgCPUModels) { - ret->tcgCPUModels = virDomainCapsCPUModelsCopy(qemuCaps->tcgCPUModels); - if (!ret->tcgCPUModels) - goto error; - } + if (qemuMonitorCPUDefsCopy(&ret->kvmCPUModels, qemuCaps->kvmCPUModels) < 0 || + qemuMonitorCPUDefsCopy(&ret->tcgCPUModels, qemuCaps->tcgCPUModels) < 0) + goto error;
if (virQEMUCapsHostCPUDataCopy(&ret->kvmCPU, &qemuCaps->kvmCPU) < 0 || virQEMUCapsHostCPUDataCopy(&ret->tcgCPU, &qemuCaps->tcgCPU) < 0) @@ -1861,25 +1853,36 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps, virDomainCapsCPUUsable usable) { size_t i; - virDomainCapsCPUModelsPtr cpus = NULL; + size_t start; + qemuMonitorCPUDefsPtr defs = NULL;
if (type == VIR_DOMAIN_VIRT_KVM && qemuCaps->kvmCPUModels) - cpus = qemuCaps->kvmCPUModels; + defs = qemuCaps->kvmCPUModels; else if (type == VIR_DOMAIN_VIRT_QEMU && qemuCaps->tcgCPUModels) - cpus = qemuCaps->tcgCPUModels; + defs = qemuCaps->tcgCPUModels; + + if (defs) { + start = defs->ncpus;
- if (!cpus) { - if (!(cpus = virDomainCapsCPUModelsNew(count))) + if (VIR_EXPAND_N(defs->cpus, defs->ncpus, count) < 0) + return -1; + } else { + start = 0; + + if (!(defs = qemuMonitorCPUDefsNew(count))) return -1;
if (type == VIR_DOMAIN_VIRT_KVM) - qemuCaps->kvmCPUModels = cpus; + qemuCaps->kvmCPUModels = defs; else - qemuCaps->tcgCPUModels = cpus; + qemuCaps->tcgCPUModels = defs; }
for (i = 0; i < count; i++) { - if (virDomainCapsCPUModelsAdd(cpus, name[i], usable, NULL) < 0) + qemuMonitorCPUDefInfoPtr cpu = defs->cpus + start + i; + + cpu->usable = usable;
This fails to compile with my CLang: qemu/qemu_capabilities.c:1884:23: error: implicit conversion from enumeration type 'virDomainCapsCPUUsable' to different enumeration type 'virTristateBool' [-Werror,-Wenum-conversion] cpu->usable = usable; ~ ^~~~~~ An explicit cast works: cpu->usable = (virTristateBool)usable; but I forgot what is our preferred spacing for casts again.
+ if (VIR_STRDUP(cpu->name, name[i]) < 0)
consider g_strdup
return -1; }
@@ -3503,7 +3503,7 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, xmlXPathContextPtr ctxt, virDomainVirtType type) { - virDomainCapsCPUModelsPtr cpus = NULL; + VIR_AUTOPTR(qemuMonitorCPUDefs) defs = NULL;
g_autoptr
VIR_AUTOFREE(xmlNodePtr *) nodes = NULL; size_t i; int n; @@ -3579,11 +3574,13 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, } } } - - if (virDomainCapsCPUModelsAddSteal(cpus, &name, usable, &blockers) < 0) - return -1; }
+ if (type == VIR_DOMAIN_VIRT_KVM) + VIR_STEAL_PTR(qemuCaps->kvmCPUModels, defs); + else + VIR_STEAL_PTR(qemuCaps->tcgCPUModels, defs);
g_steal_pointer
+ return 0; }
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/conf/domain_capabilities.c | 33 --------------------------------- src/conf/domain_capabilities.h | 3 --- src/libvirt_private.syms | 1 - 3 files changed, 37 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index ab8ebb650d..a13463a6e7 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -185,39 +185,6 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) } -virDomainCapsCPUModelsPtr -virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, - const char **models, - const char **blacklist) -{ - virDomainCapsCPUModelsPtr cpuModels; - size_t i; - - if (!(cpuModels = virDomainCapsCPUModelsNew(0))) - return NULL; - - for (i = 0; i < old->nmodels; i++) { - if (models && !virStringListHasString(models, old->models[i].name)) - continue; - - if (blacklist && virStringListHasString(blacklist, old->models[i].name)) - continue; - - if (virDomainCapsCPUModelsAdd(cpuModels, - old->models[i].name, - old->models[i].usable, - old->models[i].blockers) < 0) - goto error; - } - - return cpuModels; - - error: - virObjectUnref(cpuModels); - return NULL; -} - - int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name, diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index e3bd8d423e..bdd0bd9253 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -195,9 +195,6 @@ virDomainCapsPtr virDomainCapsNew(const char *path, virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels); virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old); -virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, - const char **models, - const char **blacklist); int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, char **name, virDomainCapsCPUUsable usable, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 1af18b880b..641b1f93bd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -193,7 +193,6 @@ virDomainAuditVcpu; virDomainCapsCPUModelsAdd; virDomainCapsCPUModelsAddSteal; virDomainCapsCPUModelsCopy; -virDomainCapsCPUModelsFilter; virDomainCapsCPUModelsGet; virDomainCapsCPUModelsNew; virDomainCapsCPUUsableTypeFromString; -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:55PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/conf/domain_capabilities.c | 33 --------------------------------- src/conf/domain_capabilities.h | 3 --- src/libvirt_private.syms | 1 - 3 files changed, 37 deletions(-)
Beautiful :') Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Both virDomainCapsCPUModelsAdd and virDomainCapsCPUModelsAddSteal are so simple we can just squash the code in a single function. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/conf/domain_capabilities.c | 33 ++++++++++----------------------- src/conf/domain_capabilities.h | 4 ---- src/libvirt_private.syms | 1 - 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index a13463a6e7..dadb2a1183 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -185,27 +185,6 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) } -int -virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, - char **name, - virDomainCapsCPUUsable usable, - char ***blockers) -{ - if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max, - cpuModels->nmodels, 1) < 0) - return -1; - - cpuModels->models[cpuModels->nmodels].usable = usable; - VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].name, *name); - - if (blockers) - VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].blockers, *blockers); - - cpuModels->nmodels++; - return 0; -} - - int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, @@ -214,6 +193,7 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, { VIR_AUTOFREE(char *) nameCopy = NULL; VIR_AUTOSTRINGLIST blockersCopy = NULL; + virDomainCapsCPUModelPtr cpu; if (VIR_STRDUP(nameCopy, name) < 0) return -1; @@ -221,10 +201,17 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, if (virStringListCopy(&blockersCopy, (const char **)blockers) < 0) return -1; - if (virDomainCapsCPUModelsAddSteal(cpuModels, &nameCopy, - usable, &blockersCopy) < 0) + if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max, + cpuModels->nmodels, 1) < 0) return -1; + cpu = cpuModels->models + cpuModels->nmodels; + cpuModels->nmodels++; + + cpu->usable = usable; + VIR_STEAL_PTR(cpu->name, nameCopy); + VIR_STEAL_PTR(cpu->blockers, blockersCopy); + return 0; } diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index bdd0bd9253..8b220e3bf8 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -195,10 +195,6 @@ virDomainCapsPtr virDomainCapsNew(const char *path, virDomainCapsCPUModelsPtr virDomainCapsCPUModelsNew(size_t nmodels); virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old); -int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, - char **name, - virDomainCapsCPUUsable usable, - char ***blockers); int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, virDomainCapsCPUUsable usable, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 641b1f93bd..b35934be1f 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -191,7 +191,6 @@ virDomainAuditVcpu; # conf/domain_capabilities.h virDomainCapsCPUModelsAdd; -virDomainCapsCPUModelsAddSteal; virDomainCapsCPUModelsCopy; virDomainCapsCPUModelsGet; virDomainCapsCPUModelsNew; -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:56PM +0200, Jiri Denemark wrote:
Both virDomainCapsCPUModelsAdd and virDomainCapsCPUModelsAddSteal are so simple we can just squash the code in a single function.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/conf/domain_capabilities.c | 33 ++++++++++----------------------- src/conf/domain_capabilities.h | 4 ---- src/libvirt_private.syms | 1 - 3 files changed, 10 insertions(+), 28 deletions(-)
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index a13463a6e7..dadb2a1183 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -185,27 +185,6 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old) }
-int -virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels, - char **name, - virDomainCapsCPUUsable usable, - char ***blockers) -{ - if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max, - cpuModels->nmodels, 1) < 0) - return -1; - - cpuModels->models[cpuModels->nmodels].usable = usable; - VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].name, *name); - - if (blockers) - VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].blockers, *blockers); - - cpuModels->nmodels++; - return 0; -} - - int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, const char *name, @@ -214,6 +193,7 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, { VIR_AUTOFREE(char *) nameCopy = NULL; VIR_AUTOSTRINGLIST blockersCopy = NULL; + virDomainCapsCPUModelPtr cpu;
if (VIR_STRDUP(nameCopy, name) < 0) return -1; @@ -221,10 +201,17 @@ virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels, if (virStringListCopy(&blockersCopy, (const char **)blockers) < 0) return -1;
- if (virDomainCapsCPUModelsAddSteal(cpuModels, &nameCopy, - usable, &blockersCopy) < 0) + if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max, + cpuModels->nmodels, 1) < 0) return -1;
+ cpu = cpuModels->models + cpuModels->nmodels; + cpuModels->nmodels++; + + cpu->usable = usable; + VIR_STEAL_PTR(cpu->name, nameCopy); + VIR_STEAL_PTR(cpu->blockers, blockersCopy);
g_steal_pointer
+ return 0; }
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

We need to create a mapping between CPU model names and their corresponding QOM types. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - ignore empty typename strings src/qemu/qemu_capabilities.c | 3 + src/qemu/qemu_monitor.c | 2 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 5 + .../caps_2.10.0.aarch64.xml | 126 ++--- .../caps_2.10.0.ppc64.xml | 512 ++++++++--------- .../caps_2.10.0.s390x.xml | 264 ++++----- .../caps_2.10.0.x86_64.xml | 132 ++--- .../caps_2.11.0.s390x.xml | 264 ++++----- .../caps_2.11.0.x86_64.xml | 136 ++--- .../caps_2.12.0.aarch64.xml | 136 ++--- .../caps_2.12.0.ppc64.xml | 516 +++++++++--------- .../caps_2.12.0.s390x.xml | 264 ++++----- .../caps_2.12.0.x86_64.xml | 180 +++--- .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 512 ++++++++--------- .../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 256 ++++----- .../caps_2.9.0.x86_64.xml | 128 ++--- .../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 516 +++++++++--------- .../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 272 ++++----- .../caps_3.0.0.x86_64.xml | 184 +++---- .../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 516 +++++++++--------- .../caps_3.1.0.x86_64.xml | 196 +++---- .../caps_4.0.0.aarch64.xml | 148 ++--- .../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 516 +++++++++--------- .../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 284 +++++----- .../caps_4.0.0.x86_64.xml | 196 +++---- .../caps_4.1.0.x86_64.xml | 400 +++++++------- .../caps_4.2.0.aarch64.xml | 148 ++--- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 516 +++++++++--------- .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 300 +++++----- .../caps_4.2.0.x86_64.xml | 400 +++++++------- 31 files changed, 4020 insertions(+), 4009 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index a274cef120..2a32d575c9 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3548,6 +3548,8 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, return -1; } + cpu->type = virXMLPropString(nodes[i], "typename"); + node = ctxt->node; ctxt->node = nodes[i]; nblockers = virXPathNodeSet("./blocker", ctxt, &blockerNodes); @@ -4010,6 +4012,7 @@ virQEMUCapsFormatCPUModels(virQEMUCapsPtr qemuCaps, virBufferAsprintf(buf, "<cpu type='%s' ", typeStr); virBufferEscapeString(buf, "name='%s'", cpu->name); + virBufferEscapeString(buf, " typename='%s'", cpu->type); if (cpu->usable) { virBufferAsprintf(buf, " usable='%s'", virDomainCapsCPUUsableTypeToString(cpu->usable)); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 8d86112f30..6056219674 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3559,6 +3559,7 @@ qemuMonitorCPUDefsFree(qemuMonitorCPUDefsPtr defs) for (i = 0; i < defs->ncpus; i++) { virStringListFree(defs->cpus[i].blockers); VIR_FREE(defs->cpus[i].name); + VIR_FREE(defs->cpus[i].type); } VIR_FREE(defs->cpus); @@ -3605,6 +3606,7 @@ qemuMonitorCPUDefsCopy(qemuMonitorCPUDefsPtr *dst, cpuDst->usable = cpuSrc->usable; if (VIR_STRDUP(cpuDst->name, cpuSrc->name) < 0 || + VIR_STRDUP(cpuDst->type, cpuSrc->type) < 0 || virStringListCopy(&cpuDst->blockers, (const char **)cpuSrc->blockers) < 0) return -1; diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 4f355c760a..f2af1badd4 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1098,6 +1098,7 @@ typedef qemuMonitorCPUDefInfo *qemuMonitorCPUDefInfoPtr; struct _qemuMonitorCPUDefInfo { virTristateBool usable; char *name; + char *type; char **blockers; /* NULL-terminated string list */ }; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index de75c46dc1..bc30884223 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5571,6 +5571,11 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, if (VIR_STRDUP(cpu->name, tmp) < 0) return -1; + if ((tmp = virJSONValueObjectGetString(child, "typename")) && + *tmp && + VIR_STRDUP(cpu->type, tmp) < 0) + return -1; + if (virJSONValueObjectHasKey(child, "unavailable-features")) { virJSONValuePtr blockers; size_t j; ... diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml index ab884239fe..176613fa2a 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml @@ -621,14 +621,14 @@ <property name='avx512pf' type='boolean' value='false'/> <property name='xstore-en' type='boolean' value='false'/> </hostCPU> - <cpu type='kvm' name='max' usable='yes'/> - <cpu type='kvm' name='host' usable='yes'/> - <cpu type='kvm' name='base' usable='yes'/> - <cpu type='kvm' name='qemu64-v1' usable='yes'/> - <cpu type='kvm' name='qemu64' usable='yes'/> - <cpu type='kvm' name='qemu32-v1' usable='yes'/> - <cpu type='kvm' name='qemu32' usable='yes'/> - <cpu type='kvm' name='phenom-v1' usable='no'> + <cpu type='kvm' name='max' typename='max-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='host' typename='host-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='base' typename='base-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='qemu64-v1' typename='qemu64-v1-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='qemu64' typename='qemu64-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='qemu32-v1' typename='qemu32-v1-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='qemu32' typename='qemu32-x86_64-cpu' usable='yes'/> + <cpu type='kvm' name='phenom-v1' typename='phenom-v1-x86_64-cpu' usable='no'> <blocker name='mmxext'/> <blocker name='fxsr-opt'/> <blocker name='3dnowext'/> @@ -636,7 +636,7 @@ <blocker name='sse4a'/> <blocker name='npt'/> </cpu> - <cpu type='kvm' name='phenom' usable='no'> + <cpu type='kvm' name='phenom' typename='phenom-x86_64-cpu' usable='no'> <blocker name='mmxext'/> <blocker name='fxsr-opt'/> <blocker name='3dnowext'/> ... -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:57PM +0200, Jiri Denemark wrote:
We need to create a mapping between CPU model names and their corresponding QOM types.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - ignore empty typename strings
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

QEMU 4.2.0 will report default CPU types used by each machine type and we will want to start using it. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change except for updated test results src/qemu/qemu_capabilities.c | 15 ++- src/qemu/qemu_monitor.c | 1 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 12 +++ .../caps_4.2.0.aarch64.xml | 94 +++++++++---------- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 58 ++++++------ .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 28 +++--- .../caps_4.2.0.x86_64.xml | 92 +++++++++--------- 8 files changed, 163 insertions(+), 138 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 2a32d575c9..33cd3491b2 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -556,6 +556,7 @@ struct virQEMUCapsMachineType { unsigned int maxCpus; bool hotplugCpus; bool qemuDefault; + char *defaultCPU; }; typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData; @@ -1638,7 +1639,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps) ret->nmachineTypes = qemuCaps->nmachineTypes; for (i = 0; i < qemuCaps->nmachineTypes; i++) { if (VIR_STRDUP(ret->machineTypes[i].name, qemuCaps->machineTypes[i].name) < 0 || - VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0) + VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0 || + VIR_STRDUP(ret->machineTypes[i].defaultCPU, qemuCaps->machineTypes[i].defaultCPU) < 0) goto error; ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus; ret->machineTypes[i].hotplugCpus = qemuCaps->machineTypes[i].hotplugCpus; @@ -1673,6 +1675,7 @@ void virQEMUCapsDispose(void *obj) for (i = 0; i < qemuCaps->nmachineTypes; i++) { VIR_FREE(qemuCaps->machineTypes[i].name); VIR_FREE(qemuCaps->machineTypes[i].alias); + VIR_FREE(qemuCaps->machineTypes[i].defaultCPU); } VIR_FREE(qemuCaps->machineTypes); @@ -2406,7 +2409,8 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps, mach = &(qemuCaps->machineTypes[qemuCaps->nmachineTypes++]); if (VIR_STRDUP(mach->alias, machines[i]->alias) < 0 || - VIR_STRDUP(mach->name, machines[i]->name) < 0) + VIR_STRDUP(mach->name, machines[i]->name) < 0 || + VIR_STRDUP(mach->defaultCPU, machines[i]->defaultCPU) < 0) goto cleanup; mach->maxCpus = machines[i]->maxCpus; @@ -3843,6 +3847,8 @@ virQEMUCapsLoadCache(virArch hostArch, if (STREQ_NULLABLE(str, "yes")) qemuCaps->machineTypes[i].qemuDefault = true; VIR_FREE(str); + + qemuCaps->machineTypes[i].defaultCPU = virXMLPropString(nodes[i], "defaultCPU"); } } VIR_FREE(nodes); @@ -4116,6 +4122,11 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps) qemuCaps->machineTypes[i].maxCpus); if (qemuCaps->machineTypes[i].qemuDefault) virBufferAddLit(&buf, " default='yes'"); + + if (qemuCaps->machineTypes[i].defaultCPU) + virBufferEscapeString(&buf, " defaultCPU='%s'", + qemuCaps->machineTypes[i].defaultCPU); + virBufferAddLit(&buf, "/>\n"); } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 6056219674..6f2d759a78 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3532,6 +3532,7 @@ qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine) return; VIR_FREE(machine->name); VIR_FREE(machine->alias); + VIR_FREE(machine->defaultCPU); VIR_FREE(machine); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f2af1badd4..c099321ad1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1085,6 +1085,7 @@ struct _qemuMonitorMachineInfo { char *alias; unsigned int maxCpus; bool hotplugCpus; + char *defaultCPU; }; int qemuMonitorGetMachines(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index bc30884223..1309b6a781 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5504,6 +5504,18 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, ignore_value(virJSONValueObjectGetBoolean(child, "hotpluggable-cpus", &info->hotplugCpus)); + + if (virJSONValueObjectHasKey(child, "default-cpu-type")) { + if (!(tmp = virJSONValueObjectGetString(child, "default-cpu-type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-machines reply has malformed " + "'default-cpu-type' data")); + goto cleanup; + } + + if (VIR_STRDUP(info->defaultCPU, tmp) < 0) + goto cleanup; + } } ret = n; diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml index a416defca0..8addadb564 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.aarch64.xml @@ -246,76 +246,76 @@ <cpu type='tcg' name='arm946' typename='arm946-arm-cpu'/> <cpu type='tcg' name='pxa270-a1' typename='pxa270-a1-arm-cpu'/> <cpu type='tcg' name='pxa270' typename='pxa270-arm-cpu'/> - <machine name='integratorcp' maxCpus='1'/> + <machine name='integratorcp' maxCpus='1' defaultCPU='arm926-arm-cpu'/> <machine name='nuri' maxCpus='2'/> - <machine name='mps2-an511' maxCpus='1'/> - <machine name='mps2-an505' maxCpus='1'/> - <machine name='verdex' maxCpus='1'/> - <machine name='virt-3.0' maxCpus='512'/> + <machine name='mps2-an511' maxCpus='1' defaultCPU='cortex-m3-arm-cpu'/> + <machine name='mps2-an505' maxCpus='1' defaultCPU='cortex-m33-arm-cpu'/> + <machine name='verdex' maxCpus='1' defaultCPU='pxa270-c0-arm-cpu'/> + <machine name='virt-3.0' maxCpus='512' defaultCPU='cortex-a15-arm-cpu'/> <machine name='ast2500-evb' maxCpus='2'/> <machine name='smdkc210' maxCpus='2'/> - <machine name='collie' maxCpus='1'/> + <machine name='collie' maxCpus='1' defaultCPU='sa1110-arm-cpu'/> <machine name='xlnx-versal-virt' maxCpus='2'/> <machine name='imx25-pdk' maxCpus='1'/> - <machine name='spitz' maxCpus='1'/> - <machine name='musca-b1' maxCpus='2'/> - <machine name='realview-pbx-a9' maxCpus='4'/> - <machine name='realview-eb' maxCpus='1'/> - <machine name='versatilepb' maxCpus='1'/> - <machine name='realview-pb-a8' maxCpus='1'/> - <machine name='emcraft-sf2' maxCpus='1'/> - <machine name='virt-2.9' maxCpus='255'/> - <machine name='musicpal' maxCpus='1'/> - <machine name='sbsa-ref' maxCpus='512'/> - <machine name='z2' maxCpus='1'/> - <machine name='akita' maxCpus='1'/> - <machine name='virt-2.7' maxCpus='255'/> + <machine name='spitz' maxCpus='1' defaultCPU='pxa270-c0-arm-cpu'/> + <machine name='musca-b1' maxCpus='2' defaultCPU='cortex-m33-arm-cpu'/> + <machine name='realview-pbx-a9' maxCpus='4' defaultCPU='cortex-a9-arm-cpu'/> + <machine name='realview-eb' maxCpus='1' defaultCPU='arm926-arm-cpu'/> + <machine name='versatilepb' maxCpus='1' defaultCPU='arm926-arm-cpu'/> + <machine name='realview-pb-a8' maxCpus='1' defaultCPU='cortex-a8-arm-cpu'/> + <machine name='emcraft-sf2' maxCpus='1' defaultCPU='cortex-m3-arm-cpu'/> + <machine name='virt-2.9' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> + <machine name='musicpal' maxCpus='1' defaultCPU='arm926-arm-cpu'/> + <machine name='sbsa-ref' maxCpus='512' defaultCPU='cortex-a57-arm-cpu'/> + <machine name='z2' maxCpus='1' defaultCPU='pxa270-c5-arm-cpu'/> + <machine name='akita' maxCpus='1' defaultCPU='pxa270-c0-arm-cpu'/> + <machine name='virt-2.7' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> <machine name='kzm' maxCpus='1'/> <machine name='swift-bmc' maxCpus='2'/> - <machine name='virt-2.8' maxCpus='255'/> - <machine name='realview-eb-mpcore' maxCpus='4'/> - <machine name='musca-a' maxCpus='2'/> + <machine name='virt-2.8' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> + <machine name='realview-eb-mpcore' maxCpus='4' defaultCPU='arm11mpcore-arm-cpu'/> + <machine name='musca-a' maxCpus='2' defaultCPU='cortex-m33-arm-cpu'/> <machine name='mcimx7d-sabre' maxCpus='2'/> - <machine name='sx1' maxCpus='1'/> - <machine name='virt-4.2' alias='virt' maxCpus='512'/> - <machine name='sx1-v1' maxCpus='1'/> - <machine name='virt-2.6' maxCpus='255'/> - <machine name='cubieboard' maxCpus='1'/> - <machine name='virt-4.0' maxCpus='512'/> + <machine name='sx1' maxCpus='1' defaultCPU='ti925t-arm-cpu'/> + <machine name='virt-4.2' alias='virt' maxCpus='512' defaultCPU='cortex-a15-arm-cpu'/> + <machine name='sx1-v1' maxCpus='1' defaultCPU='ti925t-arm-cpu'/> + <machine name='virt-2.6' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> + <machine name='cubieboard' maxCpus='1' defaultCPU='cortex-a9-arm-cpu'/> + <machine name='virt-4.0' maxCpus='512' defaultCPU='cortex-a15-arm-cpu'/> <machine name='highbank' maxCpus='4'/> - <machine name='virt-4.1' maxCpus='512'/> + <machine name='virt-4.1' maxCpus='512' defaultCPU='cortex-a15-arm-cpu'/> <machine name='raspi2' maxCpus='4'/> <machine name='raspi3' maxCpus='4'/> <machine name='netduino2' maxCpus='1'/> - <machine name='terrier' maxCpus='1'/> - <machine name='n810' maxCpus='1'/> - <machine name='mainstone' maxCpus='1'/> + <machine name='terrier' maxCpus='1' defaultCPU='pxa270-c5-arm-cpu'/> + <machine name='n810' maxCpus='1' defaultCPU='arm1136-r2-arm-cpu'/> + <machine name='mainstone' maxCpus='1' defaultCPU='pxa270-c5-arm-cpu'/> <machine name='palmetto-bmc' maxCpus='2'/> <machine name='sabrelite' maxCpus='4'/> <machine name='midway' maxCpus='4'/> <machine name='romulus-bmc' maxCpus='2'/> - <machine name='cheetah' maxCpus='1'/> + <machine name='cheetah' maxCpus='1' defaultCPU='ti925t-arm-cpu'/> <machine name='tosa' maxCpus='1'/> - <machine name='borzoi' maxCpus='1'/> - <machine name='versatileab' maxCpus='1'/> - <machine name='lm3s6965evb' maxCpus='1'/> - <machine name='n800' maxCpus='1'/> - <machine name='virt-2.10' maxCpus='255'/> - <machine name='virt-2.11' maxCpus='255'/> + <machine name='borzoi' maxCpus='1' defaultCPU='pxa270-c0-arm-cpu'/> + <machine name='versatileab' maxCpus='1' defaultCPU='arm926-arm-cpu'/> + <machine name='lm3s6965evb' maxCpus='1' defaultCPU='cortex-m3-arm-cpu'/> + <machine name='n800' maxCpus='1' defaultCPU='arm1136-r2-arm-cpu'/> + <machine name='virt-2.10' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> + <machine name='virt-2.11' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> <machine name='connex' maxCpus='1'/> - <machine name='virt-2.12' maxCpus='255'/> + <machine name='virt-2.12' maxCpus='255' defaultCPU='cortex-a15-arm-cpu'/> <machine name='microbit' maxCpus='1'/> <machine name='witherspoon-bmc' maxCpus='2'/> - <machine name='xilinx-zynq-a9' maxCpus='1'/> - <machine name='mps2-an385' maxCpus='1'/> - <machine name='vexpress-a9' maxCpus='4'/> - <machine name='mps2-an521' maxCpus='2'/> + <machine name='xilinx-zynq-a9' maxCpus='1' defaultCPU='cortex-a9-arm-cpu'/> + <machine name='mps2-an385' maxCpus='1' defaultCPU='cortex-m3-arm-cpu'/> + <machine name='vexpress-a9' maxCpus='4' defaultCPU='cortex-a9-arm-cpu'/> + <machine name='mps2-an521' maxCpus='2' defaultCPU='cortex-m33-arm-cpu'/> <machine name='mcimx6ul-evk' maxCpus='1'/> - <machine name='vexpress-a15' maxCpus='4'/> + <machine name='vexpress-a15' maxCpus='4' defaultCPU='cortex-a15-arm-cpu'/> <machine name='xlnx-zcu102' maxCpus='6'/> - <machine name='virt-3.1' maxCpus='512'/> + <machine name='virt-3.1' maxCpus='512' defaultCPU='cortex-a15-arm-cpu'/> <machine name='canon-a1100' maxCpus='1'/> - <machine name='lm3s811evb' maxCpus='1'/> + <machine name='lm3s811evb' maxCpus='1' defaultCPU='cortex-m3-arm-cpu'/> <gic version='3' kernel='yes' emulated='yes'/> <gic version='2' kernel='no' emulated='yes'/> </qemuCaps> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml index 3ec7686b12..b4ceb6a1e8 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.ppc64.xml @@ -1053,35 +1053,35 @@ <cpu type='tcg' name='750_v3.1'/> <cpu type='tcg' name='power8e_v2.1'/> <cpu type='tcg' name='mpc8568e'/> - <machine name='pseries-4.2' alias='pseries' hotplugCpus='yes' maxCpus='1024' default='yes'/> + <machine name='pseries-4.2' alias='pseries' hotplugCpus='yes' maxCpus='1024' default='yes' defaultCPU='power9_v2.0-powerpc64-cpu'/> <machine name='ref405ep' maxCpus='1'/> - <machine name='sam460ex' maxCpus='1'/> - <machine name='virtex-ml507' maxCpus='1'/> - <machine name='ppce500' maxCpus='32'/> - <machine name='mpc8544ds' maxCpus='15'/> - <machine name='pseries-3.1' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.12-sxxm' hotplugCpus='yes' maxCpus='1024'/> - <machine name='bamboo' maxCpus='1'/> - <machine name='g3beige' maxCpus='1'/> - <machine name='pseries-3.0' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.10' hotplugCpus='yes' maxCpus='1024'/> - <machine name='prep' maxCpus='1'/> - <machine name='pseries-2.11' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.12' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.9' hotplugCpus='yes' maxCpus='1024'/> - <machine name='mac99' maxCpus='1'/> - <machine name='pseries-2.6' maxCpus='1024'/> - <machine name='pseries-2.7' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.8' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.4' maxCpus='1024'/> - <machine name='pseries-2.5' maxCpus='1024'/> - <machine name='pseries-4.0' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-4.1' hotplugCpus='yes' maxCpus='1024'/> - <machine name='pseries-2.2' maxCpus='1024'/> + <machine name='sam460ex' maxCpus='1' defaultCPU='460exb-powerpc64-cpu'/> + <machine name='virtex-ml507' maxCpus='1' defaultCPU='440-xilinx-powerpc64-cpu'/> + <machine name='ppce500' maxCpus='32' defaultCPU='e500v2_v30-powerpc64-cpu'/> + <machine name='mpc8544ds' maxCpus='15' defaultCPU='e500v2_v30-powerpc64-cpu'/> + <machine name='pseries-3.1' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.12-sxxm' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='bamboo' maxCpus='1' defaultCPU='440epb-powerpc64-cpu'/> + <machine name='g3beige' maxCpus='1' defaultCPU='750_v3.1-powerpc64-cpu'/> + <machine name='pseries-3.0' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.10' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='prep' maxCpus='1' defaultCPU='602-powerpc64-cpu'/> + <machine name='pseries-2.11' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.12' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.9' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='mac99' maxCpus='1' defaultCPU='970fx_v3.1-powerpc64-cpu'/> + <machine name='pseries-2.6' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='pseries-2.7' hotplugCpus='yes' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='pseries-2.8' hotplugCpus='yes' maxCpus='1024' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.4' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='pseries-2.5' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='pseries-4.0' hotplugCpus='yes' maxCpus='1024' defaultCPU='power9_v2.0-powerpc64-cpu'/> + <machine name='pseries-4.1' hotplugCpus='yes' maxCpus='1024' defaultCPU='power9_v2.0-powerpc64-cpu'/> + <machine name='pseries-2.2' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> <machine name='taihu' maxCpus='1'/> - <machine name='pseries-2.3' maxCpus='1024'/> - <machine name='pseries-2.1' maxCpus='1024'/> - <machine name='powernv8' maxCpus='2048'/> - <machine name='powernv9' alias='powernv' maxCpus='2048'/> - <machine name='40p' maxCpus='1'/> + <machine name='pseries-2.3' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='pseries-2.1' maxCpus='1024' defaultCPU='power7_v2.3-powerpc64-cpu'/> + <machine name='powernv8' maxCpus='2048' defaultCPU='power8_v2.0-powerpc64-cpu'/> + <machine name='powernv9' alias='powernv' maxCpus='2048' defaultCPU='power9_v2.0-powerpc64-cpu'/> + <machine name='40p' maxCpus='1' defaultCPU='604-powerpc64-cpu'/> </qemuCaps> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml index 14783c8d1d..3d2ba7983b 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.s390x.xml @@ -3328,18 +3328,18 @@ <blocker name='type'/> </cpu> <cpu type='tcg' name='qemu' typename='qemu-s390x-cpu' usable='yes'/> - <machine name='s390-ccw-virtio-4.2' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes'/> - <machine name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248'/> - <machine name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248'/> + <machine name='s390-ccw-virtio-4.2' alias='s390-ccw-virtio' hotplugCpus='yes' maxCpus='248' default='yes' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-4.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-3.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.6' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.12' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.9' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-3.0' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.5' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.11' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.8' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-4.1' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.4' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.10' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> + <machine name='s390-ccw-virtio-2.7' hotplugCpus='yes' maxCpus='248' defaultCPU='qemu-s390x-cpu'/> </qemuCaps> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml index 176613fa2a..e87bb84a9e 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml @@ -1904,50 +1904,50 @@ </cpu> <cpu type='tcg' name='486-v1' typename='486-v1-x86_64-cpu' usable='yes'/> <cpu type='tcg' name='486' typename='486-x86_64-cpu' usable='yes'/> - <machine name='pc-i440fx-4.2' alias='pc' hotplugCpus='yes' maxCpus='255' default='yes'/> - <machine name='pc-0.15' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.12' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-4.2' alias='q35' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.7' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-1.1' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.7' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.10' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-0.14' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.9' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.11' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-3.1' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-q35-4.1' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-1.3' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-4.1' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.9' hotplugCpus='yes' maxCpus='255'/> - <machine name='isapc' hotplugCpus='yes' maxCpus='1'/> - <machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-1.0' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-4.0.1' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-0.13' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.8' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.10' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-3.0' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-q35-4.0' hotplugCpus='yes' maxCpus='288'/> - <machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-1.2' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-4.0' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255'/> - <machine name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288'/> + <machine name='pc-i440fx-4.2' alias='pc' hotplugCpus='yes' maxCpus='255' default='yes' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-0.15' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.12' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-4.2' alias='q35' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-0.12' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-1.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.10' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-0.14' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.9' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.11' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-3.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-4.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-1.3' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-4.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.9' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu'/> + <machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-1.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-4.0.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-0.13' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.8' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.10' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-3.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-4.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-1.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-4.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/> + <machine name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/> </qemuCaps> -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:58PM +0200, Jiri Denemark wrote:
QEMU 4.2.0 will report default CPU types used by each machine type and we will want to start using it.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change except for updated test results
src/qemu/qemu_capabilities.c | 15 ++- src/qemu/qemu_monitor.c | 1 + src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 12 +++ .../caps_4.2.0.aarch64.xml | 94 +++++++++---------- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 58 ++++++------ .../qemucapabilitiesdata/caps_4.2.0.s390x.xml | 28 +++--- .../caps_4.2.0.x86_64.xml | 92 +++++++++--------- 8 files changed, 163 insertions(+), 138 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - fix crash with CPUs without type src/qemu/qemu_capabilities.c | 36 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ 2 files changed, 39 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 33cd3491b2..dd7ea9ae86 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2179,6 +2179,42 @@ bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps, } +const char * +virQEMUCapsGetMachineDefaultCPU(virQEMUCapsPtr qemuCaps, + const char *name, + virDomainVirtType type) +{ + qemuMonitorCPUDefsPtr defs; + const char *cpuType = NULL; + size_t i; + + if (type == VIR_DOMAIN_VIRT_KVM) + defs = qemuCaps->kvmCPUModels; + else + defs = qemuCaps->tcgCPUModels; + + if (!name || !defs) + return NULL; + + for (i = 0; i < qemuCaps->nmachineTypes; i++) { + if (STREQ(qemuCaps->machineTypes[i].name, name)) { + cpuType = qemuCaps->machineTypes[i].defaultCPU; + break; + } + } + + if (!cpuType) + return NULL; + + for (i = 0; i < defs->ncpus; i++) { + if (STREQ_NULLABLE(defs->cpus[i].type, cpuType)) + return defs->cpus[i].name; + } + + return NULL; +} + + /** * virQEMUCapsSetGICCapabilities: * @qemuCaps: QEMU capabilities diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 923706c3bf..f5133d083d 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -607,6 +607,9 @@ int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, const char *name); bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps, const char *name); +const char *virQEMUCapsGetMachineDefaultCPU(virQEMUCapsPtr qemuCaps, + const char *name, + virDomainVirtType type); int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps, size_t *nmachines, virCapsGuestMachinePtr **machines); -- 2.23.0

On Tue, Oct 15, 2019 at 05:34:59PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - fix crash with CPUs without type
src/qemu/qemu_capabilities.c | 36 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_capabilities.h | 3 +++ 2 files changed, 39 insertions(+)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_capabilities.c | 12 ------------ src/qemu/qemu_capabilities.h | 1 - 2 files changed, 13 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index dd7ea9ae86..bd54c1751c 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2133,18 +2133,6 @@ const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps, return name; } -const char * -virQEMUCapsGetDefaultMachine(virQEMUCapsPtr qemuCaps) -{ - size_t i; - - for (i = 0; i < qemuCaps->nmachineTypes; i++) { - if (qemuCaps->machineTypes[i].qemuDefault) - return qemuCaps->machineTypes[i].name; - } - - return NULL; -} int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, const char *name) diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index f5133d083d..feb6a9ecd0 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -602,7 +602,6 @@ bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, virCPUMode mode); const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps, const char *name); -const char *virQEMUCapsGetDefaultMachine(virQEMUCapsPtr qemuCaps); int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps, const char *name); bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps, -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:00PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/qemu/qemu_capabilities.c | 12 ------------ src/qemu/qemu_capabilities.h | 1 - 2 files changed, 13 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> --- Notes: Version 2: - no change src/qemu/qemu_domain.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index c638077aa8..9dcba4ef38 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4617,55 +4617,51 @@ qemuDomainDefPostParse(virDomainDefPtr def, void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver); /* Note that qemuCaps may be NULL when this function is called. This * function shall not fail in that case. It will be re-run on VM startup * with the capabilities populated. */ virQEMUCapsPtr qemuCaps = parseOpaque; - int ret = -1; if (def->os.bootloader || def->os.bootloaderArgs) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("bootloader is not supported by QEMU")); - goto cleanup; + return -1; } if (!def->os.machine) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing machine type")); - goto cleanup; + return -1; } if (qemuDomainNVRAMPathGenerate(cfg, def) < 0) - goto cleanup; + return -1; if (qemuDomainDefAddDefaultDevices(def, qemuCaps) < 0) - goto cleanup; + return -1; if (qemuCanonicalizeMachine(def, qemuCaps) < 0) - goto cleanup; + return -1; qemuDomainDefEnableDefaultFeatures(def, qemuCaps); if (qemuDomainRecheckInternalPaths(def, cfg, parseFlags) < 0) - goto cleanup; + return -1; if (qemuSecurityVerify(driver->securityManager, def) < 0) - goto cleanup; + return -1; if (qemuDomainDefVcpusPostParse(def) < 0) - goto cleanup; + return -1; if (qemuDomainDefCPUPostParse(def) < 0) - goto cleanup; + return -1; if (qemuDomainDefTsegPostParse(def, qemuCaps) < 0) - goto cleanup; + return -1; - ret = 0; - cleanup: - virObjectUnref(cfg); - return ret; + return 0; } -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:01PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> ---
Notes: Version 2: - no change
src/qemu/qemu_domain.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index c638077aa8..9dcba4ef38 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4617,55 +4617,51 @@ qemuDomainDefPostParse(virDomainDefPtr def, void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver);
g_autoptr Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - no change src/conf/cpu_conf.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 30904fab95..230e75f077 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -151,6 +151,7 @@ virCPUDefFreeModel(virCPUDefPtr def); void virCPUDefFree(virCPUDefPtr def); +VIR_DEFINE_AUTOPTR_FUNC(virCPUDef, virCPUDefFree); int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) virCPUDefCopyModel(virCPUDefPtr dst, -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:02PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - no change
src/conf/cpu_conf.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 30904fab95..230e75f077 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -151,6 +151,7 @@ virCPUDefFreeModel(virCPUDefPtr def);
void virCPUDefFree(virCPUDefPtr def); +VIR_DEFINE_AUTOPTR_FUNC(virCPUDef, virCPUDefFree);
G_DEFINE_AUTOPTR_CLEANUP_FUNC Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch ...fault-cpu-kvm-virt-4.2.aarch64-latest.args | 38 +++++++++++++++++++ .../aarch64-default-cpu-kvm-virt-4.2.xml | 20 ++++++++++ ...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 38 +++++++++++++++++++ .../aarch64-default-cpu-tcg-virt-4.2.xml | 20 ++++++++++ tests/qemuxml2argvtest.c | 3 ++ ...efault-cpu-kvm-virt-4.2.aarch64-latest.xml | 38 +++++++++++++++++++ ...efault-cpu-tcg-virt-4.2.aarch64-latest.xml | 38 +++++++++++++++++++ tests/qemuxml2xmltest.c | 3 ++ 8 files changed, 198 insertions(+) create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml diff --git a/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args b/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args new file mode 100644 index 0000000000..fe33d5410a --- /dev/null +++ b/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-aarch64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine virt-4.2,accel=kvm,usb=off,dump-guest-core=off,gic-version=3 \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\ +addr=0x1 \ +-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.1,addr=0x0,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml b/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml new file mode 100644 index 0000000000..1267306ebf --- /dev/null +++ b/tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml @@ -0,0 +1,20 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='aarch64' machine='virt-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args new file mode 100644 index 0000000000..5ecbe1fdd6 --- /dev/null +++ b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-aarch64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2 \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-no-acpi \ +-boot strict=on \ +-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\ +addr=0x1 \ +-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.1,addr=0x0,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml new file mode 100644 index 0000000000..20ef1228ce --- /dev/null +++ b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml @@ -0,0 +1,20 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='aarch64' machine='virt-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 5212ce50bd..b88518b2ff 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3034,6 +3034,9 @@ mymain(void) DO_TEST_CAPS_LATEST("vhost-user-vga"); DO_TEST_CAPS_LATEST("vhost-user-gpu-secondary"); + DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-kvm-virt-4.2", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-tcg-virt-4.2", "aarch64"); + if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml b/tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml new file mode 100644 index 0000000000..efbe726758 --- /dev/null +++ b/tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml @@ -0,0 +1,38 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <gic version='3'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </disk> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='1' port='0x8'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/> + </controller> + <controller type='pci' index='2' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='2' port='0x9'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml b/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml new file mode 100644 index 0000000000..1f4104857a --- /dev/null +++ b/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml @@ -0,0 +1,38 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='aarch64' machine='virt-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <gic version='2'/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-aarch64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </disk> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='1' port='0x8'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/> + </controller> + <controller type='pci' index='2' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='2' port='0x9'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index b9364f942f..fee5dc66a1 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1340,6 +1340,9 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("x86_64-pc-graphics", "x86_64"); DO_TEST_CAPS_ARCH_LATEST("x86_64-q35-graphics", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-kvm-virt-4.2", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-tcg-virt-4.2", "aarch64"); + if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:03PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
...fault-cpu-kvm-virt-4.2.aarch64-latest.args | 38 +++++++++++++++++++ .../aarch64-default-cpu-kvm-virt-4.2.xml | 20 ++++++++++ ...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 38 +++++++++++++++++++ .../aarch64-default-cpu-tcg-virt-4.2.xml | 20 ++++++++++ tests/qemuxml2argvtest.c | 3 ++ ...efault-cpu-kvm-virt-4.2.aarch64-latest.xml | 38 +++++++++++++++++++ ...efault-cpu-tcg-virt-4.2.aarch64-latest.xml | 38 +++++++++++++++++++ tests/qemuxml2xmltest.c | 3 ++ 8 files changed, 198 insertions(+) create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-kvm-virt-4.2.xml create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args create mode 100644 tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-kvm-virt-4.2.aarch64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch ...ault-cpu-kvm-pseries-2.7.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-2.7.xml | 22 +++++++++ ...ault-cpu-kvm-pseries-3.1.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-3.1.xml | 22 +++++++++ ...ault-cpu-kvm-pseries-4.2.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-4.2.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-2.7.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-3.1.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-4.2.xml | 22 +++++++++ tests/qemuxml2argvtest.c | 6 +++ ...fault-cpu-kvm-pseries-2.7.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-kvm-pseries-3.1.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-kvm-pseries-4.2.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-2.7.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-3.1.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-4.2.ppc64-latest.xml | 45 +++++++++++++++++++ tests/qemuxml2xmltest.c | 6 +++ 20 files changed, 642 insertions(+) create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args new file mode 100644 index 0000000000..d264659d49 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-2.7,accel=kvm,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml new file mode 100644 index 0000000000..9aac1815c4 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml @@ -0,0 +1,22 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-2.7'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args new file mode 100644 index 0000000000..88f3b4ba26 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-3.1,accel=kvm,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml new file mode 100644 index 0000000000..820b5bdf1c --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml @@ -0,0 +1,22 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-3.1'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args new file mode 100644 index 0000000000..ea27f424cb --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml new file mode 100644 index 0000000000..df89d1c1be --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml @@ -0,0 +1,22 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args new file mode 100644 index 0000000000..c97fa531ae --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-2.7,accel=tcg,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml new file mode 100644 index 0000000000..3e873becc6 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml @@ -0,0 +1,22 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-2.7'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args new file mode 100644 index 0000000000..fbad53b0fb --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-3.1,accel=tcg,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml new file mode 100644 index 0000000000..747de38584 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml @@ -0,0 +1,22 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-3.1'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args new file mode 100644 index 0000000000..4222d4d4aa --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args @@ -0,0 +1,38 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-ppc64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pseries-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pci-ohci,id=usb,bus=pci.0,addr=0x1 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-chardev pty,id=charserial0 \ +-device spapr-vty,chardev=charserial0,id=serial0,reg=0x30000000 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml new file mode 100644 index 0000000000..1e2fef3313 --- /dev/null +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml @@ -0,0 +1,22 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + <console type='pty'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index b88518b2ff..7fb84fc950 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3036,6 +3036,12 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-kvm-virt-4.2", "aarch64"); DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-tcg-virt-4.2", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-2.7", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-2.7", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-3.1", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-3.1", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-4.2", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml new file mode 100644 index 0000000000..d0bff449c1 --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-2.7'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml new file mode 100644 index 0000000000..add48334e7 --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-3.1'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml new file mode 100644 index 0000000000..9c02766b71 --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-4.2'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml new file mode 100644 index 0000000000..fc1714a17e --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-2.7'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml new file mode 100644 index 0000000000..f40f3be155 --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-3.1'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml new file mode 100644 index 0000000000..9582223550 --- /dev/null +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml @@ -0,0 +1,45 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='ppc64' machine='pseries-4.2'>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-ppc64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </disk> + <controller type='usb' index='0' model='pci-ohci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'> + <model name='spapr-pci-host-bridge'/> + <target index='0'/> + </controller> + <serial type='pty'> + <target type='spapr-vio-serial' port='0'> + <model name='spapr-vty'/> + </target> + <address type='spapr-vio' reg='0x30000000'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + <address type='spapr-vio' reg='0x30000000'/> + </console> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + <panic model='pseries'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index fee5dc66a1..9b23bdbd75 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1342,6 +1342,12 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-kvm-virt-4.2", "aarch64"); DO_TEST_CAPS_ARCH_LATEST("aarch64-default-cpu-tcg-virt-4.2", "aarch64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-2.7", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-2.7", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-3.1", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-3.1", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-4.2", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:04PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
...ault-cpu-kvm-pseries-2.7.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-2.7.xml | 22 +++++++++ ...ault-cpu-kvm-pseries-3.1.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-3.1.xml | 22 +++++++++ ...ault-cpu-kvm-pseries-4.2.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-kvm-pseries-4.2.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-2.7.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-3.1.xml | 22 +++++++++ ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 38 ++++++++++++++++ .../ppc64-default-cpu-tcg-pseries-4.2.xml | 22 +++++++++ tests/qemuxml2argvtest.c | 6 +++ ...fault-cpu-kvm-pseries-2.7.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-kvm-pseries-3.1.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-kvm-pseries-4.2.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-2.7.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-3.1.ppc64-latest.xml | 45 +++++++++++++++++++ ...fault-cpu-tcg-pseries-4.2.ppc64-latest.xml | 45 +++++++++++++++++++ tests/qemuxml2xmltest.c | 6 +++ 20 files changed, 642 insertions(+) create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-kvm-pseries-4.2.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.xml create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args create mode 100644 tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-kvm-pseries-4.2.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch ...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 31 +++++++++++++++++++ .../s390-default-cpu-kvm-ccw-virtio-4.2.xml | 16 ++++++++++ ...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 31 +++++++++++++++++++ .../s390-default-cpu-tcg-ccw-virtio-4.2.xml | 16 ++++++++++ tests/qemuxml2argvtest.c | 2 ++ ...lt-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml | 23 ++++++++++++++ ...lt-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml | 23 ++++++++++++++ tests/qemuxml2xmltest.c | 2 ++ 8 files changed, 144 insertions(+) create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args new file mode 100644 index 0000000000..d45a87e6ec --- /dev/null +++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args @@ -0,0 +1,31 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name guest=test,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-test/master-key.aes \ +-machine s390-ccw-virtio-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-m 256 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0000 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml new file mode 100644 index 0000000000..405b53db7d --- /dev/null +++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml @@ -0,0 +1,16 @@ +<domain type='kvm'> + <name>test</name> + <uuid>9aa4b45c-b9dd-45ef-91fe-862b27b4231f</uuid> + <memory>262144</memory> + <currentMemory>262144</currentMemory> + <os> + <type arch='s390x' machine='s390-ccw-virtio-4.2'>hvm</type> + </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-s390x</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args new file mode 100644 index 0000000000..3d31148613 --- /dev/null +++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args @@ -0,0 +1,31 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-s390x \ +-name guest=test,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-test/master-key.aes \ +-machine s390-ccw-virtio-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-m 256 \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 9aa4b45c-b9dd-45ef-91fe-862b27b4231f \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0000 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml new file mode 100644 index 0000000000..c6c92bb08a --- /dev/null +++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml @@ -0,0 +1,16 @@ +<domain type='qemu'> + <name>test</name> + <uuid>9aa4b45c-b9dd-45ef-91fe-862b27b4231f</uuid> + <memory>262144</memory> + <currentMemory>262144</currentMemory> + <os> + <type arch='s390x' machine='s390-ccw-virtio-4.2'>hvm</type> + </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-s390x</emulator> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 7fb84fc950..e19f30ff15 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3042,6 +3042,8 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-3.1", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-4.2", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-kvm-ccw-virtio-4.2", "s390x"); + DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-tcg-ccw-virtio-4.2", "s390x"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml b/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml new file mode 100644 index 0000000000..b35de63ab3 --- /dev/null +++ b/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml @@ -0,0 +1,23 @@ +<domain type='kvm'> + <name>test</name> + <uuid>9aa4b45c-b9dd-45ef-91fe-862b27b4231f</uuid> + <memory unit='KiB'>262144</memory> + <currentMemory unit='KiB'>262144</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio-4.2'>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-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml b/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml new file mode 100644 index 0000000000..55149d4a78 --- /dev/null +++ b/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml @@ -0,0 +1,23 @@ +<domain type='qemu'> + <name>test</name> + <uuid>9aa4b45c-b9dd-45ef-91fe-862b27b4231f</uuid> + <memory unit='KiB'>262144</memory> + <currentMemory unit='KiB'>262144</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='s390x' machine='s390-ccw-virtio-4.2'>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-s390x</emulator> + <controller type='pci' index='0' model='pci-root'/> + <memballoon model='virtio'> + <address type='ccw' cssid='0xfe' ssid='0x0' devno='0x0000'/> + </memballoon> + <panic model='s390'/> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 9b23bdbd75..19650c424f 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1348,6 +1348,8 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-3.1", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-kvm-pseries-4.2", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); + DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-kvm-ccw-virtio-4.2", "s390x"); + DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-tcg-ccw-virtio-4.2", "s390x"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:05PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
...t-cpu-kvm-ccw-virtio-4.2.s390x-latest.args | 31 +++++++++++++++++++ .../s390-default-cpu-kvm-ccw-virtio-4.2.xml | 16 ++++++++++ ...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 31 +++++++++++++++++++ .../s390-default-cpu-tcg-ccw-virtio-4.2.xml | 16 ++++++++++ tests/qemuxml2argvtest.c | 2 ++ ...lt-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml | 23 ++++++++++++++ ...lt-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml | 23 ++++++++++++++ tests/qemuxml2xmltest.c | 2 ++ 8 files changed, 144 insertions(+) create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args create mode 100644 tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml create mode 100644 tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- Notes: Version 2: - new patch ...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 36 +++++++++++ .../x86_64-default-cpu-kvm-pc-4.2.xml | 24 ++++++++ ...default-cpu-kvm-q35-4.2.x86_64-latest.args | 41 +++++++++++++ .../x86_64-default-cpu-kvm-q35-4.2.xml | 24 ++++++++ ...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 36 +++++++++++ .../x86_64-default-cpu-tcg-pc-4.2.xml | 24 ++++++++ ...default-cpu-tcg-q35-4.2.x86_64-latest.args | 41 +++++++++++++ .../x86_64-default-cpu-tcg-q35-4.2.xml | 24 ++++++++ tests/qemuxml2argvtest.c | 4 ++ ...4-default-cpu-kvm-pc-4.2.x86_64-latest.xml | 37 ++++++++++++ ...-default-cpu-kvm-q35-4.2.x86_64-latest.xml | 60 +++++++++++++++++++ ...4-default-cpu-tcg-pc-4.2.x86_64-latest.xml | 37 ++++++++++++ ...-default-cpu-tcg-q35-4.2.x86_64-latest.xml | 60 +++++++++++++++++++ tests/qemuxml2xmltest.c | 4 ++ 14 files changed, 452 insertions(+) create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args new file mode 100644 index 0000000000..c7bef11f22 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args @@ -0,0 +1,36 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pc-i440fx-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml new file mode 100644 index 0000000000..ce432ef52f --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml @@ -0,0 +1,24 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='x86_64' machine='pc-i440fx-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args new file mode 100644 index 0000000000..c65d29fc32 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pc-q35-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\ +addr=0x1 \ +-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \ +-device pcie-root-port,port=0xa,chassis=3,id=pci.3,bus=pcie.0,addr=0x1.0x2 \ +-device pcie-root-port,port=0xb,chassis=4,id=pci.4,bus=pcie.0,addr=0x1.0x3 \ +-device qemu-xhci,id=usb,bus=pci.1,addr=0x0 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.2,addr=0x0,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.3,addr=0x0 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml new file mode 100644 index 0000000000..bf2678e674 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml @@ -0,0 +1,24 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='x86_64' machine='pc-q35-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args new file mode 100644 index 0000000000..1c233243ad --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args @@ -0,0 +1,36 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pc-i440fx-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x2,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml new file mode 100644 index 0000000000..8e77a3ad92 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml @@ -0,0 +1,24 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='x86_64' machine='pc-i440fx-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args new file mode 100644 index 0000000000..505eeb44b3 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args @@ -0,0 +1,41 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-guest \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-guest/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-guest/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-guest/.config \ +QEMU_AUDIO_DRV=none \ +/usr/bin/qemu-system-x86_64 \ +-name guest=guest,debug-threads=on \ +-S \ +-object secret,id=masterKey0,format=raw,\ +file=/tmp/lib/domain--1-guest/master-key.aes \ +-machine pc-q35-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-m 4096 \ +-overcommit mem-lock=off \ +-smp 4,sockets=4,cores=1,threads=1 \ +-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server,nowait \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\ +addr=0x1 \ +-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \ +-device pcie-root-port,port=0xa,chassis=3,id=pci.3,bus=pcie.0,addr=0x1.0x2 \ +-device pcie-root-port,port=0xb,chassis=4,id=pci.4,bus=pcie.0,addr=0x1.0x3 \ +-device qemu-xhci,id=usb,bus=pci.1,addr=0x0 \ +-drive file=/var/lib/libvirt/images/guest.qcow2,format=qcow2,if=none,\ +id=drive-virtio-disk0 \ +-device virtio-blk-pci,scsi=off,bus=pci.2,addr=0x0,drive=drive-virtio-disk0,\ +id=virtio-disk0,bootindex=1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.3,addr=0x0 \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\ +resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml new file mode 100644 index 0000000000..4e3b341800 --- /dev/null +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml @@ -0,0 +1,24 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory>4194304</memory> + <currentMemory>4194304</currentMemory> + <vcpu>4</vcpu> + <os> + <type arch='x86_64' machine='pc-q35-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + </disk> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index e19f30ff15..8d60a30678 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3044,6 +3044,10 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-kvm-ccw-virtio-4.2", "s390x"); DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-tcg-ccw-virtio-4.2", "s390x"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-pc-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-pc-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-q35-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml new file mode 100644 index 0000000000..1f24dee8e7 --- /dev/null +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml @@ -0,0 +1,37 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='x86_64' machine='pc-i440fx-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='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'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml new file mode 100644 index 0000000000..39a7013b67 --- /dev/null +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml @@ -0,0 +1,60 @@ +<domain type='kvm'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='x86_64' machine='pc-q35-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </disk> + <controller type='usb' index='0' model='qemu-xhci'> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='sata' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='1' port='0x8'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/> + </controller> + <controller type='pci' index='2' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='2' port='0x9'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='3' port='0xa'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='4' port='0xb'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/> + </controller> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml new file mode 100644 index 0000000000..b45ad4c051 --- /dev/null +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='x86_64' machine='pc-i440fx-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='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'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml new file mode 100644 index 0000000000..c6a85977e9 --- /dev/null +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml @@ -0,0 +1,60 @@ +<domain type='qemu'> + <name>guest</name> + <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>4</vcpu> + <os> + <type arch='x86_64' machine='pc-q35-4.2'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/guest.qcow2'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/> + </disk> + <controller type='usb' index='0' model='qemu-xhci'> + <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> + </controller> + <controller type='sata' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pcie-root'/> + <controller type='pci' index='1' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='1' port='0x8'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/> + </controller> + <controller type='pci' index='2' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='2' port='0x9'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='3' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='3' port='0xa'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='4' model='pcie-root-port'> + <model name='pcie-root-port'/> + <target chassis='4' port='0xb'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/> + </controller> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 19650c424f..ab6399b683 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1350,6 +1350,10 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("ppc64-default-cpu-tcg-pseries-4.2", "ppc64"); DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-kvm-ccw-virtio-4.2", "s390x"); DO_TEST_CAPS_ARCH_LATEST("s390-default-cpu-tcg-ccw-virtio-4.2", "s390x"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-pc-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-pc-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-kvm-q35-4.2", "x86_64"); + DO_TEST_CAPS_ARCH_LATEST("x86_64-default-cpu-tcg-q35-4.2", "x86_64"); if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:06PM +0200, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> ---
Notes: Version 2: - new patch
...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 36 +++++++++++ .../x86_64-default-cpu-kvm-pc-4.2.xml | 24 ++++++++ ...default-cpu-kvm-q35-4.2.x86_64-latest.args | 41 +++++++++++++ .../x86_64-default-cpu-kvm-q35-4.2.xml | 24 ++++++++ ...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 36 +++++++++++ .../x86_64-default-cpu-tcg-pc-4.2.xml | 24 ++++++++ ...default-cpu-tcg-q35-4.2.x86_64-latest.args | 41 +++++++++++++ .../x86_64-default-cpu-tcg-q35-4.2.xml | 24 ++++++++ tests/qemuxml2argvtest.c | 4 ++ ...4-default-cpu-kvm-pc-4.2.x86_64-latest.xml | 37 ++++++++++++ ...-default-cpu-kvm-q35-4.2.x86_64-latest.xml | 60 +++++++++++++++++++ ...4-default-cpu-tcg-pc-4.2.x86_64-latest.xml | 37 ++++++++++++ ...-default-cpu-tcg-q35-4.2.x86_64-latest.xml | 60 +++++++++++++++++++ tests/qemuxml2xmltest.c | 4 ++ 14 files changed, 452 insertions(+) create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.xml create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml create mode 100644 tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano

When starting a domain without a CPU model specified in the domain XML, QEMU will choose a default one. Which is fine unless the domain gets migrated to another host because libvirt doesn't perform any CPU ABI checks and the virtual CPU provided by QEMU on the destination host can differ from the one on the source host. With QEMU 4.2.0 we can probe for the default CPU model used by QEMU for a particular machine type and store it in the domain XML. This way the chosen CPU model is more visible to users and libvirt will make sure the guest will see the exact same CPU after migration. Architecture specific notes - aarch64: We only set the default CPU for TCG domains as KVM requires -cpu host to work. - ppc64: (to be checked with QEMU developers) Default CPU data reported by QEMU is unusable for KVM. QEMU would effectively use -cpu host by default and it even rewrites typename of the current host CPU model to host-powerpc64-cpu. The default CPU type reported by query-machines is still power*-powerpc64-cpu, which may not even exist due to the changed typename. For example, on a Power8 host, power8 CPU model is of host-powerpc64-cpu type (according to query-cpu-definitions), while the default CPU type name for pseries-3.1 machine type is reported as power8_v2.0-powerpc64-cpu. What's even worse, pseries-4.2 says the default CPU type is power9_v2.0-powerpc64-cpu, which cannot be started on older host at all. So again, we only set the default CPU for TCG domains. - s390x: (to be checked with QEMU developers) The default CPU is said to be "qemu", which works fine for TCG domains, but it doesn't work on KVM because QEMU complains that some features requested in the CPU model are not available. - x86_64: The default CPU model (qemu64) is not runnable on any host with KVM, but in contrast to s390x QEMU just disables unavailable features and starts happily. https://bugzilla.redhat.com/show_bug.cgi?id=1598151 https://bugzilla.redhat.com/show_bug.cgi?id=1598162 --- Notes: This patch should not be merged yet as we need to confirm what to do on s390x and ppc64 architectures. Version 2: - new test cases src/qemu/qemu_domain.c | 56 +++++++++++++++++++ ...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 1 + .../disk-cache.x86_64-latest.args | 1 + .../disk-cdrom-network.x86_64-latest.args | 1 + .../disk-cdrom-tray.x86_64-latest.args | 1 + .../disk-copy_on_read.x86_64-latest.args | 1 + .../disk-detect-zeroes.x86_64-latest.args | 1 + .../disk-floppy-q35-2_11.x86_64-latest.args | 1 + .../disk-floppy-q35-2_9.x86_64-latest.args | 1 + .../os-firmware-bios.x86_64-latest.args | 1 + ...os-firmware-efi-secboot.x86_64-latest.args | 1 + .../os-firmware-efi.x86_64-latest.args | 1 + ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 1 + ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 1 + ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 1 + ...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 1 + .../tpm-emulator-tpm2-enc.x86_64-latest.args | 1 + .../tpm-emulator-tpm2.x86_64-latest.args | 1 + .../tpm-emulator.x86_64-latest.args | 1 + .../tseg-explicit-size.x86_64-latest.args | 1 + .../vhost-vsock-auto.x86_64-latest.args | 1 + .../vhost-vsock.x86_64-latest.args | 1 + ...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 1 + ...default-cpu-kvm-q35-4.2.x86_64-latest.args | 1 + ...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 1 + ...default-cpu-tcg-q35-4.2.x86_64-latest.args | 1 + ...efault-cpu-tcg-virt-4.2.aarch64-latest.xml | 3 + .../os-firmware-bios.x86_64-latest.xml | 3 + .../os-firmware-efi-secboot.x86_64-latest.xml | 3 + .../os-firmware-efi.x86_64-latest.xml | 3 + ...fault-cpu-tcg-pseries-2.7.ppc64-latest.xml | 3 + ...fault-cpu-tcg-pseries-3.1.ppc64-latest.xml | 3 + ...fault-cpu-tcg-pseries-4.2.ppc64-latest.xml | 3 + ...lt-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml | 3 + .../tpm-emulator-tpm2-enc.x86_64-latest.xml | 3 + .../tpm-emulator-tpm2.x86_64-latest.xml | 3 + .../tpm-emulator.x86_64-latest.xml | 3 + .../tpm-passthrough-crb.x86_64-latest.xml | 3 + .../tpm-passthrough.x86_64-latest.xml | 3 + ...4-default-cpu-kvm-pc-4.2.x86_64-latest.xml | 3 + ...-default-cpu-kvm-q35-4.2.x86_64-latest.xml | 3 + ...4-default-cpu-tcg-pc-4.2.x86_64-latest.xml | 3 + ...-default-cpu-tcg-q35-4.2.x86_64-latest.xml | 3 + 43 files changed, 132 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9dcba4ef38..438f003186 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4470,6 +4470,59 @@ qemuDomainDefVcpusPostParse(virDomainDefPtr def) } +static int +qemuDomainDefSetDefaultCPU(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps) +{ + VIR_AUTOPTR(virCPUDef) newCPU = NULL; + virCPUDefPtr cpu = def->cpu; + const char *model; + + if (cpu && + (cpu->mode != VIR_CPU_MODE_CUSTOM || + cpu->model)) + return 0; + + /* Default CPU model info from QEMU is usable for TCG only on non-Intel + * architectures. */ + if (!ARCH_IS_X86(def->os.arch) && def->virtType != VIR_DOMAIN_VIRT_QEMU) + return 0; + + model = virQEMUCapsGetMachineDefaultCPU(qemuCaps, def->os.machine, def->virtType); + if (!model) { + VIR_DEBUG("Unknown default CPU model for domain '%s'", def->name); + return 0; + } + + VIR_DEBUG("Setting default CPU model for domain '%s' to %s", + def->name, model); + + if (!cpu) { + if (VIR_ALLOC(newCPU) < 0) + return -1; + cpu = newCPU; + } + + /* We need to turn off all CPU checks when the domain is started because + * the default CPU (e.g., qemu64) may not be runnable on any host. QEMU + * will just disable the unavailable features and we will update the CPU + * definition accordingly and set check to FULL when starting the domain. */ + cpu->type = VIR_CPU_TYPE_GUEST; + cpu->mode = VIR_CPU_MODE_CUSTOM; + cpu->match = VIR_CPU_MATCH_EXACT; + cpu->check = VIR_CPU_CHECK_NONE; + cpu->fallback = VIR_CPU_FALLBACK_FORBID; + + if (VIR_STRDUP(cpu->model, model) < 0) + return -1; + + if (newCPU) + VIR_STEAL_PTR(def->cpu, newCPU); + + return 0; +} + + static int qemuDomainDefCPUPostParse(virDomainDefPtr def) { @@ -4644,6 +4697,9 @@ qemuDomainDefPostParse(virDomainDefPtr def, if (qemuCanonicalizeMachine(def, qemuCaps) < 0) return -1; + if (qemuDomainDefSetDefaultCPU(def, qemuCaps) < 0) + return -1; + qemuDomainDefEnableDefaultFeatures(def, qemuCaps); if (qemuDomainRecheckInternalPaths(def, cfg, parseFlags) < 0) diff --git a/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args index 5ecbe1fdd6..5305c23464 100644 --- a/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args +++ b/tests/qemuxml2argvdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2 \ +-cpu cortex-a15 \ -m 4096 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args index 7ea6d5b4d5..01d3b9d490 100644 --- a/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cache.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-i440fx-2.6,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args index cf711c0a3f..e0d2eb049d 100644 --- a/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cdrom-network.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-1.2,accel=kvm,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args index ad17416851..21542db4c2 100644 --- a/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-cdrom-tray.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args index 1f1d37c957..8552f9f00e 100644 --- a/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-copy_on_read.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args index b48c0f8d43..2a01647e50 100644 --- a/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-detect-zeroes.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-floppy-q35-2_11.x86_64-latest.args b/tests/qemuxml2argvdata/disk-floppy-q35-2_11.x86_64-latest.args index 02e2b1e76c..fadd5a6d7e 100644 --- a/tests/qemuxml2argvdata/disk-floppy-q35-2_11.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-floppy-q35-2_11.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-q35-2.11,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/disk-floppy-q35-2_9.x86_64-latest.args b/tests/qemuxml2argvdata/disk-floppy-q35-2_9.x86_64-latest.args index a158e8e3d3..4c932a7365 100644 --- a/tests/qemuxml2argvdata/disk-floppy-q35-2_9.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-floppy-q35-2_9.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-q35-2.9,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/os-firmware-bios.x86_64-latest.args b/tests/qemuxml2argvdata/os-firmware-bios.x86_64-latest.args index 7d6108ec24..4391c6eda2 100644 --- a/tests/qemuxml2argvdata/os-firmware-bios.x86_64-latest.args +++ b/tests/qemuxml2argvdata/os-firmware-bios.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-fedora/master-key.aes \ -machine pc-q35-4.0,accel=kvm,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -bios /usr/share/seabios/bios-256k.bin \ -m 8 \ -overcommit mem-lock=off \ diff --git a/tests/qemuxml2argvdata/os-firmware-efi-secboot.x86_64-latest.args b/tests/qemuxml2argvdata/os-firmware-efi-secboot.x86_64-latest.args index d8f356ea07..4de135beb8 100644 --- a/tests/qemuxml2argvdata/os-firmware-efi-secboot.x86_64-latest.args +++ b/tests/qemuxml2argvdata/os-firmware-efi-secboot.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-fedora/master-key.aes \ -machine pc-q35-4.0,accel=kvm,usb=off,smm=on,dump-guest-core=off \ +-cpu qemu64 \ -global driver=cfi.pflash01,property=secure,value=on \ -drive file=/usr/share/OVMF/OVMF_CODE.secboot.fd,if=pflash,format=raw,unit=0,\ readonly=on \ diff --git a/tests/qemuxml2argvdata/os-firmware-efi.x86_64-latest.args b/tests/qemuxml2argvdata/os-firmware-efi.x86_64-latest.args index e4dda734b0..7eba20e443 100644 --- a/tests/qemuxml2argvdata/os-firmware-efi.x86_64-latest.args +++ b/tests/qemuxml2argvdata/os-firmware-efi.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-fedora/master-key.aes \ -machine pc-q35-4.0,accel=kvm,usb=off,smm=on,dump-guest-core=off \ +-cpu qemu64 \ -drive file=/usr/share/OVMF/OVMF_CODE.secboot.fd,if=pflash,format=raw,unit=0,\ readonly=on \ -drive file=/var/lib/libvirt/qemu/nvram/fedora_VARS.fd,if=pflash,format=raw,\ diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args index c97fa531ae..06946dcbd9 100644 --- a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pseries-2.7,accel=tcg,usb=off,dump-guest-core=off \ +-cpu POWER7 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args index fbad53b0fb..6090a1bbad 100644 --- a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pseries-3.1,accel=tcg,usb=off,dump-guest-core=off \ +-cpu POWER8 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args index 4222d4d4aa..7804a7b220 100644 --- a/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args +++ b/tests/qemuxml2argvdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pseries-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-cpu POWER9 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args index 3d31148613..c7bd0c3840 100644 --- a/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args +++ b/tests/qemuxml2argvdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine s390-ccw-virtio-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu \ -m 256 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args index 3c8dc8e483..2455e14cfe 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2-enc.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-TPM-VM/master-key.aes \ -machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 2048 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args index 3c8dc8e483..2455e14cfe 100644 --- a/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator-tpm2.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-TPM-VM/master-key.aes \ -machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 2048 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args b/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args index 3c8dc8e483..2455e14cfe 100644 --- a/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tpm-emulator.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-TPM-VM/master-key.aes \ -machine pc-i440fx-2.12,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 2048 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/tseg-explicit-size.x86_64-latest.args b/tests/qemuxml2argvdata/tseg-explicit-size.x86_64-latest.args index 2fece310e7..53dab283cc 100644 --- a/tests/qemuxml2argvdata/tseg-explicit-size.x86_64-latest.args +++ b/tests/qemuxml2argvdata/tseg-explicit-size.x86_64-latest.args @@ -14,6 +14,7 @@ QEMU_AUDIO_DRV=none \ file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc-q35-2.10,accel=tcg,usb=off,smm=on,dump-guest-core=off \ -global mch.extended-tseg-mbytes=48 \ +-cpu qemu64 \ -m 214 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/vhost-vsock-auto.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-vsock-auto.x86_64-latest.args index b5d3ff2204..e083b872c5 100644 --- a/tests/qemuxml2argvdata/vhost-vsock-auto.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-vsock-auto.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine pc-i440fx-2.9,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args b/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args index 76df9d2d4d..1b0ffee6e8 100644 --- a/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args +++ b/tests/qemuxml2argvdata/vhost-vsock.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-test/master-key.aes \ -machine pc-0.13,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 1024 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args index c7bef11f22..7a335bc0c4 100644 --- a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pc-i440fx-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args index c65d29fc32..88a634fc68 100644 --- a/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pc-q35-4.2,accel=kvm,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args index 1c233243ad..5f11a07a19 100644 --- a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pc-i440fx-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args index 505eeb44b3..1c9330f720 100644 --- a/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args +++ b/tests/qemuxml2argvdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.args @@ -13,6 +13,7 @@ QEMU_AUDIO_DRV=none \ -object secret,id=masterKey0,format=raw,\ file=/tmp/lib/domain--1-guest/master-key.aes \ -machine pc-q35-4.2,accel=tcg,usb=off,dump-guest-core=off \ +-cpu qemu64 \ -m 4096 \ -overcommit mem-lock=off \ -smp 4,sockets=4,cores=1,threads=1 \ diff --git a/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml b/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml index 1f4104857a..c0aa2f39ee 100644 --- a/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml +++ b/tests/qemuxml2xmloutdata/aarch64-default-cpu-tcg-virt-4.2.aarch64-latest.xml @@ -11,6 +11,9 @@ <features> <gic version='2'/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>cortex-a15</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/os-firmware-bios.x86_64-latest.xml b/tests/qemuxml2xmloutdata/os-firmware-bios.x86_64-latest.xml index 63886666dd..60d3498765 100644 --- a/tests/qemuxml2xmloutdata/os-firmware-bios.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/os-firmware-bios.x86_64-latest.xml @@ -16,6 +16,9 @@ <apic/> <pae/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/os-firmware-efi-secboot.x86_64-latest.xml b/tests/qemuxml2xmloutdata/os-firmware-efi-secboot.x86_64-latest.xml index a285e06334..938da73711 100644 --- a/tests/qemuxml2xmloutdata/os-firmware-efi-secboot.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/os-firmware-efi-secboot.x86_64-latest.xml @@ -16,6 +16,9 @@ <apic/> <pae/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/os-firmware-efi.x86_64-latest.xml b/tests/qemuxml2xmloutdata/os-firmware-efi.x86_64-latest.xml index 46a7b1b780..97ce8a75c7 100644 --- a/tests/qemuxml2xmloutdata/os-firmware-efi.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/os-firmware-efi.x86_64-latest.xml @@ -16,6 +16,9 @@ <apic/> <pae/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml index fc1714a17e..e76766ff5a 100644 --- a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-2.7.ppc64-latest.xml @@ -8,6 +8,9 @@ <type arch='ppc64' machine='pseries-2.7'>hvm</type> <boot dev='hd'/> </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>POWER7</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml index f40f3be155..c1d619a9cb 100644 --- a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-3.1.ppc64-latest.xml @@ -8,6 +8,9 @@ <type arch='ppc64' machine='pseries-3.1'>hvm</type> <boot dev='hd'/> </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>POWER8</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml index 9582223550..311a7ad9da 100644 --- a/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml +++ b/tests/qemuxml2xmloutdata/ppc64-default-cpu-tcg-pseries-4.2.ppc64-latest.xml @@ -8,6 +8,9 @@ <type arch='ppc64' machine='pseries-4.2'>hvm</type> <boot dev='hd'/> </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>POWER9</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml b/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml index 55149d4a78..8ccd460d01 100644 --- a/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml +++ b/tests/qemuxml2xmloutdata/s390-default-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml @@ -8,6 +8,9 @@ <type arch='s390x' machine='s390-ccw-virtio-4.2'>hvm</type> <boot dev='hd'/> </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-enc.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-enc.x86_64-latest.xml index dcd504310f..8a842e4d22 100644 --- a/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-enc.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2-enc.x86_64-latest.xml @@ -12,6 +12,9 @@ <features> <acpi/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/tpm-emulator-tpm2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2.x86_64-latest.xml index 625aaa5f60..9143a1dde1 100644 --- a/tests/qemuxml2xmloutdata/tpm-emulator-tpm2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/tpm-emulator-tpm2.x86_64-latest.xml @@ -12,6 +12,9 @@ <features> <acpi/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/tpm-emulator.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-emulator.x86_64-latest.xml index 002af76c21..ff4006b2e3 100644 --- a/tests/qemuxml2xmloutdata/tpm-emulator.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/tpm-emulator.x86_64-latest.xml @@ -12,6 +12,9 @@ <features> <acpi/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/tpm-passthrough-crb.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-passthrough-crb.x86_64-latest.xml index ef68c2d0d7..b8be67acfd 100644 --- a/tests/qemuxml2xmloutdata/tpm-passthrough-crb.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/tpm-passthrough-crb.x86_64-latest.xml @@ -12,6 +12,9 @@ <features> <acpi/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml index 2a99f35cf8..669992bcf6 100644 --- a/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/tpm-passthrough.x86_64-latest.xml @@ -12,6 +12,9 @@ <features> <acpi/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml index 1f24dee8e7..c7b0f11cf8 100644 --- a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-pc-4.2.x86_64-latest.xml @@ -12,6 +12,9 @@ <acpi/> <apic/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml index 39a7013b67..be211acd29 100644 --- a/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-kvm-q35-4.2.x86_64-latest.xml @@ -12,6 +12,9 @@ <acpi/> <apic/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml index b45ad4c051..159270b83a 100644 --- a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-pc-4.2.x86_64-latest.xml @@ -12,6 +12,9 @@ <acpi/> <apic/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> diff --git a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml index c6a85977e9..b95e146c81 100644 --- a/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/x86_64-default-cpu-tcg-q35-4.2.x86_64-latest.xml @@ -12,6 +12,9 @@ <acpi/> <apic/> </features> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> -- 2.23.0

On Tue, Oct 15, 2019 at 05:35:07PM +0200, Jiri Denemark wrote:
When starting a domain without a CPU model specified in the domain XML, QEMU will choose a default one. Which is fine unless the domain gets migrated to another host because libvirt doesn't perform any CPU ABI checks and the virtual CPU provided by QEMU on the destination host can differ from the one on the source host.
With QEMU 4.2.0 we can probe for the default CPU model used by QEMU for a particular machine type and store it in the domain XML. This way the chosen CPU model is more visible to users and libvirt will make sure the guest will see the exact same CPU after migration.
Architecture specific notes - aarch64: We only set the default CPU for TCG domains as KVM requires -cpu host to work.
- ppc64: (to be checked with QEMU developers) Default CPU data reported by QEMU is unusable for KVM. QEMU would effectively use -cpu host by default and it even rewrites typename of the current host CPU model to host-powerpc64-cpu. The default CPU type reported by query-machines is still power*-powerpc64-cpu, which may not even exist due to the changed typename. For example, on a Power8 host, power8 CPU model is of host-powerpc64-cpu type (according to query-cpu-definitions), while the default CPU type name for pseries-3.1 machine type is reported as power8_v2.0-powerpc64-cpu. What's even worse, pseries-4.2 says the default CPU type is power9_v2.0-powerpc64-cpu, which cannot be started on older host at all. So again, we only set the default CPU for TCG domains.
- s390x: (to be checked with QEMU developers) The default CPU is said to be "qemu", which works fine for TCG domains, but it doesn't work on KVM because QEMU complains that some features requested in the CPU model are not available.
- x86_64: The default CPU model (qemu64) is not runnable on any host with KVM, but in contrast to s390x QEMU just disables unavailable features and starts happily.
https://bugzilla.redhat.com/show_bug.cgi?id=1598151 https://bugzilla.redhat.com/show_bug.cgi?id=1598162 ---
Notes: This patch should not be merged yet as we need to confirm what to do on s390x and ppc64 architectures.
Version 2: - new test cases
src/qemu/qemu_domain.c | 56 +++++++++++++++++++ ...fault-cpu-tcg-virt-4.2.aarch64-latest.args | 1 + .../disk-cache.x86_64-latest.args | 1 + .../disk-cdrom-network.x86_64-latest.args | 1 + .../disk-cdrom-tray.x86_64-latest.args | 1 + .../disk-copy_on_read.x86_64-latest.args | 1 + .../disk-detect-zeroes.x86_64-latest.args | 1 + .../disk-floppy-q35-2_11.x86_64-latest.args | 1 + .../disk-floppy-q35-2_9.x86_64-latest.args | 1 + .../os-firmware-bios.x86_64-latest.args | 1 + ...os-firmware-efi-secboot.x86_64-latest.args | 1 + .../os-firmware-efi.x86_64-latest.args | 1 + ...ault-cpu-tcg-pseries-2.7.ppc64-latest.args | 1 + ...ault-cpu-tcg-pseries-3.1.ppc64-latest.args | 1 + ...ault-cpu-tcg-pseries-4.2.ppc64-latest.args | 1 + ...t-cpu-tcg-ccw-virtio-4.2.s390x-latest.args | 1 + .../tpm-emulator-tpm2-enc.x86_64-latest.args | 1 + .../tpm-emulator-tpm2.x86_64-latest.args | 1 + .../tpm-emulator.x86_64-latest.args | 1 + .../tseg-explicit-size.x86_64-latest.args | 1 + .../vhost-vsock-auto.x86_64-latest.args | 1 + .../vhost-vsock.x86_64-latest.args | 1 + ...-default-cpu-kvm-pc-4.2.x86_64-latest.args | 1 + ...default-cpu-kvm-q35-4.2.x86_64-latest.args | 1 + ...-default-cpu-tcg-pc-4.2.x86_64-latest.args | 1 + ...default-cpu-tcg-q35-4.2.x86_64-latest.args | 1 + ...efault-cpu-tcg-virt-4.2.aarch64-latest.xml | 3 + .../os-firmware-bios.x86_64-latest.xml | 3 + .../os-firmware-efi-secboot.x86_64-latest.xml | 3 + .../os-firmware-efi.x86_64-latest.xml | 3 + ...fault-cpu-tcg-pseries-2.7.ppc64-latest.xml | 3 + ...fault-cpu-tcg-pseries-3.1.ppc64-latest.xml | 3 + ...fault-cpu-tcg-pseries-4.2.ppc64-latest.xml | 3 + ...lt-cpu-tcg-ccw-virtio-4.2.s390x-latest.xml | 3 + .../tpm-emulator-tpm2-enc.x86_64-latest.xml | 3 + .../tpm-emulator-tpm2.x86_64-latest.xml | 3 + .../tpm-emulator.x86_64-latest.xml | 3 + .../tpm-passthrough-crb.x86_64-latest.xml | 3 + .../tpm-passthrough.x86_64-latest.xml | 3 + ...4-default-cpu-kvm-pc-4.2.x86_64-latest.xml | 3 + ...-default-cpu-kvm-q35-4.2.x86_64-latest.xml | 3 + ...4-default-cpu-tcg-pc-4.2.x86_64-latest.xml | 3 + ...-default-cpu-tcg-q35-4.2.x86_64-latest.xml | 3 + 43 files changed, 132 insertions(+)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9dcba4ef38..438f003186 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4470,6 +4470,59 @@ qemuDomainDefVcpusPostParse(virDomainDefPtr def) }
+static int +qemuDomainDefSetDefaultCPU(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps) +{ + VIR_AUTOPTR(virCPUDef) newCPU = NULL;
g_autoptr
+ virCPUDefPtr cpu = def->cpu; + const char *model; + + if (cpu && + (cpu->mode != VIR_CPU_MODE_CUSTOM || + cpu->model)) + return 0; + + /* Default CPU model info from QEMU is usable for TCG only on non-Intel + * architectures. */ + if (!ARCH_IS_X86(def->os.arch) && def->virtType != VIR_DOMAIN_VIRT_QEMU) + return 0; + + model = virQEMUCapsGetMachineDefaultCPU(qemuCaps, def->os.machine, def->virtType); + if (!model) { + VIR_DEBUG("Unknown default CPU model for domain '%s'", def->name); + return 0; + } + + VIR_DEBUG("Setting default CPU model for domain '%s' to %s", + def->name, model); + + if (!cpu) { + if (VIR_ALLOC(newCPU) < 0) + return -1; + cpu = newCPU;
cpu = g_new0(virCPUDef, 1);
+ } + + /* We need to turn off all CPU checks when the domain is started because + * the default CPU (e.g., qemu64) may not be runnable on any host. QEMU + * will just disable the unavailable features and we will update the CPU + * definition accordingly and set check to FULL when starting the domain. */ + cpu->type = VIR_CPU_TYPE_GUEST; + cpu->mode = VIR_CPU_MODE_CUSTOM; + cpu->match = VIR_CPU_MATCH_EXACT; + cpu->check = VIR_CPU_CHECK_NONE; + cpu->fallback = VIR_CPU_FALLBACK_FORBID; + + if (VIR_STRDUP(cpu->model, model) < 0) + return -1;
g_strdup
+ + if (newCPU) + VIR_STEAL_PTR(def->cpu, newCPU);
g_strdup_pointer, or just don't steal it and use def->cpu directly
+ + return 0; +} + + static int qemuDomainDefCPUPostParse(virDomainDefPtr def) {
Jano
participants (2)
-
Jiri Denemark
-
Ján Tomko