]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: new attribute "hotplug" for pci controllers
authorLaine Stump <laine@redhat.com>
Tue, 3 Mar 2020 17:23:52 +0000 (12:23 -0500)
committerLaine Stump <laine@redhat.com>
Mon, 13 Apr 2020 02:32:30 +0000 (22:32 -0400)
a <controller type='pci'...> element can now have a "hotplug"
attribute in the <target> subelement. This is intended to control
whether or not the slot(s) of the controller support
hotplugging/unplugging a device:

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

The default value of hotplug is "on".

Since support for configuring such an option is hypervisor-dependent
(and will vary among different types of PCI controllers even on a
single hypervisor), no validation is done in this patch - that
validation will be done in the patch that wires support for the
setting into the hypervisor.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml [new file with mode: 0644]
tests/qemuxml2xmltest.c

index 35ef2405a5daaca346c4bf3841d2eae33d14030a..6f439768151b19b3d70c6542af86c3cd4dc4c8fd 100644 (file)
         which is visible to the virtual machine. If set, port must be
         between 0 and 255.
       </dd>
+      <dt><code>hotplug</code></dt>
+      <dd>
+        pcie-root-port and pcie-switch-downstream-port controllers can
+        also have a <code>hotplug</code> attribute in
+        the <code>&lt;target&gt;</code> subelement, which is used to
+        disable hotplug/unplug of devices on a particular
+        controller. The default setting of <code>hotplug</code>
+        is <code>on</code>; it should be set to <code>off</code> to
+        disable hotplug/unplug of devices on a particular controller.
+        <span class="since">Since 6.3.0</span>
+      </dd>
       <dt><code>busNr</code></dt>
       <dd>
         pci-expander-bus and pcie-expander-bus controllers can have an
index f7eeb0200f063a2f752f2c09f06e4ec5af057912..65d6580434f09279ee4edea1ff97453ced6bba80 100644 (file)
                     <ref name='uint8'/>
                   </attribute>
                 </optional>
+                <optional>
+                  <attribute name='hotplug'>
+                    <ref name="virOnOff"/>
+                  </attribute>
+                </optional>
                 <optional>
                   <element name='node'>
                     <ref name='unsignedInt'/>
index 639d47142456ac78bd6d4dfa78227523ae32cf1a..8e8146374c150297e8ec01d86b959c0373497b9d 100644 (file)
@@ -11055,6 +11055,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
     g_autofree char *port = NULL;
     g_autofree char *busNr = NULL;
     g_autofree char *targetIndex = NULL;
+    g_autofree char *hotplug = NULL;
     g_autofree char *ioeventfd = NULL;
     g_autofree char *portsStr = NULL;
     g_autofree char *iothread = NULL;
@@ -11126,6 +11127,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
                 chassis = virXMLPropString(cur, "chassis");
                 port = virXMLPropString(cur, "port");
                 busNr = virXMLPropString(cur, "busNr");
+                hotplug = virXMLPropString(cur, "hotplug");
                 targetIndex = virXMLPropString(cur, "index");
                 processedTarget = true;
             }
@@ -11362,6 +11364,17 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
             }
             def->opts.pciopts.numaNode = numaNode;
         }
