mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 15:27:47 +00:00
conf: new function virDomainPCIAddressReserveNextAddr()
There is an existing virDomainPCIAddressReserveNextSlot() which will reserve all functions of the next available PCI slot. One place in the qemu PCI address assignment code requires reserving a *single* function of the next available PCI slot. This patch modifies and renames virDomainPCIAddressReserveNextSlot() so that it can fulfill both the original purpose and the need to reserve a single function. (This is being done so that the abovementioned code in qemu can have its "kind of open coded" solution replaced with a call to this new function).
This commit is contained in:
parent
7c8df1e82f
commit
848e7ff2b3
@ -693,29 +693,63 @@ virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virDomainPCIAddressReserveNextAddr:
|
||||
*
|
||||
* @addrs: a set of PCI addresses.
|
||||
* @dev: virDomainDeviceInfo that should get the new address.
|
||||
* @flags: CONNECT_TYPE flags for the device that needs an address.
|
||||
* @function: which function on the slot to mark as reserved
|
||||
* (if @reserveEntireSlot is false)
|
||||
* @reserveEntireSlot: true to reserve all functions on the new slot,
|
||||
* false to reserve just @function
|
||||
*
|
||||
* Find the next *completely unreserved* slot with compatible
|
||||
* connection @flags, mark either one function or the entire
|
||||
* slot as in-use (according to @function and @reserveEntireSlot),
|
||||
* and set @dev->addr.pci with this newly reserved address.
|
||||
*
|
||||
* returns 0 on success, or -1 on failure.
|
||||
*/
|
||||
int
|
||||
virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainDeviceInfoPtr dev,
|
||||
virDomainPCIConnectFlags flags)
|
||||
virDomainPCIConnectFlags flags,
|
||||
unsigned int function,
|
||||
bool reserveEntireSlot)
|
||||
{
|
||||
virPCIDeviceAddress addr;
|
||||
|
||||
if (virDomainPCIAddressGetNextSlot(addrs, &addr, flags) < 0)
|
||||
return -1;
|
||||
|
||||
if (virDomainPCIAddressReserveSlot(addrs, &addr, flags) < 0)
|
||||
addr.function = reserveEntireSlot ? 0 : function;
|
||||
|
||||
if (virDomainPCIAddressReserveAddr(addrs, &addr, flags, reserveEntireSlot, false) < 0)
|
||||
return -1;
|
||||
|
||||
addrs->lastaddr = addr;
|
||||
addrs->lastFlags = flags;
|
||||
|
||||
if (!addrs->dryRun) {
|
||||
dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
|
||||
dev->addr.pci = addr;
|
||||
}
|
||||
|
||||
addrs->lastaddr = addr;
|
||||
addrs->lastFlags = flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainDeviceInfoPtr dev,
|
||||
virDomainPCIConnectFlags flags)
|
||||
{
|
||||
return virDomainPCIAddressReserveNextAddr(addrs, dev, flags, 0, true);
|
||||
}
|
||||
|
||||
|
||||
static char*
|
||||
virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr)
|
||||
{
|
||||
|
@ -160,6 +160,13 @@ int virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainPCIConnectFlags flags)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
||||
|
||||
int virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainDeviceInfoPtr dev,
|
||||
virDomainPCIConnectFlags flags,
|
||||
unsigned int function,
|
||||
bool reserveEntireSlot)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
||||
|
||||
int virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||
virDomainDeviceInfoPtr dev,
|
||||
virDomainPCIConnectFlags flags)
|
||||
|
@ -102,6 +102,7 @@ virDomainPCIAddressFlagsCompatible;
|
||||
virDomainPCIAddressGetNextSlot;
|
||||
virDomainPCIAddressReleaseSlot;
|
||||
virDomainPCIAddressReserveAddr;
|
||||
virDomainPCIAddressReserveNextAddr;
|
||||
virDomainPCIAddressReserveNextSlot;
|
||||
virDomainPCIAddressReserveSlot;
|
||||
virDomainPCIAddressSetAlloc;
|
||||
|
Loading…
Reference in New Issue
Block a user