[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