
On Fri, May 27, 2011 at 06:21:43PM +0800, Wen Congyang wrote:
We will support multi function PCI device. So we should reserve all functions in the slot if we want to reserve a slot. --- src/qemu/qemu_command.c | 37 ++++++++++++++++++++++++++++++++++--- src/qemu/qemu_command.h | 4 ++++ 2 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4ca6fe3..48834f1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -667,6 +667,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virBitmapPtr qemuCaps)
#define QEMU_PCI_ADDRESS_LAST_SLOT 31 +#define QEMU_PCI_ADDRESS_LAST_FUNCTION 8 struct _qemuDomainPCIAddressSet { virHashTablePtr used; int nextslot; @@ -810,19 +811,37 @@ int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, return 0; }
-int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, - int slot) +int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs, + int slot, int function) { virDomainDeviceInfo dev;
dev.addr.pci.domain = 0; dev.addr.pci.bus = 0; dev.addr.pci.slot = slot; - dev.addr.pci.function = 0; + dev.addr.pci.function = function;
return qemuDomainPCIAddressReserveAddr(addrs, &dev); }
+int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, + int slot) +{ + int function; + + for (function = 0; function <= QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) { + if (qemuDomainPCIAddressReserveFunction(addrs, slot, function) < 0) + goto cleanup; + } + + return 0; + +cleanup: + for (function--; function >= 0; function--) { + qemuDomainPCIAddressReleaseFunction(addrs, slot, function); + } + return -1; +}
int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev) @@ -853,6 +872,18 @@ int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs, return ret; }
+int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, + int slot, int function) +{ + virDomainDeviceInfo dev; + + dev.addr.pci.domain = 0; + dev.addr.pci.bus = 0; + dev.addr.pci.slot = slot; + dev.addr.pci.function = function; + + return qemuDomainPCIAddressReleaseAddr(addrs, &dev); +}
void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) { diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 528031d..4c83182 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -146,6 +146,8 @@ virDomainDefPtr qemuParseCommandLineString(virCapsPtr caps,
int qemuDomainAssignPCIAddresses(virDomainDefPtr def); qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def); +int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs, + int slot, int function); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, int slot); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, @@ -156,6 +158,8 @@ int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev); int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev); +int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, + int slot, int function);
void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs); int qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs);
ACK, much simpler than I was fearing this would be 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 :|