mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-18 10:35:20 +00:00
qemu: Add support for max physical address size
This patch maps /domain/cpu/maxphysaddr into -cpu parameters: - <maxphysaddr mode='passthrough'/> becomes host-phys-bits=on - <maxphysaddr mode='emualte' bits='42'/> becomes phys-bits=42 Passthrough mode can only be used if the chosen CPU model is 'host-passthrough'. Also validate that an explicitly specified bits value does not exceed the physical address bits on the host. The feature is available since QEMU 2.7.0. Signed-off-by: Dario Faggioli <dfaggioli@suse.com> Signed-off-by: Jim Fehlig <jfehlig@suse.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
c647bf29af
commit
1c1a7cdd40
@ -6838,6 +6838,23 @@ qemuBuildCpuCommandLine(virCommand *cmd,
|
|||||||
virBufferAddLit(&buf, ",l3-cache=off");
|
virBufferAddLit(&buf, ",l3-cache=off");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (def->cpu && def->cpu->addr) {
|
||||||
|
virCPUMaxPhysAddrDef *addr = def->cpu->addr;
|
||||||
|
|
||||||
|
switch (addr->mode) {
|
||||||
|
case VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH:
|
||||||
|
virBufferAddLit(&buf, ",host-phys-bits=on");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE:
|
||||||
|
virBufferAsprintf(&buf, ",phys-bits=%d", addr->bits);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cpu = virBufferContentAndReset(&cpu_buf);
|
cpu = virBufferContentAndReset(&cpu_buf);
|
||||||
cpu_flags = virBufferContentAndReset(&buf);
|
cpu_flags = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
|
@ -366,6 +366,14 @@ qemuValidateDomainDefCpu(virQEMUDriver *driver,
|
|||||||
virCPUMaxPhysAddrModeTypeToString(VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE));
|
virCPUMaxPhysAddrModeTypeToString(VIR_CPU_MAX_PHYS_ADDR_MODE_EMULATE));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (driver->hostcpu &&
|
||||||
|
driver->hostcpu->addr &&
|
||||||
|
cpu->addr->bits > driver->hostcpu->addr->bits) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("The number of virtual CPU address bits cannot exceed the number supported by the host CPU"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:
|
case VIR_CPU_MAX_PHYS_ADDR_MODE_LAST:
|
||||||
|
32
tests/qemuxml2argvdata/cpu-phys-bits-emulate.args
Normal file
32
tests/qemuxml2argvdata/cpu-phys-bits-emulate.args
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/tmp/lib/domain--1-foo \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
|
||||||
|
XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
|
||||||
|
XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu-system-x86_64 \
|
||||||
|
-name guest=foo,debug-threads=on \
|
||||||
|
-S \
|
||||||
|
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
|
||||||
|
-machine pc,usb=off,dump-guest-core=off \
|
||||||
|
-accel kvm \
|
||||||
|
-cpu host,phys-bits=42 \
|
||||||
|
-m 214 \
|
||||||
|
-overcommit mem-lock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
-nodefaults \
|
||||||
|
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
|
||||||
|
-mon chardev=charmonitor,id=monitor,mode=control \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
|
||||||
|
-msg timestamp=on
|
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
<maxphysaddr mode='emulate' bits='42'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
32
tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args
Normal file
32
tests/qemuxml2argvdata/cpu-phys-bits-emulate2.args
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/tmp/lib/domain--1-foo \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
|
||||||
|
XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
|
||||||
|
XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu-system-x86_64 \
|
||||||
|
-name guest=foo,debug-threads=on \
|
||||||
|
-S \
|
||||||
|
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
|
||||||
|
-machine pc,usb=off,dump-guest-core=off \
|
||||||
|
-accel kvm \
|
||||||
|
-cpu core2duo,ds=on,acpi=on,ss=on,ht=on,tm=on,pbe=on,ds-cpl=on,vmx=on,est=on,tm2=on,cx16=on,xtpr=on,lahf-lm=on,phys-bits=42 \
|
||||||
|
-m 214 \
|
||||||
|
-overcommit mem-lock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
-nodefaults \
|
||||||
|
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
|
||||||
|
-mon chardev=charmonitor,id=monitor,mode=control \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
|
||||||
|
-msg timestamp=on
|
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate2.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-model'>
|
||||||
|
<maxphysaddr bits='42' mode='emulate'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
1
tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err
Normal file
1
tests/qemuxml2argvdata/cpu-phys-bits-emulate3.err
Normal file
@ -0,0 +1 @@
|
|||||||
|
unsupported configuration: if using CPU maximum physical address mode='emulate', bits= must be specified too
|
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-emulate3.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
<maxphysaddr mode='emulate'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
32
tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args
Normal file
32
tests/qemuxml2argvdata/cpu-phys-bits-passthrough.args
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/tmp/lib/domain--1-foo \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
XDG_DATA_HOME=/tmp/lib/domain--1-foo/.local/share \
|
||||||
|
XDG_CACHE_HOME=/tmp/lib/domain--1-foo/.cache \
|
||||||
|
XDG_CONFIG_HOME=/tmp/lib/domain--1-foo/.config \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu-system-x86_64 \
|
||||||
|
-name guest=foo,debug-threads=on \
|
||||||
|
-S \
|
||||||
|
-object secret,id=masterKey0,format=raw,file=/tmp/lib/domain--1-foo/master-key.aes \
|
||||||
|
-machine pc,usb=off,dump-guest-core=off \
|
||||||
|
-accel kvm \
|
||||||
|
-cpu host,host-phys-bits=on \
|
||||||
|
-m 214 \
|
||||||
|
-overcommit mem-lock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
-nodefaults \
|
||||||
|
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
|
||||||
|
-mon chardev=charmonitor,id=monitor,mode=control \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-no-acpi \
|
||||||
|
-boot strict=on \
|
||||||
|
-usb \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
|
||||||
|
-msg timestamp=on
|
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
<maxphysaddr mode='passthrough'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
1
tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err
Normal file
1
tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.err
Normal file
@ -0,0 +1 @@
|
|||||||
|
unsupported configuration: CPU maximum physical address bits mode 'passthrough' can only be used with 'host-passthrough' CPUs
|
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough2.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-model'>
|
||||||
|
<maxphysaddr mode='passthrough'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
1
tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err
Normal file
1
tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.err
Normal file
@ -0,0 +1 @@
|
|||||||
|
unsupported configuration: CPU maximum physical address bits number specification cannot be used with mode='passthrough'
|
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-passthrough3.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<name>foo</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
<maxphysaddr mode='passthrough' bits='42'/>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -3476,6 +3476,13 @@ mymain(void)
|
|||||||
/* HVF guests should not work on Linux with KVM */
|
/* HVF guests should not work on Linux with KVM */
|
||||||
DO_TEST_CAPS_LATEST_PARSE_ERROR("hvf-x86_64-q35-headless");
|
DO_TEST_CAPS_LATEST_PARSE_ERROR("hvf-x86_64-q35-headless");
|
||||||
|
|
||||||
|
DO_TEST("cpu-phys-bits-passthrough", QEMU_CAPS_KVM);
|
||||||
|
DO_TEST("cpu-phys-bits-emulate", QEMU_CAPS_KVM);
|
||||||
|
DO_TEST("cpu-phys-bits-emulate2", QEMU_CAPS_KVM);
|
||||||
|
DO_TEST_PARSE_ERROR("cpu-phys-bits-emulate3", QEMU_CAPS_KVM);
|
||||||
|
DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough2", QEMU_CAPS_KVM);
|
||||||
|
DO_TEST_PARSE_ERROR("cpu-phys-bits-passthrough3", QEMU_CAPS_KVM);
|
||||||
|
|
||||||
if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
|
if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
|
||||||
virFileDeleteTree(fakerootdir);
|
virFileDeleteTree(fakerootdir);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user