mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +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;
|
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
|
int
|
||||||
virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
virDomainPCIAddressReserveNextAddr(virDomainPCIAddressSetPtr addrs,
|
||||||
virDomainDeviceInfoPtr dev,
|
virDomainDeviceInfoPtr dev,
|
||||||
virDomainPCIConnectFlags flags)
|
virDomainPCIConnectFlags flags,
|
||||||
|
unsigned int function,
|
||||||
|
bool reserveEntireSlot)
|
||||||
{
|
{
|
||||||
virPCIDeviceAddress addr;
|
virPCIDeviceAddress addr;
|
||||||
|
|
||||||
if (virDomainPCIAddressGetNextSlot(addrs, &addr, flags) < 0)
|
if (virDomainPCIAddressGetNextSlot(addrs, &addr, flags) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (virDomainPCIAddressReserveSlot(addrs, &addr, flags) < 0)
|
addr.function = reserveEntireSlot ? 0 : function;
|
||||||
|
|
||||||
|
if (virDomainPCIAddressReserveAddr(addrs, &addr, flags, reserveEntireSlot, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
addrs->lastaddr = addr;
|
||||||
|
addrs->lastFlags = flags;
|
||||||
|
|
||||||
if (!addrs->dryRun) {
|
if (!addrs->dryRun) {
|
||||||
dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
|
dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
|
||||||
dev->addr.pci = addr;
|
dev->addr.pci = addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
addrs->lastaddr = addr;
|
|
||||||
addrs->lastFlags = flags;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||||
|
virDomainDeviceInfoPtr dev,
|
||||||
|
virDomainPCIConnectFlags flags)
|
||||||
|
{
|
||||||
|
return virDomainPCIAddressReserveNextAddr(addrs, dev, flags, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr)
|
virDomainCCWAddressAsString(virDomainDeviceCCWAddressPtr addr)
|
||||||
{
|
{
|
||||||
|
@ -160,6 +160,13 @@ int virDomainPCIAddressGetNextSlot(virDomainPCIAddressSetPtr addrs,
|
|||||||
virDomainPCIConnectFlags flags)
|
virDomainPCIConnectFlags flags)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
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,
|
int virDomainPCIAddressReserveNextSlot(virDomainPCIAddressSetPtr addrs,
|
||||||
virDomainDeviceInfoPtr dev,
|
virDomainDeviceInfoPtr dev,
|
||||||
virDomainPCIConnectFlags flags)
|
virDomainPCIConnectFlags flags)
|
||||||
|
@ -102,6 +102,7 @@ virDomainPCIAddressFlagsCompatible;
|
|||||||
virDomainPCIAddressGetNextSlot;
|
virDomainPCIAddressGetNextSlot;
|
||||||
virDomainPCIAddressReleaseSlot;
|
virDomainPCIAddressReleaseSlot;
|
||||||
virDomainPCIAddressReserveAddr;
|
virDomainPCIAddressReserveAddr;
|
||||||
|
virDomainPCIAddressReserveNextAddr;
|
||||||
virDomainPCIAddressReserveNextSlot;
|
virDomainPCIAddressReserveNextSlot;
|
||||||
virDomainPCIAddressReserveSlot;
|
virDomainPCIAddressReserveSlot;
|
||||||
virDomainPCIAddressSetAlloc;
|
virDomainPCIAddressSetAlloc;
|
||||||
|
Loading…
Reference in New Issue
Block a user