[libvirt] [PATCH 4/7] Reimplement qemuDomainPCIAddressReserveSlot(): reserve all functions in the slot
Daniel P. Berrange
berrange at redhat.com
Fri Jun 3 13:26:43 UTC 2011
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 :|
More information about the libvir-list
mailing list