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
+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
+ definition has the attribute "multifunction='on'", e.g.:
+
+
+
+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 type
attribute is mandatory, and is typically
+ "pci" or "drive". For a "pci" controller, additional
+ attributes for bus
, slot
,
+- and function
must be present, as well as an
+- optional domain
. For a "drive" controller,
+- additional attributes controller
, bus
,
++ and function
must be present, as well as
++ optional domain
and multifunction
.
++ Multifunction defaults to 'off'; any other value requires
++ QEMU 0.1.3 and libvirt 0.9.7. For a
++ "drive" controller, additional attributes
++ controller
, bus
,
+ and unit
are available, each defaulting to 0.
++
+
+
+
+@@ -1293,7 +1297,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>
+ ...
+ </devices>
+@@ -1413,10 +1417,16 @@
+ with virsh nodedev-list
. The
+ bus
attribute allows the hexadecimal values 0 to ff, the
+ slot
attribute allows the hexadecimal values 0 to 1f, and
+- the function
attribute allows the hexadecimal values 0 to
+- 7. There is also an optional domain
attribute for the
+- PCI domain, with hexadecimal values 0 to ffff, but it is currently
+- not used by qemu.
++ the function
attribute allows the hexadecimal values 0 to 7.
++ The multifunction
attribute controls turning on the
++ multifunction bit for a particular slot/function in the PCI
++ control registersince 0.9.7, requires QEMU
++ 0.13. multifunction
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 domain
attribute for
++ the PCI domain, with hexadecimal values 0 to ffff, but it is
++ currently not used by qemu.
+
+
+
+@@ -1584,7 +1594,8 @@
+ the interface to a particular pci slot, with
+ attribute type='pci'
and additional
+ attributes domain
, bus
, slot
,
+- and function
as appropriate.
++ function
, and multifunction
++ since 0.9.7, requires QEMU 0.13 as appropriate.
+
+
+
+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 @@
+
+
+
++
++
++
++ on
++ off
++
++
++
+
+
+
+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 '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 @@
+
+
+
+-
++
+
+
+-
++
+
+
+-
++
+
+
+
+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 @@
+
+
+
+-
++
+
+
+
+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 @@
+
+
+
+-
++
+
+
+
+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 @@
+
+
+
+-
++
+
+
+
+@@ -37,7 +37,7 @@
+
+
+
+-
++
+
+
+
+--
+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
+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 - 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 - 0.9.6-1
- Fix the qemu reboot bug and a few others bug fixes