+        if (hotplug) {
+            int val = virTristateSwitchTypeFromString(hotplug);
+
+            if (val <= 0) {
+                virReportError(VIR_ERR_XML_ERROR,
+                               _("PCI controller unrecognized hotplug setting '%s'"),
+                               hotplug);
+                goto error;
+            }
+            def->opts.pciopts.hotplug = val;
+        }
         break;
     case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: {
         g_autofree char *gntframes = virXMLPropString(node, "maxGrantFrames");
@@ -25375,7 +25388,8 @@ virDomainControllerDefFormat(virBufferPtr buf,
             def->opts.pciopts.port != -1 ||
             def->opts.pciopts.busNr != -1 ||
             def->opts.pciopts.targetIndex != -1 ||
-            def->opts.pciopts.numaNode != -1) {
+            def->opts.pciopts.numaNode != -1 ||
+            def->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_ABSENT) {
             virBufferAddLit(&childBuf, "<target");
             if (def->opts.pciopts.chassisNr != -1)
                 virBufferAsprintf(&childBuf, " chassisNr='%d'",
@@ -25392,6 +25406,10 @@ virDomainControllerDefFormat(virBufferPtr buf,
             if (def->opts.pciopts.targetIndex != -1)
                 virBufferAsprintf(&childBuf, " index='%d'",
                                   def->opts.pciopts.targetIndex);
+            if (def->opts.pciopts.hotplug != VIR_TRISTATE_SWITCH_ABSENT) {
+                virBufferAsprintf(&childBuf, " hotplug='%s'",
+                                  virTristateSwitchTypeToString(def->opts.pciopts.hotplug));
+            }
             if (def->opts.pciopts.numaNode == -1) {
                 virBufferAddLit(&childBuf, "/>\n");
             } else {
index 9310fab16971107fad680a66b5221a59f413f614..aad3f82db79d8d97ad0969165164b56c49de3f38 100644 (file)
@@ -722,6 +722,7 @@ struct _virDomainPCIControllerOpts {
      * item in memory target config) -1 == unspecified
      */
     int numaNode;
+    virTristateSwitch hotplug; /* 'off' to prevent hotplug/unplug, default 'on' */
 };
 
 struct _virDomainUSBControllerOpts {
diff --git a/tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml b/tests/qemuxml2argvdata/pcie-root-port-nohotplug.xml
new file mode 100644 (file)
index 0000000..8a01494
--- /dev/null
@@ -0,0 +1,35 @@
+<domain type='qemu'>
+  <name>guest</name>
+  <uuid>11dbdcdd-4c3b-482b-8903-9bdb8c0a2774</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='q35'>hvm</type>
+  </os>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='pci' index='0' model='pcie-root'/>
+    <controller type='pci' index='1' model='pcie-root-port'/>
+    <controller type='pci' index='2' model='pcie-root-port'>
+      <target hotplug='off'/>
+    </controller>
+    <controller type='pci' index='3' model='pcie-root-port'>
+      <model name='ioh3420'/>
+      <target hotplug='off'/>
+    </controller>
+    <controller type='pci' index='4' model='pcie-switch-upstream-port'/>
+    <controller type='pci' index='5' model='pcie-switch-downstream-port'>
+      <target hotplug='off'/>
+    </controller>
+    <controller type='pci' index='6' model='pcie-switch-downstream-port'>
+      <target hotplug='on'/>
+    </controller>
+    <controller type='pci' index='7' model='pcie-switch-downstream-port'/>
+    <controller type='pci' index='8' model='pcie-switch-downstream-port'>
+      <model name='xio3130-downstream'/>
+      <target chassis='30' port='0x27'/>
+    </controller>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml b/tests/qemuxml2xmloutdata/pcie-root-port-nohotplug.x86_64-latest.xml
new file mode 100644 (file)
index 0000000..9e22a41
--- /dev/null
@@ -0,0 +1,70 @@
+<domain type='qemu'>
+  <name>guest</name>
+  <uuid>11dbdcdd-4c3b-482b-8903-9bdb8c0a2774</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>2097152</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='q35'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='custom' match='exact' check='none'>
+    <model fallback='forbid'>qemu64</model>
+  </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='pci' index='0' model='pcie-root'/>
+    <controller type='pci' index='1' model='pcie-root-port'>
+      <model name='pcie-root-port'/>
+      <target chassis='1' port='0x8'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
+    </controller>
+    <controller type='pci' index='2' model='pcie-root-port'>
+      <model name='pcie-root-port'/>
+      <target chassis='2' port='0x9' hotplug='off'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='3' model='pcie-root-port'>
+      <model name='ioh3420'/>
+      <target chassis='3' port='0xa' hotplug='off'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='pci' index='4' model='pcie-switch-upstream-port'>
+      <model name='x3130-upstream'/>
+      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+    </controller>
+    <controller type='pci' index='5' model='pcie-switch-downstream-port'>
+      <model name='xio3130-downstream'/>
+      <target chassis='5' port='0x0' hotplug='off'/>
+      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
+    </controller>
+    <controller type='pci' index='6' model='pcie-switch-downstream-port'>
+      <model name='xio3130-downstream'/>
+      <target chassis='6' port='0x1' hotplug='on'/>
+      <address type='pci' domain='0x0000' bus='0x04' slot='0x01' function='0x0'/>
+    </controller>
+    <controller type='pci' index='7' model='pcie-switch-downstream-port'>
+      <model name='xio3130-downstream'/>
+      <target chassis='7' port='0x2'/>
+      <address type='pci' domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+    </controller>
+    <controller type='pci' index='8' model='pcie-switch-downstream-port'>
+      <model name='xio3130-downstream'/>
+      <target chassis='30' port='0x27'/>
+      <address type='pci' domain='0x0000' bus='0x04' slot='0x03' function='0x0'/>
+    </controller>
+    <controller type='usb' index='0' model='qemu-xhci'>
+      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+    </controller>
+    <controller type='sata' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
+    </controller>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <memballoon model='none'/>
+  </devices>
+</domain>
index 756d4e2ce6fc2c586f03fd2ca3293eea5eab6b6f..cf5abeac359b35dc7e9acdaa9b4c7558fbf2b03d 100644 (file)
@@ -959,7 +959,7 @@ mymain(void)
             QEMU_CAPS_DEVICE_IOH3420);
     DO_TEST("pcie-root-port-model-ioh3420",
             QEMU_CAPS_DEVICE_IOH3420);
-
+    DO_TEST_CAPS_LATEST("pcie-root-port-nohotplug");
     DO_TEST("pcie-switch-upstream-port",
             QEMU_CAPS_DEVICE_IOH3420,
             QEMU_CAPS_DEVICE_X3130_UPSTREAM,