
在 2013-01-14一的 17:23 +0100,Ján Tomko写道:
On 01/10/13 02:04, liguang wrote:
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 04a9512..48b4f46 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -966,13 +966,6 @@ static char *qemuPCIAddressAsString(virDomainDeviceInfoPtr dev) { char *addr;
- if (dev->addr.pci.domain != 0 || - dev->addr.pci.bus != 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Only PCI domain 0 and bus 0 are available")); - return NULL; - } - if (virAsprintf(&addr, "%d:%d:%d.%d", dev->addr.pci.domain, dev->addr.pci.bus, @@ -984,8 +977,24 @@ static char *qemuPCIAddressAsString(virDomainDeviceInfoPtr dev) return addr; }
+static int qemuPciBridgeSupport(virDomainDefPtr def) +{ + int i, c = 0; + + for (i = 0; i < def->ncontrollers; i++) { + virDomainControllerDefPtr controller = def->controllers[i]; + + if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_PCIBRIDGE) + c++; + }
-static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, + if (c > 1) + return 0; + else + return -1; +} + +static int qemuCollectPCIAddress(virDomainDefPtr def, virDomainDeviceDefPtr device, virDomainDeviceInfoPtr info, void *opaque) @@ -1004,6 +1013,20 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; }
+ if (info->addr.pci.domain != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Only PCI device addresses with " + "domain=0 are supported")); + return -1; + } + + if (info->addr.pci.bus != 0 && qemuPciBridgeSupport(def) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Only PCI device addresses with bus=0 are" + " supported without pci-bridge support")); + return -1; + } +
This would allow any bus number, even if we don't have enough PCI bridges.
maybe, but who tell us the pci bus number limitation? if I know the limitation I will limit it.
It is also not the only place where qemuPCIAddressAsString is called from and where this needs to be checked. We also have other functions assuming bus = 0. qemuDomainPCIAddressGetNextSlot should also take the bridges into account, for devices without a specified address.
Yes, but I removed others, for they are unnecessary.
I'll try to post patches dealing with that sometime later this week. Jan
-- regards! li guang