[libvirt] release 0.9.6-2

Laine Stump laine at fedoraproject.org
Mon Oct 3 13:35:16 UTC 2011


commit 38c4b724fe69097cb2d8ed7139992ec982840c69
Author: Laine Stump <laine at redhat.com>
Date:   Mon Oct 3 00:23:34 2011 -0400

    release 0.9.6-2
    
    * Make PCI multifunction support more manual - Bug 742836
    * Builds on F15 should still use cgconfig - Bug 738725

 ...ake-PCI-multifunction-support-more-manual.patch |  581 ++++++++++++++++++++
 libvirt-0.9.6-spec-F15-still-uses-cgconfig.patch   |   56 ++
 libvirt.spec                                       |   16 +-
 3 files changed, 650 insertions(+), 3 deletions(-)
---
diff --git a/libvirt-0.9.6-qemu-make-PCI-multifunction-support-more-manual.patch b/libvirt-0.9.6-qemu-make-PCI-multifunction-support-more-manual.patch
new file mode 100644
index 0000000..f4c54e2
--- /dev/null
+++ b/libvirt-0.9.6-qemu-make-PCI-multifunction-support-more-manual.patch
@@ -0,0 +1,581 @@
+From 3962198d82ab90d21144479c1d822db5d1f640a4 Mon Sep 17 00:00:00 2001
+From: Laine Stump <laine at laine.org>
+Date: Wed, 28 Sep 2011 14:19:59 -0400
+Subject: [PATCH 2/2] qemu: make PCI multifunction support more manual
+
+(This is a merge of cherry-picking upstream commits
+c329db7180d77c8077b9f9cd167a71d7f347227a and
+be7bc4d5ccb502c2da85d3b3db804fd53b70449e (a one liner). There were no
+merge conflicts.)
+
+When support for was added for PCI multifunction cards (in commit
+9f8baf, first included in libvirt 0.9.3), it was done by always
+turning on the multifunction bit for all PCI devices. Since that time
+it has been realized that this is not an ideal solution, and that the
+multifunction bit must be selectively turned on. For example, see
+
+  https://bugzilla.redhat.com/show_bug.cgi?id=742836
+
+and the discussion before and after
+
+  https://www.redhat.com/archives/libvir-list/2011-September/msg01036.html
+
+This patch modifies multifunction support so that the multifunction=on
+option is only added to the qemu commandline for a device if its PCI
+<address> definition has the attribute "multifunction='on'", e.g.:
+
+  <address type='pci' domain='0x0000' bus='0x00'
+           slot='0x04' function='0x0' multifunction='on'/>
+
+In practice, the multifunction bit should only be turned on if
+function='0' AND other functions will be used in the same slot - it
+usually isn't needed for functions 1-7 (although there are apparently
+some exceptions, e.g. the Intel X53 according to the QEMU source
+code), and should never be set if only function 0 will be used in the
+slot. The test cases have been changed accordingly to illustrate.
+
+With this patch in place, if a user attempts to assign multiple
+functions in a slot without setting the multifunction bit for function
+0, libvirt will issue an error when the domain is defined, and the
+define operation will fail. In the future, we may decide to detect
+this situation and automatically add multifunction=on to avoid the
+error; even then it will still be useful to have a manual method of
+turning on multifunction since, as stated above, there are some
+devices that excpect it to be turned on for all functions in a slot.
+
+A side effect of this patch is that attempts to use the same PCI
+address for two different devices will now log an error (previously
+this would cause the domain define operation to fail, but there would
+be no log message generated). Because the function doing this log was
+almost completely rewritten, I didn't think it worthwhile to make a
+separate patch for that fix (the entire patch would immediately be
+obsoleted).
+---
+ docs/formatdomain.html.in                          |   29 +++++--
+ docs/schemas/domaincommon.rng                      |    8 ++
+ src/conf/domain_conf.c                             |   22 +++++-
+ src/conf/domain_conf.h                             |   11 +++-
+ src/libvirt_private.syms                           |    2 +
+ src/qemu/qemu_command.c                            |   81 ++++++++++++++++----
+ .../qemuxml2argv-multifunction-pci-device.args     |   18 ++--
+ .../qemuxml2argv-multifunction-pci-device.xml      |    6 +-
+ .../qemuxml2argv-usb-ich9-companion.args           |   15 ++--
+ .../qemuxml2argv-usb-ich9-companion.xml            |    2 +-
+ .../qemuxml2argv-usb-ich9-ehci-addr.args           |    7 ++-
+ .../qemuxml2argv-usb-piix3-controller.args         |    7 ++-
+ tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args |   10 +-
+ tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml  |    2 +-
+ tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args |   25 ++++---
+ tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.xml  |    4 +-
+ 16 files changed, 183 insertions(+), 66 deletions(-)
+
+diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
+index 0a7abaf..390476d 100644
+--- a/docs/formatdomain.html.in
++++ b/docs/formatdomain.html.in
+@@ -1113,10 +1113,14 @@
+         The <code>type</code> attribute is mandatory, and is typically
+         "pci" or "drive".  For a "pci" controller, additional
+         attributes for <code>bus</code>, <code>slot</code>,
+-        and <code>function</code> must be present, as well as an
+-        optional <code>domain</code>.  For a "drive" controller,
+-        additional attributes <code>controller</code>, <code>bus</code>,
++        and <code>function</code> must be present, as well as
++        optional <code>domain</code> and <code>multifunction</code>.
++        Multifunction defaults to 'off'; any other value requires
++        QEMU 0.1.3 and <span class="since">libvirt 0.9.7</span>.  For a
++        "drive" controller, additional attributes
++        <code>controller</code>, <code>bus</code>,
+         and <code>unit</code> are available, each defaulting to 0.
++
+       </dd>
+     </dl>
+ 
+@@ -1293,7 +1297,7 @@
+     &lt;/controller&gt;
+     &lt;controller type='usb' index='0' model='ich9-uhci1'&gt;
+       &lt;master startport='0'/&gt;
+-      &lt;address type='pci' domain='0' bus='0' slot='4' function='0'/&gt;
++      &lt;address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/&gt;
+     &lt;/controller&gt;
+     ...
+   &lt;/devices&gt;
+@@ -1413,10 +1417,16 @@
+       with <code>virsh nodedev-list</code>. The
+       <code>bus</code> attribute allows the hexadecimal values 0 to ff, the
+       <code>slot</code> attribute allows the hexadecimal values 0 to 1f, and
+-      the <code>function</code> attribute allows the hexadecimal values 0 to
+-      7. There is also an optional <code>domain</code> attribute for the
+-      PCI domain, with hexadecimal values 0 to ffff, but it is currently
+-      not used by qemu.</dd>
++      the <code>function</code> attribute allows the hexadecimal values 0 to 7.
++      The <code>multifunction</code> attribute controls turning on the
++      multifunction bit for a particular slot/function in the PCI
++      control register<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.
++      There is also an optional <code>domain</code> attribute for
++      the PCI domain, with hexadecimal values 0 to ffff, but it is
++      currently not used by qemu.</dd>
+     </dl>
+ 
+     <h4><a name="elementsRedir">Redirected devices</a></h4>
+@@ -1584,7 +1594,8 @@
+       the interface to a particular pci slot, with
+       attribute <code>type='pci'</code> and additional
+       attributes <code>domain</code>, <code>bus</code>, <code>slot</code>,
+-      and <code>function</code> as appropriate.
++      <code>function</code>, and <code>multifunction</code>
++      <span class="since">since 0.9.7, requires QEMU 0.13</span> as appropriate.
+     </p>
+ 
+     <h5><a name="elementsNICSVirtual">Virtual network</a></h5>
+diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
+index d0da41c..9f8d292 100644
+--- a/docs/schemas/domaincommon.rng
++++ b/docs/schemas/domaincommon.rng
+@@ -2106,6 +2106,14 @@
+     <attribute name="function">
+       <ref name="pciFunc"/>
+     </attribute>
++    <optional>
++      <attribute name="multifunction">
++        <choice>
++          <value>on</value>
++          <value>off</value>
++        </choice>
++      </attribute>
++    </optional>
+   </define>
+   <define name="driveaddress">
+     <optional>
+diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
+index 7463d7c..318f523 100644
+--- a/src/conf/domain_conf.c
++++ b/src/conf/domain_conf.c
+@@ -138,6 +138,12 @@ VIR_ENUM_IMPL(virDomainDeviceAddress, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST,
+               "ccid",
+               "usb")
+ 
++VIR_ENUM_IMPL(virDomainDeviceAddressPciMulti,
++              VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_LAST,
++              "default",
++              "on",
++              "off")
++
+ VIR_ENUM_IMPL(virDomainDisk, VIR_DOMAIN_DISK_TYPE_LAST,
+               "block",
+               "file",
+@@ -1645,6 +1651,10 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
+                           info->addr.pci.bus,
+                           info->addr.pci.slot,
+                           info->addr.pci.function);
++        if (info->addr.pci.multi) {
++           virBufferAsprintf(buf, " multifunction='%s'",
++                             virDomainDeviceAddressPciMultiTypeToString(info->addr.pci.multi));
++        }
+         break;
+ 
+     case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
+@@ -1689,7 +1699,7 @@ static int
+ virDomainDevicePCIAddressParseXML(xmlNodePtr node,
+                                   virDomainDevicePCIAddressPtr addr)
+ {
+-    char *domain, *slot, *bus, *function;
++    char *domain, *slot, *bus, *function, *multi;
+     int ret = -1;
+ 
+     memset(addr, 0, sizeof(*addr));
+@@ -1698,6 +1708,7 @@ virDomainDevicePCIAddressParseXML(xmlNodePtr node,
+     bus      = virXMLPropString(node, "bus");
+     slot     = virXMLPropString(node, "slot");
+     function = virXMLPropString(node, "function");
++    multi    = virXMLPropString(node, "multifunction");
+ 
+     if (domain &&
+         virStrToLong_ui(domain, NULL, 0, &addr->domain) < 0) {
+@@ -1727,6 +1738,14 @@ virDomainDevicePCIAddressParseXML(xmlNodePtr node,
+         goto cleanup;
+     }
+ 
++    if (multi &&
++        ((addr->multi = virDomainDeviceAddressPciMultiTypeFromString(multi)) <= 0)) {
++        virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
++                             _("Unknown value '%s' for <address> 'multifunction' attribute"),
++                             multi);
++        goto cleanup;
++
++    }
+     if (!virDomainDevicePCIAddressIsValid(addr)) {
+         virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                              _("Insufficient specification for PCI address"));
+@@ -1740,6 +1759,7 @@ cleanup:
+     VIR_FREE(bus);
+     VIR_FREE(slot);
+     VIR_FREE(function);
++    VIR_FREE(multi);
+     return ret;
+ }
+ 
+diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
+index 371f270..f4a38fb 100644
+--- a/src/conf/domain_conf.h
++++ b/src/conf/domain_conf.h
+@@ -74,6 +74,14 @@ enum virDomainDeviceAddressType {
+     VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST
+ };
+ 
++enum virDomainDeviceAddressPciMulti {
++    VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_DEFAULT = 0,
++    VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON,
++    VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF,
++
++    VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_LAST
++};
++
+ typedef struct _virDomainDevicePCIAddress virDomainDevicePCIAddress;
+ typedef virDomainDevicePCIAddress *virDomainDevicePCIAddressPtr;
+ struct _virDomainDevicePCIAddress {
+@@ -81,6 +89,7 @@ struct _virDomainDevicePCIAddress {
+     unsigned int bus;
+     unsigned int slot;
+     unsigned int function;
++    int          multi;  /* enum virDomainDeviceAddressPciMulti */
+ };
+ 
+ typedef struct _virDomainDeviceDriveAddress virDomainDeviceDriveAddress;
+@@ -1820,7 +1829,7 @@ VIR_ENUM_DECL(virDomainLifecycle)
+ VIR_ENUM_DECL(virDomainLifecycleCrash)
+ VIR_ENUM_DECL(virDomainDevice)
+ VIR_ENUM_DECL(virDomainDeviceAddress)
+-VIR_ENUM_DECL(virDomainDeviceAddressMode)
++VIR_ENUM_DECL(virDomainDeviceAddressPciMulti)
+ VIR_ENUM_DECL(virDomainDisk)
+ VIR_ENUM_DECL(virDomainDiskDevice)
+ VIR_ENUM_DECL(virDomainDiskBus)
+diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
+index 8235ea1..da3042e 100644
+--- a/src/libvirt_private.syms
++++ b/src/libvirt_private.syms
+@@ -269,6 +269,8 @@ virDomainDefParseNode;
+ virDomainDefParseString;
+ virDomainDeleteConfig;
+ virDomainDeviceAddressIsValid;
++virDomainDeviceAddressPciMultiTypeFromString;
++virDomainDeviceAddressPciMultiTypeToString;
+ virDomainDeviceAddressTypeToString;
+ virDomainDeviceDefFree;
+ virDomainDeviceDefParse;
+diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
+index 0adc56a..ee184c2 100644
+--- a/src/qemu/qemu_command.c
++++ b/src/qemu/qemu_command.c
+@@ -772,22 +772,65 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
+                                  virDomainDeviceInfoPtr dev,
+                                  void *opaque)
+ {
++    int ret = -1;
++    char *addr = NULL;
+     qemuDomainPCIAddressSetPtr addrs = opaque;
+ 
+-    if (dev->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+-        char *addr = qemuPCIAddressAsString(dev);
+-        if (!addr)
+-            return -1;
++    if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
++        return 0;
+ 
+-        VIR_DEBUG("Remembering PCI addr %s", addr);
++    addr = qemuPCIAddressAsString(dev);
++    if (!addr)
++        goto cleanup;
+ 
+-        if (virHashAddEntry(addrs->used, addr, addr) < 0) {
+-            VIR_FREE(addr);
+-            return -1;
++    if (virHashLookup(addrs->used, addr)) {
++        if (dev->addr.pci.function != 0) {
++            qemuReportError(VIR_ERR_XML_ERROR,
++                            _("Attempted double use of PCI Address '%s' "
++                              "(may need \"multifunction='on'\" for device on function 0"),
++                            addr);
++        } else {
++            qemuReportError(VIR_ERR_XML_ERROR,
++                            _("Attempted double use of PCI Address '%s'"), addr);
+         }
++        goto cleanup;
+     }
+ 
+-    return 0;
++    VIR_DEBUG("Remembering PCI addr %s", addr);
++    if (virHashAddEntry(addrs->used, addr, addr) < 0)
++        goto cleanup;
++    addr = NULL;
++
++    if ((dev->addr.pci.function == 0) &&
++        (dev->addr.pci.multi != VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)) {
++        /* a function 0 w/o multifunction=on must reserve the entire slot */
++        int function;
++        virDomainDeviceInfo temp_dev = *dev;
++
++        for (function = 1; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
++            temp_dev.addr.pci.function = function;
++            addr = qemuPCIAddressAsString(&temp_dev);
++            if (!addr)
++                goto cleanup;
++
++            if (virHashLookup(addrs->used, addr)) {
++                qemuReportError(VIR_ERR_XML_ERROR,
++                                _("Attempted double use of PCI Address '%s'"
++                                  "(need \"multifunction='off'\" for device on function 0)"),
++                                addr);
++                goto cleanup;
++            }
++
++            VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", addr);
++            if (virHashAddEntry(addrs->used, addr, addr))
++                goto cleanup;
++            addr = NULL;
++        }
++    }
++    ret = 0;
++cleanup:
++    VIR_FREE(addr);
++    return ret;
+ }
+ 
+ 
+@@ -1374,7 +1417,13 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
+             if (info->addr.pci.function != 0) {
+                 qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                 _("Only PCI device addresses with function=0 "
+-                                  "are supported"));
++                                  "are supported with this QEMU binary"));
++                return -1;
++            }
++            if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON) {
++                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
++                                _("'multifunction=on' is not supported with "
++                                  "this QEMU binary"));
+                 return -1;
+             }
+         }
+@@ -1389,11 +1438,13 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
+             virBufferAsprintf(buf, ",bus=pci.0");
+         else
+             virBufferAsprintf(buf, ",bus=pci");
+-        if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION))
+-            virBufferAsprintf(buf, ",multifunction=on,addr=0x%x.0x%x",
+-                              info->addr.pci.slot, info->addr.pci.function);
+-        else
+-            virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
++        if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)
++            virBufferAddLit(buf, ",multifunction=on");
++        else if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF)
++            virBufferAddLit(buf, ",multifunction=off");
++        virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
++        if (info->addr.pci.function != 0)
++           virBufferAsprintf(buf, ".0x%x", info->addr.pci.function);
+     } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
+         virBufferAsprintf(buf, ",bus=");
+         qemuUsbId(buf, info->addr.usb.bus);
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args b/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args
+index ff229f2..8a2150e 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.args
+@@ -1,15 +1,15 @@
+ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \
+ pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
+ -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+--device lsi,id=scsi0,bus=pci.0,multifunction=on,addr=0x3.0x0 \
+--device lsi,id=scsi1,bus=pci.0,multifunction=on,addr=0x4.0x0 \
++-device lsi,id=scsi0,bus=pci.0,multifunction=off,addr=0x3 \
++-device lsi,id=scsi1,bus=pci.0,multifunction=on,addr=0x4 \
+ -device lsi,id=scsi2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
+--device lsi,id=scsi3,bus=pci.0,multifunction=on,addr=0x4.0x2 \
+--device lsi,id=scsi4,bus=pci.0,multifunction=on,addr=0x4.0x3 \
+--device lsi,id=scsi5,bus=pci.0,multifunction=on,addr=0x4.0x4 \
+--device lsi,id=scsi6,bus=pci.0,multifunction=on,addr=0x4.0x5 \
+--device lsi,id=scsi7,bus=pci.0,multifunction=on,addr=0x4.0x6 \
+--device lsi,id=scsi8,bus=pci.0,multifunction=on,addr=0x4.0x7 \
++-device lsi,id=scsi3,bus=pci.0,addr=0x4.0x2 \
++-device lsi,id=scsi4,bus=pci.0,addr=0x4.0x3 \
++-device lsi,id=scsi5,bus=pci.0,addr=0x4.0x4 \
++-device lsi,id=scsi6,bus=pci.0,addr=0x4.0x5 \
++-device lsi,id=scsi7,bus=pci.0,addr=0x4.0x6 \
++-device lsi,id=scsi8,bus=pci.0,addr=0x4.0x7 \
+ -drive file=/tmp/scsidisk.img,if=none,id=drive-scsi0-0-0 \
+ -device scsi-disk,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0 \
+--usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x5.0x0
++-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.xml
+index 672fb61..24b95b8 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-multifunction-pci-device.xml
+@@ -20,13 +20,13 @@
+       <address type='drive' controller='0' bus='0' unit='0'/>
+     </disk>
+     <controller type='scsi' index='0'>
+-      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
++      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='off'/>
+     </controller>
+     <controller type='scsi' index='1'>
+-      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
++      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
+     </controller>
+     <controller type='scsi' index='2'>
+-      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
++      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1' multifunction='on'/>
+     </controller>
+     <controller type='scsi' index='3'>
+       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args
+index 1007544..080d483 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.args
+@@ -1,6 +1,9 @@
+-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+--device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 \
+--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
+--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
+--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
+--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
++LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc \
++-m 214 -smp 1 -nographic -nodefconfig -nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
++-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
++-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
++-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
++-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml
+index 05a6adf..5a43638 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-companion.xml
+@@ -15,7 +15,7 @@
+     </controller>
+     <controller type='usb' index='0' model='ich9-uhci1'>
+       <master startport='0'/>
+-      <address type='pci' domain='0' bus='0' slot='4' function='0'/>
++      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
+     </controller>
+     <controller type='usb' index='0' model='ich9-uhci2'>
+       <master startport='2'/>
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args
+index 0059ab5..babd4f8 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args
+@@ -1 +1,6 @@
+-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
++LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
++-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
++-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args
+index 06863bb..1b2d5c1 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-piix3-controller.args
+@@ -1 +1,6 @@
+-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -device piix3-usb-uhci,id=usb,bus=pci.0,multifunction=on,addr=0x1.0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
++LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
++-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
++-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args
+index f6270d5..7d34c2a 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.args
+@@ -1,10 +1,10 @@
+ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+--device ich9-usb-ehci1,id=usb,bus=pci.0,multifunction=on,addr=0x4.0x7 \
+--device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
+--device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
+--device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
++-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
++-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
++-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
++-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
+ -chardev socket,id=charredir0,host=localhost,port=4000 \
+ -device usb-redir,chardev=charredir0,id=redir0 \
+ -chardev spicevmc,id=charredir1,name=usbredir \
+ -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=4 \
+--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml
+index 1dac3fb..a359a3d 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir.xml
+@@ -19,7 +19,7 @@
+     </controller>
+     <controller type='usb' index='0' model='ich9-uhci1'>
+       <master startport='0'/>
+-      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
++      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
+     </controller>
+     <controller type='usb' index='0' model='ich9-uhci2'>
+       <master startport='2'/>
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args b/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args
+index be4a78e..0a61af5 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.args
+@@ -1,15 +1,18 @@
+-LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+--device piix3-usb-uhci,id=usb,bus=pci.0,multifunction=on,addr=0x1.0x2 \
+--device ich9-usb-ehci1,id=usb1,bus=pci.0,multifunction=on,addr=0x4.0x7 \
+--device ich9-usb-uhci1,masterbus=usb1.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4.0x0 \
+--device ich9-usb-uhci2,masterbus=usb1.0,firstport=2,bus=pci.0,multifunction=on,addr=0x4.0x1 \
+--device ich9-usb-uhci3,masterbus=usb1.0,firstport=4,bus=pci.0,multifunction=on,addr=0x4.0x2 \
+--device ich9-usb-ehci1,id=usb2,bus=pci.0,multifunction=on,addr=0x5.0x7 \
+--device ich9-usb-uhci1,masterbus=usb2.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5.0x0 \
+--device ich9-usb-uhci2,masterbus=usb2.0,firstport=2,bus=pci.0,multifunction=on,addr=0x5.0x1 \
+--device ich9-usb-uhci3,masterbus=usb2.0,firstport=4,bus=pci.0,multifunction=on,addr=0x5.0x2 \
++LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S \
++-M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
++-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
++-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
++-device ich9-usb-ehci1,id=usb1,bus=pci.0,addr=0x4.0x7 \
++-device ich9-usb-uhci1,masterbus=usb1.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
++-device ich9-usb-uhci2,masterbus=usb1.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
++-device ich9-usb-uhci3,masterbus=usb1.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
++-device ich9-usb-ehci1,id=usb2,bus=pci.0,addr=0x5.0x7 \
++-device ich9-usb-uhci1,masterbus=usb2.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 \
++-device ich9-usb-uhci2,masterbus=usb2.0,firstport=2,bus=pci.0,addr=0x5.0x1 \
++-device ich9-usb-uhci3,masterbus=usb2.0,firstport=4,bus=pci.0,addr=0x5.0x2 \
+ -device usb-hub,id=hub0,bus=usb1.0,port=1 \
+ -device usb-tablet,id=input0,bus=usb.0,port=2 \
+ -device usb-host,hostbus=14,hostaddr=6,id=hostdev0,bus=usb2.0,port=1 \
+ -device usb-host,hostbus=14,hostaddr=7,id=hostdev1,bus=usb2.0,port=2 \
+--device virtio-balloon-pci,id=balloon0,bus=pci.0,multifunction=on,addr=0x3.0x0
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.xml
+index e8ada4d..b12b841 100644
+--- a/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.xml
++++ b/tests/qemuxml2argvdata/qemuxml2argv-usb1-usb2.xml
+@@ -21,7 +21,7 @@
+     </controller>
+     <controller type='usb' index='1' model='ich9-uhci1'>
+       <master startport='0'/>
+-      <address type='pci' domain='0' bus='0' slot='4' function='0'/>
++      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
+     </controller>
+     <controller type='usb' index='1' model='ich9-uhci2'>
+       <master startport='2'/>
+@@ -37,7 +37,7 @@
+     </controller>
+     <controller type='usb' index='2' model='ich9-uhci1'>
+       <master startport='0'/>
+-      <address type='pci' domain='0' bus='0' slot='5' function='0'/>
++      <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='on'/>
+     </controller>
+     <controller type='usb' index='2' model='ich9-uhci2'>
+       <master startport='2'/>
+-- 
+1.7.4.4
+
diff --git a/libvirt-0.9.6-spec-F15-still-uses-cgconfig.patch b/libvirt-0.9.6-spec-F15-still-uses-cgconfig.patch
new file mode 100644
index 0000000..06b7bee
--- /dev/null
+++ b/libvirt-0.9.6-spec-F15-still-uses-cgconfig.patch
@@ -0,0 +1,56 @@
+From 5d219e1bd98b562eed28e1df424a2590bb92b366 Mon Sep 17 00:00:00 2001
+From: Eric Blake <eblake at redhat.com>
+Date: Mon, 26 Sep 2011 14:28:47 -0600
+Subject: [PATCH 1/2] spec: F15 still uses cgconfig, RHEL lacks hyperv
+
+Commit ecd8725c dropped attempts to probe the cgconfig service on
+new enough Fedora where systemd took over that aspect of the system,
+but mistakenly used F14 instead of F15 as the cutoff point.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=741358
+
+Also, RHEL does not include HyperV support yet.
+
+* libvirt.spec.in (with_cgconfig): Check cgconfig service in F15.
+(%{?rhel}): Provide default for with_hyperv.
+---
+ libvirt.spec.in |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/libvirt.spec.in b/libvirt.spec.in
+index c0ea898..b87e3f6 100644
+--- a/libvirt.spec.in
++++ b/libvirt.spec.in
+@@ -97,7 +97,8 @@
+ %endif
+ 
+ # RHEL doesn't ship OpenVZ, VBox, UML, PowerHypervisor,
+-# VMWare, libxenserver (xenapi), or libxenlight (Xen 4.1 and newer)
++# VMWare, libxenserver (xenapi), libxenlight (Xen 4.1 and newer),
++# or HyperV.
+ %if 0%{?rhel}
+ %define with_openvz 0
+ %define with_vbox 0
+@@ -106,6 +107,7 @@
+ %define with_vmware 0
+ %define with_xenapi 0
+ %define with_libxl 0
++%define with_hyperv 0
+ %endif
+ 
+ # RHEL-5 has restricted QEMU to x86_64 only and is too old for LXC
+@@ -894,9 +896,9 @@ done
+ %endif
+ 
+ %if %{with_cgconfig}
+-# Starting with Fedora 15, systemd automounts all cgroups, and cgconfig is
++# Starting with Fedora 16, systemd automounts all cgroups, and cgconfig is
+ # no longer a necessary service.
+-%if 0%{?fedora} <= 14 || 0%{?rhel} <= 6
++%if 0%{?fedora} <= 15 || 0%{?rhel} <= 6
+ if [ "$1" -eq "1" ]; then
+ /sbin/chkconfig cgconfig on
+ fi
+-- 
+1.7.4.4
+
diff --git a/libvirt.spec b/libvirt.spec
index 1522ee9..8ddfbde 100644
--- a/libvirt.spec
+++ b/libvirt.spec
@@ -97,7 +97,8 @@
 %endif
 
 # RHEL doesn't ship OpenVZ, VBox, UML, PowerHypervisor,
