There are PCI devices with pretty large non-prefetchable memory, for instance: Memory at 9d800000 (64-bit, non-prefetchable) [size=8M] Memory at a6800000 (64-bit, non-prefetchable) [size=16K] For cold plugged devices this is not a problem, because firmware sets PCI controllers in a way that make devices behind them just work. Problem arises if such PCI device is to be hot plugged. Since the PCI device wasn't present at cold boot, firmware could not take it into calculations and the amount of reserved memory is not sufficient. Introduce a know that allows users overriding value computed by FW and thus allow hot plug of such PCI devices. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- docs/formatdomain.rst | 6 ++++++ src/conf/domain_conf.c | 9 +++++++++ src/conf/domain_conf.h | 3 +++ src/conf/schemas/domaincommon.rng | 5 +++++ tests/qemuxml2argvdata/q35-usb2.xml | 2 +- tests/qemuxml2xmloutdata/q35-usb2.x86_64-latest.xml | 2 +- 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 310d2bc427..0a19f97618 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -4103,6 +4103,12 @@ generated by libvirt. :since:`Since 1.2.19 (QEMU only).` ``index`` pci-root controllers for pSeries guests use this attribute to record the order they will show up in the guest. :since:`Since 3.6.0` +``memReserve`` + Some PCI devices have non-prefetchable memory bar larger than 2MiB. Use this + attribute to override value computed by firmware and thus make controller + reserve more memory (in KiB) so that such PCI device can be hot plugged. + For cold plugged PCI devices firmware recognizes this and computes correct + value. :since:`Since 10.0.0` For machine types which provide an implicit PCI bus, the pci-root controller with index=0 is auto-added and required to use PCI devices. pci-root has no diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 22ad43e1d7..3b0ce6bdc4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8456,6 +8456,11 @@ virDomainControllerDefParseXML(virDomainXMLOption *xmlopt, &def->opts.pciopts.targetIndex, def->opts.pciopts.targetIndex) < 0) return NULL; + + if (virXMLPropULongLong(targetNodes[0], "memReserve", 0, + VIR_XML_PROP_NONZERO, + &def->opts.pciopts.memReserve) < 0) + return NULL; } } @@ -23001,6 +23006,10 @@ virDomainControllerDefFormatPCI(virBuffer *buf, virBufferAsprintf(&targetAttrBuf, " hotplug='%s'", virTristateSwitchTypeToString(def->opts.pciopts.hotplug)); } + if (def->opts.pciopts.memReserve) { + virBufferAsprintf(&targetAttrBuf, " memReserve='%llu'", + def->opts.pciopts.memReserve); + } if (def->opts.pciopts.numaNode != -1) virBufferAsprintf(&targetChildBuf, "<node>%d</node>\n", def->opts.pciopts.numaNode); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ed07859bc5..32d998243f 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -734,6 +734,9 @@ struct _virDomainPCIControllerOpts { */ int numaNode; virTristateSwitch hotplug; /* 'off' to prevent hotplug/unplug, default 'on' */ + + unsigned long long memReserve; /* used by pci-bridge and pcie-root-port, + 0 == undef, KiB */ }; struct _virDomainUSBControllerOpts { diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index b98a2ae602..d26e4c41f2 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -2874,6 +2874,11 @@ <ref name="unsignedInt"/> </element> </optional> + <optional> + <attribute name="memReserve"> + <ref name="unsignedLong"/> + </attribute> + </optional> </element> </optional> <!-- *-root controllers have an optional element "pcihole64"--> diff --git a/tests/qemuxml2argvdata/q35-usb2.xml b/tests/qemuxml2argvdata/q35-usb2.xml index 571782a17c..4f5a5580ac 100644 --- a/tests/qemuxml2argvdata/q35-usb2.xml +++ b/tests/qemuxml2argvdata/q35-usb2.xml @@ -25,7 +25,7 @@ </controller> <controller type='pci' index='2' model='pci-bridge'> <model name='pci-bridge'/> - <target chassisNr='56'/> + <target chassisNr='56' memReserve='8196'/> </controller> <controller type='usb' index='0' model='ich9-ehci1'/> <controller type='usb' index='0' model='ich9-uhci1'/> diff --git a/tests/qemuxml2xmloutdata/q35-usb2.x86_64-latest.xml b/tests/qemuxml2xmloutdata/q35-usb2.x86_64-latest.xml index b860ae2dee..2bbbbfe346 100644 --- a/tests/qemuxml2xmloutdata/q35-usb2.x86_64-latest.xml +++ b/tests/qemuxml2xmloutdata/q35-usb2.x86_64-latest.xml @@ -30,7 +30,7 @@ </controller> <controller type='pci' index='2' model='pci-bridge'> <model name='pci-bridge'/> - <target chassisNr='56'/> + <target chassisNr='56' memReserve='8196'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </controller> <controller type='usb' index='0' model='ich9-ehci1'> -- 2.41.0 _______________________________________________ Devel mailing list -- devel@xxxxxxxxxxxxxxxxx To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx