mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
conf: cpu: add limit for maxphysaddr
Add a limit attribute to restrict the maximum physical address bits that would be used for the guest CPU: <cpu mode='host-passthrough'> <maxphysaddr mode='passthrough' limit='39'/> </cpu> https://gitlab.com/libvirt/libvirt/-/issues/450 https://bugzilla.redhat.com/show_bug.cgi?id=2171860 Signed-off-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
46410c2be8
commit
d6fbb21210
@ -1374,7 +1374,7 @@ following collection of elements. :since:`Since 0.7.5`
|
||||
|
||||
<cpu mode='host-passthrough' migratable='off'>
|
||||
<cache mode='passthrough'/>
|
||||
<maxphysaddr mode='passthrough'/>
|
||||
<maxphysaddr mode='passthrough' limit='39'/>
|
||||
<feature policy='disable' name='lahf_lm'/>
|
||||
...
|
||||
|
||||
@ -1644,6 +1644,11 @@ In case no restrictions need to be put on CPU model and its features, a simpler
|
||||
The ``bits`` attribute is mandatory if the ``mode`` attribute is set to
|
||||
``emulate`` and specifies the virtual CPU address size in bits.
|
||||
|
||||
``limit``
|
||||
The ``limit`` attribute can be used to restrict the maximum value of
|
||||
address bits for ``passthrough`` mode, i.e. in case the host CPU reports
|
||||
more bits than that, ``limit`` is used. :since:`Since 9.3.0`
|
||||
|
||||
Guest NUMA topology can be specified using the ``numa`` element. :since:`Since
|
||||
0.9.8`
|
||||
|
||||
|
@ -668,6 +668,17 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt,
|
||||
VIR_XML_PROP_NONNEGATIVE,
|
||||
&def->addr->bits, -1) < 0)
|
||||
return -1;
|
||||
|
||||
if ((rv = virXMLPropUInt(maxphysaddrNode, "limit", 10,
|
||||
VIR_XML_PROP_NONZERO,
|
||||
&def->addr->limit)) < 0) {
|
||||
return -1;
|
||||
} else if (rv > 0 && def->addr->mode != VIR_CPU_MAX_PHYS_ADDR_MODE_PASSTHROUGH) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("attribute 'limit' is only supported for maxphysaddr mode 'passthrough'"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*cpu = g_steal_pointer(&def);
|
||||
@ -843,6 +854,8 @@ virCPUDefFormatBuf(virBuffer *buf,
|
||||
virCPUMaxPhysAddrModeTypeToString(def->addr->mode));
|
||||
if (def->addr->bits != -1)
|
||||
virBufferAsprintf(buf, " bits='%d'", def->addr->bits);
|
||||
if (def->addr->limit > 0)
|
||||
virBufferAsprintf(buf, " limit='%d'", def->addr->limit);
|
||||
virBufferAddLit(buf, "/>\n");
|
||||
}
|
||||
|
||||
|
@ -128,6 +128,7 @@ VIR_ENUM_DECL(virCPUMaxPhysAddrMode);
|
||||
typedef struct _virCPUMaxPhysAddrDef virCPUMaxPhysAddrDef;
|
||||
struct _virCPUMaxPhysAddrDef {
|
||||
int bits; /* -1 for unspecified */
|
||||
unsigned int limit; /* 0 for unspecified */
|
||||
virCPUMaxPhysAddrMode mode;
|
||||
};
|
||||
|
||||
|
@ -318,6 +318,11 @@
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="limit">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
|
20
tests/qemuxml2argvdata/cpu-phys-bits-limit.xml
Normal file
20
tests/qemuxml2argvdata/cpu-phys-bits-limit.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' limit='39'/>
|
||||
</cpu>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
</devices>
|
||||
</domain>
|
@ -0,0 +1,31 @@
|
||||
<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' check='none' migratable='on'>
|
||||
<maxphysaddr mode='passthrough' limit='39'/>
|
||||
</cpu>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||
<controller type='usb' index='0' model='piix3-uhci'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||
</controller>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<audio id='1' type='none'/>
|
||||
<memballoon model='virtio'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
||||
</memballoon>
|
||||
</devices>
|
||||
</domain>
|
@ -1247,6 +1247,8 @@ mymain(void)
|
||||
|
||||
DO_TEST_CAPS_LATEST("crypto-builtin");
|
||||
|
||||
DO_TEST_CAPS_LATEST("cpu-phys-bits-limit");
|
||||
|
||||
cleanup:
|
||||
qemuTestDriverFree(&driver);
|
||||
virFileWrapperClearPrefixes();
|
||||
|
Loading…
Reference in New Issue
Block a user