[libvirt] [PATCH 5/7] assign the whole slot to the PCI device that has no address

Daniel P. Berrange berrange at redhat.com
Fri Jun 3 13:27:25 UTC 2011


On Fri, May 27, 2011 at 06:22:08PM +0800, Wen Congyang wrote:
> If user does not specify the PCI address, we should auto assign an unused slot.
> ---
>  src/qemu/qemu_command.c |   36 ++++++++++++++++++++++++++++++++----
>  1 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 48834f1..6f9540c 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -779,6 +779,35 @@ error:
>      return NULL;
>  }
>  
> +/* check whether the slot is used by the other device
> + * Return 0 if the slot is not used by the other device, or -1 if the slot
> + * is used by the other device.
> + */
> +static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs,
> +                                         virDomainDeviceInfoPtr dev)
> +{
> +    char *addr;
> +    virDomainDeviceInfo temp_dev;
> +    int function;
> +
> +    temp_dev = *dev;
> +    for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
> +        temp_dev.addr.pci.function = function;
> +        addr = qemuPCIAddressAsString(&temp_dev);
> +        if (!addr)
> +            return -1;
> +
> +        if (virHashLookup(addrs->used, addr)) {
> +            VIR_FREE(addr);
> +            return -1;
> +        }
> +
> +        VIR_FREE(addr);
> +    }
> +
> +    return 0;
> +}
> +
>  int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs,
>                                      virDomainDeviceInfoPtr dev)
>  {
> @@ -917,18 +946,17 @@ int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs,
>          if (!(addr = qemuPCIAddressAsString(&maybe)))
>              return -1;
>  
> -        if (virHashLookup(addrs->used, addr)) {
> +        if (qemuDomainPCIAddressCheckSlot(addrs, &maybe) < 0) {
>              VIR_DEBUG("PCI addr %s already in use", addr);
>              VIR_FREE(addr);
>              continue;
>          }
>  
>          VIR_DEBUG("Allocating PCI addr %s", addr);
> +        VIR_FREE(addr);
>  
> -        if (virHashAddEntry(addrs->used, addr, addr) < 0) {
> -            VIR_FREE(addr);
> +        if (qemuDomainPCIAddressReserveSlot(addrs, i) < 0)
>              return -1;
> -        }
>  
>          dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
>          dev->addr.pci = maybe.addr.pci;


ACK

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 :|




More information about the libvir-list mailing list