-# VMWare, libxenserver (xenapi), or libxenlight (Xen 4.1 and newer)
+# VMWare, libxenserver (xenapi), libxenlight (Xen 4.1 and newer),
+# or HyperV.
 %if 0%{?rhel}
 %define with_openvz 0
 %define with_vbox 0
@@ -106,6 +107,7 @@
 %define with_vmware 0
 %define with_xenapi 0
 %define with_libxl 0
+%define with_hyperv 0
 %endif
 
 # RHEL-5 has restricted QEMU to x86_64 only and is too old for LXC
@@ -232,10 +234,12 @@
 Summary: Library providing a simple virtualization API
 Name: libvirt
 Version: 0.9.6
-Release: 1%{?dist}%{?extra_release}
+Release: 2%{?dist}%{?extra_release}
 License: LGPLv2+
 Group: Development/Libraries
 Source: http://libvirt.org/sources/libvirt-%{version}.tar.gz
+Patch1: %{name}-%{version}-spec-F15-still-uses-cgconfig.patch
+Patch2: %{name}-%{version}-qemu-make-PCI-multifunction-support-more-manual.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
 URL: http://libvirt.org/
 
@@ -547,6 +551,8 @@ of recent versions of Linux (and other OSes).
 
 %prep
 %setup -q
+%patch1 -p1
+%patch2 -p1
 
 %build
 %if ! %{with_xen}
@@ -900,7 +906,7 @@ done
 %if %{with_cgconfig}
 # Starting with Fedora 15, systemd automounts all cgroups, and cgconfig is
 # no longer a necessary service.
-%if 0%{?fedora} <= 14 || 0%{?rhel} <= 6
+%if 0%{?fedora} <= 15 || 0%{?rhel} <= 6
 if [ "$1" -eq "1" ]; then
 /sbin/chkconfig cgconfig on
 fi
@@ -1154,6 +1160,10 @@ fi
 %endif
 
 %changelog
+* Mon Oct  3 2011 Laine Stump <laine at redhat.com> - 0.9.6-2
+- Make PCI multifunction support more manual - Bug 742836
+- F15 build still uses cgconfig - Bug 738725
+
 * Thu Sep 22 2011 Daniel Veillard <veillard at redhat.com> - 0.9.6-1
 - Fix the qemu reboot bug and a few others bug fixes
 


More information about the scm-commits mailing list