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. + + +

Redirected devices

+@@ -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. +

+ +
Virtual network
+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