On Mon, Jan 14, 2013 at 05:23:54PM +0100, Ján Tomko wrote:
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. It is also not the only place where qemuPCIAddressAsString is
called from and where this needs to be checked.
With other types of addresses, we will auto-create the <controller>
elements if we find the controller does not exist. We should probably
do the same for PCI. ie if you have bus == 2 and no PCI bridge for
that bus exists, then add one.
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|