]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: introduce option to enable/disable pci hotplug on pci-root controller
authorAni Sinha <ani@anisinha.ca>
Fri, 1 Oct 2021 09:29:46 +0000 (14:59 +0530)
committerLaine Stump <laine@redhat.com>
Fri, 1 Oct 2021 18:19:44 +0000 (14:19 -0400)
This change introduces libvirt xml support to enable/disable hotplug on the
pci-root controller. It adds a 'target' subelement for the pci-root controller
with a 'hotplug' property. This property can be used to enable or disable
hotplug for the pci-root controller. For example, in order to disable hotplug
on the pci-root controller, one has to use set '<target hotplug='off'>' as
shown below:

<controller type='pci' model='pci-root'>
  <target hotplug='off'/>
</controller>

'<target hotplug='on'>' option would enable hotplug for pci-root controller.
This is also the default value. This option is only available for pc machine
types and is applicable for qemu/kvm accelerator only.This feature was
introduced from qemu version 5.2 with the following change in qemu repository:

3d7e78aa7777f ("Introduce a new flag for i440fx to disable PCI hotplug on the root bus")

The above qemu commit describes some reasons why users might to disable hotplug
on PCI root buses.

Related unit tests to exercise the new conf option has also been added.

Signed-off-by: Ani Sinha <ani@anisinha.ca>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
docs/formatdomain.rst
src/qemu/qemu_validate.c
tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-disable.xml [new file with mode: 0644]
tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-enable.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-disable.xml [new symlink]
tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-enable.xml [new symlink]
tests/qemuxml2xmltest.c

index 526727f98ede618f9e32627f7cf366f1049055c5..a02802a954f9e33cf4de461ee7058f7d50303672 100644 (file)
@@ -3776,11 +3776,15 @@ generated by libvirt. :since:`Since 1.2.19 (QEMU only).`
    controller's "port" configuration value, which is visible to the virtual
    machine. If set, port must be between 0 and 255.
 ``hotplug``
-   pcie-root-port and pcie-switch-downstream-port controllers can also have a
-   ``hotplug`` attribute in the ``<target>`` subelement, which is used to
-   disable hotplug/unplug of devices on a particular controller. The default
-   setting of ``hotplug`` is ``on``; it should be set to ``off`` to disable
-   hotplug/unplug of devices on a particular controller. :since:`Since 6.3.0`
+   pci-root (:since:`Since 7.9.0`), pcie-root-port (:since:`Since 6.3.0`) and
+   pcie-switch-downstream-port controllers (:since:`Since 6.3.0`) can
+   also have a ``hotplug`` attribute in the ``<target>`` subelement, which is
+   used to disable hotplug/unplug of devices on a particular controller. For
+   the pci-root controller, the setting affects the ACPI based hotplug. For the
+   rest, the setting affects both ACPI based hotplug as well as PCIE native
+   hotplug. The default setting of ``hotplug`` is ``on``; it should be set to
+   ``off`` to disable hotplug/unplug of devices on a particular controller.
+
 ``busNr``
    pci-expander-bus and pcie-expander-bus controllers can have an optional
    ``busNr`` attribute (1-254). This will be the bus number of the new bus; All
index 001f68b0831d67e9c2c32cc4cb07d11955d71844..717b97bf3a4ac2ec15c2d1e562c18b1f41efd21b 100644 (file)
@@ -3872,6 +3872,14 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont,
     /* hotplug */
     if (pciopts->hotplug != VIR_TRISTATE_SWITCH_ABSENT) {
         switch ((virDomainControllerModelPCI) cont->model) {
+        case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
+            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX_ACPI_ROOT_PCI_HOTPLUG)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("setting the %s property on a '%s' device is not supported by this QEMU binary"),
+                               "hotplug", "pci-root");
+                return -1;
+            }
+            break;
         case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT_PORT:
         case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT:
             if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIE_ROOT_PORT_HOTPLUG)) {
@@ -3882,7 +3890,6 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont,
             }
             break;
 
-        case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
         case VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE:
         case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE:
         case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT:
diff --git a/tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-disable.xml b/tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-disable.xml
new file mode 100644 (file)
index 0000000..93f2779
--- /dev/null
@@ -0,0 +1,30 @@
+<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>
+  <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='pci' index='0' model='pci-root'>
+      <target hotplug='off'/>
+    </controller>
+    <controller type='usb' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </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='0x00' slot='0x02' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-enable.xml b/tests/qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-enable.xml
new file mode 100644 (file)
index 0000000..7c92419
--- /dev/null
@@ -0,0 +1,30 @@
+<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>
+  <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='pci' index='0' model='pci-root'>
+      <target hotplug='on'/>
+    </controller>
+    <controller type='usb' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </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='0x00' slot='0x02' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-disable.xml b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-disable.xml
new file mode 120000 (symlink)
index 0000000..0570e40
--- /dev/null
@@ -0,0 +1 @@
+../qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-disable.xml
\ No newline at end of file
diff --git a/tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-enable.xml b/tests/qemuxml2xmloutdata/pc-i440fx-acpi-root-hotplug-enable.xml
new file mode 120000 (symlink)
index 0000000..2b0e429
--- /dev/null
@@ -0,0 +1 @@
+../qemuxml2argvdata/pc-i440fx-acpi-root-hotplug-enable.xml
\ No newline at end of file
index 84d6bed6b1ee2beb511f60df48f3363148def012..fdbaede9a54aaaeadf9e1f45a92e2a4252479f2a 100644 (file)
@@ -424,6 +424,10 @@ mymain(void)
     DO_TEST_NOCAPS("input-usbtablet");
     DO_TEST_NOCAPS("misc-acpi");
     DO_TEST("misc-disable-s3", QEMU_CAPS_PIIX_DISABLE_S3);
+    DO_TEST("pc-i440fx-acpi-root-hotplug-disable",
+            QEMU_CAPS_PIIX_ACPI_ROOT_PCI_HOTPLUG);
+    DO_TEST("pc-i440fx-acpi-root-hotplug-enable",
+            QEMU_CAPS_PIIX_ACPI_ROOT_PCI_HOTPLUG);
     DO_TEST("misc-disable-suspends",
             QEMU_CAPS_PIIX_DISABLE_S3,
             QEMU_CAPS_PIIX_DISABLE_S4);