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