[PATCH v6 2/4] conf: introduce support for acpi-bridge-hotplug feature
Ani Sinha
ani at anisinha.ca
Fri Oct 8 06:47:01 UTC 2021
On Fri, 8 Oct 2021, Laine Stump wrote:
> On 10/5/21 1:51 AM, Ani Sinha wrote:
> > This change introduces a new libvirt sub-element <pci> under <features> that
> > can be used to configure all pci related features.
> > Currently the only sub-sub element supported by this sub-element is
> > 'acpi-bridge-hotplug' as shown below:
> >
> > <features>
> > <pci>
> > <acpi-bridge-hotplug state='on|off'/>
> > </pci>
> > </features>
> >
> > The above option is only available for qemu driver and that too for x86
> > guests
> > only. It is a global option.
> >
> > 'acpi-bridge-hotplug' option enables or disables ACPI hotplug support for
> > cold-plugged pci bridges. Examples of bridges include PCI-PCI bridge
> > (pci-bridge controller) or PCIe-PCI bridges for pc machines and
> > pcie-root-port controller for q35 machines. Being global option, no other
> > bridge specific option are required. For pc machine type in x86, this option
> > is available in qemu for a long time, from version 2.1.
> > Please see the following changes in qemu repo:
> >
> > 9e047b982452c6 ("piix4: add acpi pci hotplug support")
> > 133a2da488062e ("pc: acpi: generate AML only for PCI0 devices if PCI bridge
> > hotplug is disabled")
> >
> > For q35 machine type, this was introduced in qemu 6.1 with the following
> > changes in qemu repo:
> >
> > (a) c0e427d6eb5fef ("hw/acpi/ich9: Enable ACPI PCI hot-plug")
> > (b) 17858a16950860 ("hw/acpi/ich9: Set ACPI PCI hot-plug as default on Q35")
> >
> > The reasons for enabling ACPI based hotplug for PCIe (q35) based machines
> > (as
> > opposed to native hotplug) are outlined in (b). There are use cases where
> > users
> > would still want to use native hotplug. Therefore, this config option
> > enables users to choose either ACPI based hotplug or native hotplug for
> > bridges
> > (for example for pcie root port controller in q35 machines).
> >
> > Qemu capability validation checks have also been added along with related
> > unit
> > tests to exercise the new conf option.
> >
> > Signed-off-by: Ani Sinha <ani at anisinha.ca>
> > ---
> > docs/formatdomain.rst | 11 +++
> > docs/schemas/domaincommon.rng | 15 ++++
> > src/conf/domain_conf.c | 89 ++++++++++++++++++-
> > src/conf/domain_conf.h | 9 ++
> > src/qemu/qemu_validate.c | 46 ++++++++++
> > .../aarch64-acpi-hotplug-bridge-disable.xml | 33 +++++++
> > .../pc-i440fx-acpi-hotplug-bridge-disable.xml | 33 +++++++
> > .../pc-i440fx-acpi-hotplug-bridge-enable.xml | 33 +++++++
> > .../q35-acpi-hotplug-bridge-disable.xml | 47 ++++++++++
> > .../q35-acpi-hotplug-bridge-enable.xml | 47 ++++++++++
> > .../pc-i440fx-acpi-hotplug-bridge-disable.xml | 1 +
> > .../pc-i440fx-acpi-hotplug-bridge-enable.xml | 1 +
> > .../q35-acpi-hotplug-bridge-disable.xml | 1 +
> > .../q35-acpi-hotplug-bridge-enable.xml | 1 +
> > tests/qemuxml2xmltest.c | 14 +++
> > 15 files changed, 380 insertions(+), 1 deletion(-)
> > create mode 100644
> > tests/qemuxml2argvdata/aarch64-acpi-hotplug-bridge-disable.xml
> > create mode 100644
> > tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > create mode 100644
> > tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > create mode 100644
> > tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
> > create mode 100644
> > tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
> > create mode 120000
> > tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > create mode 120000
> > tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > create mode 120000
> > tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-disable.xml
> > create mode 120000
> > tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-enable.xml
> >
> > diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> > index a02802a954..8d916eefa6 100644
> > --- a/docs/formatdomain.rst
> > +++ b/docs/formatdomain.rst
> > @@ -1847,6 +1847,9 @@ Hypervisors may allow certain CPU / machine features
> > to be toggled on/off.
> > <e820_host state='on'/>
> > <passthrough state='on' mode='share_pt'/>
> > </xen>
> > + <pci>
> > + <acpi-bridge-hotplug state="on"/>
> > + </pci>
> > <pvspinlock state='on'/>
> > <gic version='2'/>
> > <ioapic driver='qemu'/>
> > @@ -1942,6 +1945,14 @@ are:
> > passthrough Enable IOMMU mappings allowing PCI passthrough on, off;
> > mode - optional string sync_pt or share_pt :since:`6.3.0`
> > =========== ==============================================
> > =================================================== ==============
> > +``pci``
> > + Various PCI bus related features of the hypervisor.
> > + ====================
> > ========================================================================================
> > ======= ============================
> > + Feature Description
> > Value Since
> > + ====================
> > ========================================================================================
> > ======= ============================
> > + acpi-bridge-hotplug Enable ACPI based hotplug on the cold-plugged PCI
> > bridges (pc) and pcie-root-ports (q35) on, off :since:`7.8.0 (QEMU 6.1.0)`
>
> Weren't the qemu properties there in a much earlier version of QEMU? (Oh, and
> also it needs to say 7.9.0 instead of 7.8.0)
That was for i440fx. I took the higher version.
>
> Somewhere we need to put the extra info that on 440fx machinetypes ACPI is on
> by default, and disabling it means that only SHPC hotplug is available, while
> on q35 machinetypes, it is off by default until QEMU 6.1.0, and enabling it
> has the side-effect of disabling native PCIe hotplug, while disabling (on qemu
> 6.1.0+) also has the side-effect of enabling native PCIe hotplug.
>
I have added a note in v7.
> > + ====================
> > ========================================================================================
> > ======= ============================
> > +
> > ``pmu``
> > Depending on the ``state`` attribute (values ``on``, ``off``, default
> > ``on``)
> > enable or disable the performance monitoring unit for the guest.
> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> > index ec5bd91740..6f33d1e774 100644
> > --- a/docs/schemas/domaincommon.rng
> > +++ b/docs/schemas/domaincommon.rng
> > @@ -6169,6 +6169,9 @@
> > <optional>
> > <ref name="ioapic"/>
> > </optional>
> > + <optional>
> > + <ref name="pci"/>
> > + </optional>
> > <optional>
> > <ref name="hpt"/>
> > </optional>
> > @@ -6400,6 +6403,18 @@
> > </element>
> > </define>
> > + <define name="pci">
> > + <element name="pci">
> > + <interleave>
> > + <optional>
> > + <element name="acpi-bridge-hotplug">
> > + <ref name="featurestate"/>
> > + </element>
> > + </optional>
> > + </interleave>
> > + </element>
> > + </define>
> > +
> > <define name="ioapic">
> > <element name="ioapic">
> > <attribute name="driver">
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index b8370f6950..229b75fecc 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -172,6 +172,7 @@ VIR_ENUM_IMPL(virDomainFeature,
> > "cfpc",
> > "sbbc",
> > "ibs",
> > + "pci",
> > );
> > VIR_ENUM_IMPL(virDomainCapabilitiesPolicy,
> > @@ -212,6 +213,11 @@ VIR_ENUM_IMPL(virDomainXen,
> > "passthrough",
> > );
> > +VIR_ENUM_IMPL(virDomainPCI,
> > + VIR_DOMAIN_PCI_LAST,
> > + "acpi-bridge-hotplug",
> > +);
> > +
> > VIR_ENUM_IMPL(virDomainXenPassthroughMode,
> > VIR_DOMAIN_XEN_PASSTHROUGH_MODE_LAST,
> > "default",
> > @@ -17536,6 +17542,36 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
> > return 0;
> > }
> > +static int
> > +virDomainFeaturesPCIDefParse(virDomainDef *def,
> > + xmlNodePtr node)
> > +{
> > + def->features[VIR_DOMAIN_FEATURE_PCI] = VIR_TRISTATE_SWITCH_ON;
> > +
> > + node = xmlFirstElementChild(node);
> > + while (node) {
> > + int feature;
> > + virTristateSwitch value;
> > +
> > + feature = virDomainPCITypeFromString((const char *)node->name);
> > + if (feature < 0) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > + _("unsupported PCI feature: %s"),
> > + node->name);
> > + return -1;
> > + }
> > +
> > + if (virXMLPropTristateSwitch(node, "state", VIR_XML_PROP_REQUIRED,
> > + &value) < 0)
> > + return -1;
> > +
> > + def->pci_features[feature] = value;
> > +
> > + node = xmlNextElementSibling(node);
> > + }
> > +
> > + return 0;
> > +}
> > static int
> > virDomainFeaturesXENDefParse(virDomainDef *def,
> > @@ -17835,6 +17871,10 @@ virDomainFeaturesDefParse(virDomainDef *def,
> > break;
> > }
> > + case VIR_DOMAIN_FEATURE_PCI:
> > + if (virDomainFeaturesPCIDefParse(def, nodes[i]) < 0)
> > + return -1;
> > +
> > case VIR_DOMAIN_FEATURE_LAST:
> > break;
> > }
> > @@ -17843,7 +17883,6 @@ virDomainFeaturesDefParse(virDomainDef *def,
> > return 0;
> > }
> > -
> > static int
> > virDomainDefMaybeAddHostdevSCSIcontroller(virDomainDef *def)
> > {
> > @@ -21521,6 +21560,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef
> > *src,
> > case VIR_DOMAIN_FEATURE_HTM:
> > case VIR_DOMAIN_FEATURE_NESTED_HV:
> > case VIR_DOMAIN_FEATURE_CCF_ASSIST:
> > + case VIR_DOMAIN_FEATURE_PCI:
> > if (src->features[i] != dst->features[i]) {
> > virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > _("State of feature '%s' differs: "
> > @@ -21777,6 +21817,29 @@ virDomainDefFeaturesCheckABIStability(virDomainDef
> > *src,
> > }
> > }
> > + /* pci */
> > + if (src->features[VIR_DOMAIN_FEATURE_PCI] == VIR_TRISTATE_SWITCH_ON) {
> > + for (i = 0; i < VIR_DOMAIN_PCI_LAST; i++) {
> > + switch ((virDomainPCI) i) {
> > + case VIR_DOMAIN_PCI_ACPI_BRIDGE_HP:
> > + if (src->pci_features[i] != dst->pci_features[i]) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > + _("State of PCI feature '%s' differs: "
> > + "source: '%s', destination: '%s'"),
> > + virDomainPCITypeToString(i),
> > +
> > virTristateSwitchTypeToString(src->pci_features[i]),
> > +
> > virTristateSwitchTypeToString(dst->pci_features[i]));
> > + return false;
> > + }
> > +
> > + break;
> > +
> > + case VIR_DOMAIN_PCI_LAST:
> > + break;
> > + }
> > + }
> > + }
> > +
> > /* smm */
> > if (src->features[VIR_DOMAIN_FEATURE_SMM] == VIR_TRISTATE_SWITCH_ON) {
> > if (src->tseg_specified != dst->tseg_specified) {
> > @@ -27932,6 +27995,30 @@ virDomainDefFormatFeatures(virBuffer *buf,
> > virDomainIBSTypeToString(def->features[i]));
> > break;
> > + case VIR_DOMAIN_FEATURE_PCI:
> > + if (def->features[i] != VIR_TRISTATE_SWITCH_ON)
> > + break;
> > +
> > + virBufferAddLit(&childBuf, "<pci>\n");
> > + virBufferAdjustIndent(&childBuf, 2);
> > + for (j = 0; j < VIR_DOMAIN_PCI_LAST; j++) {
> > + switch ((virDomainPCI) j) {
> > + case VIR_DOMAIN_PCI_ACPI_BRIDGE_HP:
> > + if (def->pci_features[j])
> > + virBufferAsprintf(&childBuf, "<%s state='%s'/>\n",
> > + virDomainPCITypeToString(j),
> > + virTristateSwitchTypeToString(
> > + def->pci_features[j]));
> > + break;
> > +
> > + case VIR_DOMAIN_PCI_LAST:
> > + break;
> > + }
> > + }
> > + virBufferAdjustIndent(&childBuf, -2);
> > + virBufferAddLit(&childBuf, "</pci>\n");
> > + break;
> > +
> > case VIR_DOMAIN_FEATURE_LAST:
> > break;
> > }
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index e054c1508e..e9902a473d 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -2043,6 +2043,7 @@ typedef enum {
> > VIR_DOMAIN_FEATURE_CFPC,
> > VIR_DOMAIN_FEATURE_SBBC,
> > VIR_DOMAIN_FEATURE_IBS,
> > + VIR_DOMAIN_FEATURE_PCI,
> > VIR_DOMAIN_FEATURE_LAST
> > } virDomainFeature;
> > @@ -2068,6 +2069,12 @@ typedef enum {
> > VIR_DOMAIN_HYPERV_LAST
> > } virDomainHyperv;
> > +typedef enum {
> > + VIR_DOMAIN_PCI_ACPI_BRIDGE_HP = 0,
> > +
> > + VIR_DOMAIN_PCI_LAST
> > +} virDomainPCI;
> > +
> > typedef enum {
> > VIR_DOMAIN_KVM_HIDDEN = 0,
> > VIR_DOMAIN_KVM_DEDICATED,
> > @@ -2800,6 +2807,7 @@ struct _virDomainDef {
> > int features[VIR_DOMAIN_FEATURE_LAST];
> > int caps_features[VIR_DOMAIN_PROCES_CAPS_FEATURE_LAST];
> > int hyperv_features[VIR_DOMAIN_HYPERV_LAST];
> > + int pci_features[VIR_DOMAIN_PCI_LAST];
> > int kvm_features[VIR_DOMAIN_KVM_LAST];
> > int msrs_features[VIR_DOMAIN_MSRS_LAST];
> > int xen_features[VIR_DOMAIN_XEN_LAST];
> > @@ -3923,6 +3931,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode);
> > VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode);
> > VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy);
> > VIR_ENUM_DECL(virDomainHyperv);
> > +VIR_ENUM_DECL(virDomainPCI);
> > VIR_ENUM_DECL(virDomainKVM);
> > VIR_ENUM_DECL(virDomainXen);
> > VIR_ENUM_DECL(virDomainXenPassthroughMode);
> > diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> > index c84508cb64..e0e3ca0b10 100644
> > --- a/src/qemu/qemu_validate.c
> > +++ b/src/qemu/qemu_validate.c
> > @@ -173,6 +173,48 @@ qemuValidateDomainDefPSeriesFeature(const virDomainDef
> > *def,
> > return 0;
> > }
> > +static int
> > +qemuValidateDomainDefPCIFeature(const virDomainDef *def,
> > + virQEMUCaps *qemuCaps,
> > + int feature)
> > +{
> > + size_t i;
> > + bool q35Dom = qemuDomainIsQ35(def);
> > + bool q35cap = q35Dom && virQEMUCapsGet(qemuCaps,
> > +
> > QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
> > +
> > + if (def->features[feature] == VIR_TRISTATE_SWITCH_ABSENT)
> > + return 0;
> > +
> > + for (i = 0; i < VIR_DOMAIN_PCI_LAST; i++) {
> > + if (def->pci_features[i] == VIR_TRISTATE_SWITCH_ABSENT)
> > + continue;
> > +
> > + switch ((virDomainPCI) i) {
> > + case VIR_DOMAIN_PCI_ACPI_BRIDGE_HP:
> > + if (!ARCH_IS_X86(def->os.arch)) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > + _("acpi-bridge-hotplug is not available
> > "
> > + "for architecture '%s'"),
> > + virArchToString(def->os.arch));
> > + return -1;
> > + }
> > + if (!q35cap &&
> > + !virQEMUCapsGet(qemuCaps,
> > + QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE)) {
> > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > + _("acpi-bridge-hotplug is not available
> > "
> > + "with this QEMU binary"));
> > + return -1;
> > + }
> > + break;
> > +
> > + case VIR_DOMAIN_PCI_LAST:
> > + break;
> > + }
> > + }
> > + return 0;
> > +}
> > static int
> > qemuValidateDomainDefFeatures(const virDomainDef *def,
> > @@ -294,6 +336,10 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
> > }
> > break;
> > + case VIR_DOMAIN_FEATURE_PCI:
> > + if (qemuValidateDomainDefPCIFeature(def, qemuCaps, i) < 0)
> > + return -1;
> > + break;
> > case VIR_DOMAIN_FEATURE_SMM:
> > case VIR_DOMAIN_FEATURE_KVM:
> > case VIR_DOMAIN_FEATURE_XEN:
> > diff --git a/tests/qemuxml2argvdata/aarch64-acpi-hotplug-bridge-disable.xml
> > b/tests/qemuxml2argvdata/aarch64-acpi-hotplug-bridge-disable.xml
> > new file mode 100644
> > index 0000000000..0d5f945bd7
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/aarch64-acpi-hotplug-bridge-disable.xml
> > @@ -0,0 +1,33 @@
> > +<domain type='qemu'>
> > + <name>i440fx</name>
> > + <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
> > + <memory unit='KiB'>1048576</memory>
> > + <currentMemory unit='KiB'>1048576</currentMemory>
> > + <vcpu placement='static'>1</vcpu>
> > + <os>
> > + <type arch='aarch64' machine='virt'>hvm</type>
> > + <boot dev='network'/>
> > + </os>
> > + <features>
> > + <pci>
> > + <acpi-bridge-hotplug state='off'/>
> > + </pci>
> > + </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>
> > + <controller type='usb' index='0'>
> > + <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>
> > diff --git
> > a/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > b/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > new file mode 100644
> > index 0000000000..4482825858
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > @@ -0,0 +1,33 @@
> > +<domain type='qemu'>
> > + <name>i440fx</name>
> > + <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
> > + <memory unit='KiB'>1048576</memory>
> > + <currentMemory unit='KiB'>1048576</currentMemory>
> > + <vcpu placement='static'>1</vcpu>
> > + <os>
> > + <type arch='x86_64' machine='pc-i440fx-2.5'>hvm</type>
> > + <boot dev='network'/>
> > + </os>
> > + <features>
> > + <pci>
> > + <acpi-bridge-hotplug state='off'/>
> > + </pci>
> > + </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>
> > + <controller type='usb' index='0'>
> > + <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>
> > diff --git a/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > b/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > new file mode 100644
> > index 0000000000..8215ee0d50
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > @@ -0,0 +1,33 @@
> > +<domain type='qemu'>
> > + <name>i440fx</name>
> > + <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
> > + <memory unit='KiB'>1048576</memory>
> > + <currentMemory unit='KiB'>1048576</currentMemory>
> > + <vcpu placement='static'>1</vcpu>
> > + <os>
> > + <type arch='x86_64' machine='pc-i440fx-2.5'>hvm</type>
> > + <boot dev='network'/>
> > + </os>
> > + <features>
> > + <pci>
> > + <acpi-bridge-hotplug state='on'/>
> > + </pci>
> > + </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>
> > + <controller type='usb' index='0'>
> > + <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>
> > diff --git a/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
> > b/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
> > new file mode 100644
> > index 0000000000..2ef3a7231f
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
> > @@ -0,0 +1,47 @@
> > +<domain type='qemu'>
> > + <name>q35</name>
> > + <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
> > + <memory unit='KiB'>1048576</memory>
> > + <currentMemory unit='KiB'>1048576</currentMemory>
> > + <vcpu placement='static'>1</vcpu>
> > + <os>
> > + <type arch='x86_64' machine='pc-q35-2.5'>hvm</type>
> > + <boot dev='network'/>
> > + </os>
> > + <features>
> > + <pci>
> > + <acpi-bridge-hotplug state='off'/>
> > + </pci>
> > + </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>
> > + <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='dmi-to-pci-bridge'>
> > + <model name='i82801b11-bridge'/>
> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x1e'
> > function='0x0'/>
> > + </controller>
> > + <controller type='pci' index='2' model='pci-bridge'>
> > + <model name='pci-bridge'/>
> > + <target chassisNr='2'/>
> > + <address type='pci' domain='0x0000' bus='0x01' slot='0x00'
> > function='0x0'/>
> > + </controller>
> > + <controller type='pci' index='3' model='pcie-root-port'>
> > + <model name='ioh3420'/>
> > + <target chassis='3' port='0x8'/>
> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> > function='0x0'/>
> > + </controller>
> > + <input type='mouse' bus='ps2'/>
> > + <input type='keyboard' bus='ps2'/>
> > + <audio id='1' type='none'/>
> > + <memballoon model='virtio'>
> > + <address type='pci' domain='0x0000' bus='0x02' slot='0x01'
> > function='0x0'/>
> > + </memballoon>
> > + </devices>
> > +</domain>
> > diff --git a/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
> > b/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
> > new file mode 100644
> > index 0000000000..2e1b31b0f8
> > --- /dev/null
> > +++ b/tests/qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
> > @@ -0,0 +1,47 @@
> > +<domain type='qemu'>
> > + <name>q35</name>
> > + <uuid>56f5055c-1b8d-490c-844a-ad646a1caaaa</uuid>
> > + <memory unit='KiB'>1048576</memory>
> > + <currentMemory unit='KiB'>1048576</currentMemory>
> > + <vcpu placement='static'>1</vcpu>
> > + <os>
> > + <type arch='x86_64' machine='pc-q35-2.5'>hvm</type>
> > + <boot dev='network'/>
> > + </os>
> > + <features>
> > + <pci>
> > + <acpi-bridge-hotplug state='on'/>
> > + </pci>
> > + </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>
> > + <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='dmi-to-pci-bridge'>
> > + <model name='i82801b11-bridge'/>
> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x1e'
> > function='0x0'/>
> > + </controller>
> > + <controller type='pci' index='2' model='pci-bridge'>
> > + <model name='pci-bridge'/>
> > + <target chassisNr='2'/>
> > + <address type='pci' domain='0x0000' bus='0x01' slot='0x00'
> > function='0x0'/>
> > + </controller>
> > + <controller type='pci' index='3' model='pcie-root-port'>
> > + <model name='ioh3420'/>
> > + <target chassis='3' port='0x8'/>
> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> > function='0x0'/>
> > + </controller>
> > + <input type='mouse' bus='ps2'/>
> > + <input type='keyboard' bus='ps2'/>
> > + <audio id='1' type='none'/>
> > + <memballoon model='virtio'>
> > + <address type='pci' domain='0x0000' bus='0x02' slot='0x01'
> > function='0x0'/>
> > + </memballoon>
> > + </devices>
> > +</domain>
> > diff --git
> > a/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > new file mode 120000
> > index 0000000000..8154897401
> > --- /dev/null
> > +++ b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > @@ -0,0 +1 @@
> > +../qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-disable.xml
> > \ No newline at end of file
> > diff --git
> > a/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > new file mode 120000
> > index 0000000000..6b9e5492f8
> > --- /dev/null
> > +++ b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > @@ -0,0 +1 @@
> > +../qemuxml2argvdata/pc-i440fx-acpi-hotplug-bridge-enable.xml
> > \ No newline at end of file
> > diff --git a/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-disable.xml
> > b/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-disable.xml
> > new file mode 120000
> > index 0000000000..77719b1325
> > --- /dev/null
> > +++ b/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-disable.xml
> > @@ -0,0 +1 @@
> > +../qemuxml2argvdata/q35-acpi-hotplug-bridge-disable.xml
> > \ No newline at end of file
> > diff --git a/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-enable.xml
> > b/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-enable.xml
> > new file mode 120000
> > index 0000000000..3cd8ee569e
> > --- /dev/null
> > +++ b/tests/qemuxml2xmloutdata/q35-acpi-hotplug-bridge-enable.xml
> > @@ -0,0 +1 @@
> > +../qemuxml2argvdata/q35-acpi-hotplug-bridge-enable.xml
> > \ No newline at end of file
> > diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
> > index 69363ef85c..2e622c002f 100644
> > --- a/tests/qemuxml2xmltest.c
> > +++ b/tests/qemuxml2xmltest.c
> > @@ -428,6 +428,20 @@ mymain(void)
> > QEMU_CAPS_PIIX4_ACPI_ROOT_PCI_HOTPLUG);
> > DO_TEST("pc-i440fx-acpi-root-hotplug-enable",
> > QEMU_CAPS_PIIX4_ACPI_ROOT_PCI_HOTPLUG);
> > + DO_TEST("pc-i440fx-acpi-hotplug-bridge-disable",
> > + QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE);
> > + DO_TEST("pc-i440fx-acpi-hotplug-bridge-enable",
> > + QEMU_CAPS_PIIX4_ACPI_HOTPLUG_BRIDGE);
> > + DO_TEST("q35-acpi-hotplug-bridge-disable",
> > + QEMU_CAPS_DEVICE_PCI_BRIDGE,
> > + QEMU_CAPS_DEVICE_IOH3420,
> > + QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
> > + QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
> > + DO_TEST("q35-acpi-hotplug-bridge-enable",
> > + QEMU_CAPS_DEVICE_PCI_BRIDGE,
> > + QEMU_CAPS_DEVICE_IOH3420,
> > + QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
> > + QEMU_CAPS_ICH9_ACPI_HOTPLUG_BRIDGE);
> > DO_TEST("misc-disable-suspends",
> > QEMU_CAPS_PIIX_DISABLE_S3,
> > QEMU_CAPS_PIIX_DISABLE_S4);
> >
>
>
More information about the libvir-list
mailing list