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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list