]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: allow type='pci' addresses with no address attributes specified
authorLaine Stump <laine@laine.org>
Tue, 17 May 2016 18:03:00 +0000 (14:03 -0400)
committerLaine Stump <laine@laine.org>
Fri, 20 May 2016 17:54:25 +0000 (13:54 -0400)
Prior to this, <address type='pci'/> wasn't allowed when parsing
(domain+bus+slot+function needed to be a "valid" PCI address, meaning
that at least one of domain/bus/slot had to be non-0), the RNG
required bus to be specified, and if type was set to PCI when
formatting, domain+bus+slot+function would always be output.

This makes all the address attributes optional during parse and RNG
validation, and suppresses domain+bus+slot+function if domain+bus+slot
are all 0 (NB: if d+b+s are all 0, any value for function is
nonsensical as that will never happen in the real world, and after
the next patch we will always assign a real working address to any
empty PCI address before it is ever output to anywhere).

Note that explicitly setting all attributes to 0 is equivalent to
setting none of them, which is okay, since 0000:00:00 is reserved in
any PCI bus setup, and can't be used anyway.

docs/formatdomain.html.in
docs/schemas/basictypes.rng
src/conf/device_conf.c
src/conf/domain_conf.c

index 13337965b48c92fc2c31e8cfa5d8c8d64de035f7..72bfa35f30fbf90bfedca69e82d9526b4dd8a089 100644 (file)
         (<span class="since">since 0.9.7, requires QEMU
         0.13</span>). <code>multifunction</code> defaults to 'off',
         but should be set to 'on' for function 0 of a slot that will
-        have multiple functions used.
+        have multiple functions used.<br/>
+        <span class="since">Since 1.3.5</span>, some hypervisor
+        drivers may accept an <code>&lt;address type='pci'/&gt;</code>
+        element with no other attributes as an explicit request to
+        assign a PCI address for the device rather than some other
+        type of address that may also be appropriate for that same
+        device (e.g. virtio-mmio).
       </dd>
       <dt><code>drive</code></dt>
       <dd>Drive addresses have the following additional
index e2936d87f7b06f1841c6d06e8d6c71ec3fcfb145..83fd4ec24dfef9c9a3fa8983c967c1e7fbe38e14 100644 (file)
         <ref name="pciDomain"/>
       </attribute>
     </optional>
-    <attribute name="bus">
-      <ref name="pciBus"/>
-    </attribute>
+    <optional>
+      <attribute name="bus">
+        <ref name="pciBus"/>
+      </attribute>
+    </optional>
     <optional>
       <attribute name="slot">
         <ref name="pciSlot"/>
index 9d9f6a79151a39e184f9cae69fe140c2f1712ed5..4280513b0fe917770cdd05250386c23d875b7db2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * device_conf.c: device XML handling
  *
- * Copyright (C) 2006-2015 Red Hat, Inc.
+ * Copyright (C) 2006-2016 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -90,7 +90,7 @@ int virPCIDeviceAddressIsValid(virPCIDeviceAddressPtr addr,
                            addr->function);
         return 0;
     }
-    if (!(addr->domain || addr->bus || addr->slot)) {
+    if (virPCIDeviceAddressIsEmpty(addr)) {
         if (report)
             virReportError(VIR_ERR_XML_ERROR, "%s",
                            _("Invalid PCI address 0000:00:00, at least "
@@ -152,7 +152,7 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
         goto cleanup;
 
     }
-    if (!virPCIDeviceAddressIsValid(addr, true))
+    if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, true))
         goto cleanup;
 
     ret = 0;
index d6e044faeb4c5951d3b69292986b9fe6cef5a28a..fb05bf734c0ee70715a39c2bb82b54ce76007c1f 100644 (file)
@@ -4522,11 +4522,14 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
 
     switch ((virDomainDeviceAddressType) info->type) {
     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
-        virBufferAsprintf(buf, " domain='0x%.4x' bus='0x%.2x' slot='0x%.2x' function='0x%.1x'",
-                          info->addr.pci.domain,
-                          info->addr.pci.bus,
-                          info->addr.pci.slot,
-                          info->addr.pci.function);
+        if (!virPCIDeviceAddressIsEmpty(&info->addr.pci)) {
+            virBufferAsprintf(buf, " domain='0x%.4x' bus='0x%.2x' "
+                              "slot='0x%.2x' function='0x%.1x'",
+                              info->addr.pci.domain,
+                              info->addr.pci.bus,
+                              info->addr.pci.slot,
+                              info->addr.pci.function);
+        }
         if (info->addr.pci.multi) {
            virBufferAsprintf(buf, " multifunction='%s'",
                              virTristateSwitchTypeToString(info->addr.pci.multi));