goto cleanup;
}
- if (qemuDomainAssignAddresses(def, qemuCaps, NULL, newDomain) < 0)
+ if (qemuDomainAssignAddresses(def, qemuCaps, driver, NULL, newDomain) < 0)
goto cleanup;
ret = 0;
*/
static virDomainPCIConnectFlags
qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
+ virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
virDomainPCIConnectFlags pcieFlags,
virDomainPCIConnectFlags virtioFlags)
{
typedef struct {
virDomainPCIConnectFlags virtioFlags;
virDomainPCIConnectFlags pcieFlags;
+ virQEMUDriverPtr driver;
} qemuDomainFillDevicePCIConnectFlagsIterData;
static void
qemuDomainFillDevicePCIConnectFlagsIterInit(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver,
qemuDomainFillDevicePCIConnectFlagsIterData *data)
{
+
+ data->driver = driver;
+
if (qemuDomainMachineHasPCIeRoot(def)) {
data->pcieFlags = (VIR_PCI_CONNECT_TYPE_PCIE_DEVICE |
VIR_PCI_CONNECT_HOTPLUGGABLE);
qemuDomainFillDevicePCIConnectFlagsIterData *data = opaque;
info->pciConnectFlags
- = qemuDomainDeviceCalculatePCIConnectFlags(dev, data->pcieFlags,
+ = qemuDomainDeviceCalculatePCIConnectFlags(dev, data->driver,
+ data->pcieFlags,
data->virtioFlags);
return 0;
}
*/
static int
qemuDomainFillAllPCIConnectFlags(virDomainDefPtr def,
- virQEMUCapsPtr qemuCaps)
+ virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver)
{
qemuDomainFillDevicePCIConnectFlagsIterData data;
- qemuDomainFillDevicePCIConnectFlagsIterInit(def, qemuCaps, &data);
+ qemuDomainFillDevicePCIConnectFlagsIterInit(def, qemuCaps, driver, &data);
return virDomainDeviceInfoIterate(def,
qemuDomainFillDevicePCIConnectFlagsIter,
static void
qemuDomainFillDevicePCIConnectFlags(virDomainDefPtr def,
virDomainDeviceDefPtr dev,
- virQEMUCapsPtr qemuCaps)
+ virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver)
{
virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev);
*/
qemuDomainFillDevicePCIConnectFlagsIterData data;
- qemuDomainFillDevicePCIConnectFlagsIterInit(def, qemuCaps, &data);
+ qemuDomainFillDevicePCIConnectFlagsIterInit(def, qemuCaps, driver, &data);
info->pciConnectFlags
- = qemuDomainDeviceCalculatePCIConnectFlags(dev, data.pcieFlags,
+ = qemuDomainDeviceCalculatePCIConnectFlags(dev, data.driver,
+ data.pcieFlags,
data.virtioFlags);
}
}
static int
qemuDomainAssignPCIAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver,
virDomainObjPtr obj)
{
int ret = -1;
* of all devices. This will be used to pick an appropriate
* bus when assigning addresses.
*/
- if (qemuDomainFillAllPCIConnectFlags(def, qemuCaps) < 0)
+ if (qemuDomainFillAllPCIConnectFlags(def, qemuCaps, driver) < 0)
goto cleanup;
if (nbuses > 0 &&
dev.type = VIR_DOMAIN_DEVICE_CONTROLLER;
dev.data.controller = def->controllers[contIndex];
/* set connect flags so it will be properly addressed */
- qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps);
+ qemuDomainFillDevicePCIConnectFlags(def, &dev, qemuCaps, driver);
if (qemuDomainPCIAddressReserveNextSlot(addrs,
&dev.data.controller->info) < 0)
goto cleanup;
int
qemuDomainAssignAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver,
virDomainObjPtr obj,
bool newDomain)
{
qemuDomainAssignARMVirtioMMIOAddresses(def, qemuCaps);
- if (qemuDomainAssignPCIAddresses(def, qemuCaps, obj) < 0)
+ if (qemuDomainAssignPCIAddresses(def, qemuCaps, driver, obj) < 0)
return -1;
if (qemuDomainAssignUSBAddresses(def, obj, newDomain) < 0)
*/
int
qemuDomainEnsurePCIAddress(virDomainObjPtr obj,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ virQEMUDriverPtr driver)
{
qemuDomainObjPrivatePtr priv = obj->privateData;
virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev);
if (!info)
return 0;
- qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps);
+ qemuDomainFillDevicePCIConnectFlags(obj->def, dev, priv->qemuCaps, driver);
return virDomainPCIAddressEnsureAddr(priv->pciaddrs, info,
info->pciConnectFlags);
# include "domain_addr.h"
# include "domain_conf.h"
+# include "qemu_conf.h"
# include "qemu_capabilities.h"
int qemuDomainSetSCSIControllerModel(const virDomainDef *def,
int qemuDomainAssignAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
+ virQEMUDriverPtr driver,
virDomainObjPtr obj,
bool newDomain)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
int qemuDomainEnsurePCIAddress(virDomainObjPtr obj,
- virDomainDeviceDefPtr dev)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+ virDomainDeviceDefPtr dev,
+ virQEMUDriverPtr driver)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
void qemuDomainReleaseDeviceAddress(virDomainObjPtr vm,
virDomainDeviceInfoPtr info,
goto error;
} else if (!disk->info.type ||
disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
goto error;
}
releaseaddr = true;
if (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
goto cleanup;
} else if (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
if (!(ccwaddrs = qemuDomainCCWAddrSetCreateFromDomain(vm->def)))
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("virtio-s390 net device cannot be hotplugged."));
goto cleanup;
- } else if (qemuDomainEnsurePCIAddress(vm, &dev) < 0) {
+ } else if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0) {
goto cleanup;
}
if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
goto error;
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
goto error;
releaseaddr = true;
if (backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO &&
*/
static int
qemuDomainAttachChrDeviceAssignAddr(virDomainObjPtr vm,
- virDomainChrDefPtr chr)
+ virDomainChrDefPtr chr,
+ virQEMUDriverPtr driver)
{
virDomainDefPtr def = vm->def;
qemuDomainObjPrivatePtr priv = vm->privateData;
} else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI) {
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
return -1;
return 1;
if (qemuAssignDeviceChrAlias(vmdef, chr, -1) < 0)
goto cleanup;
- if ((rc = qemuDomainAttachChrDeviceAssignAddr(vm, chr)) < 0)
+ if ((rc = qemuDomainAttachChrDeviceAssignAddr(vm, chr, driver)) < 0)
goto cleanup;
if (rc == 1)
need_release = true;
if (rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
goto cleanup;
} else if (rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
if (!(ccwaddrs = qemuDomainCCWAddrSetCreateFromDomain(vm->def)))
if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
- if (qemuDomainEnsurePCIAddress(vm, &dev) < 0)
+ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0)
goto cleanup;
} else if (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) {
if (!(ccwaddrs = qemuDomainCCWAddrSetCreateFromDomain(vm->def)))
if ((shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
shmem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) &&
- (qemuDomainEnsurePCIAddress(vm, &dev) < 0))
+ (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0))
return -1;
if (!(shmstr = qemuBuildShmemDevStr(vm->def, shmem, priv->qemuCaps)))
goto cleanup;
}
- if ((qemuDomainAssignAddresses(obj->def, priv->qemuCaps, obj, false)) < 0)
+ if ((qemuDomainAssignAddresses(obj->def, priv->qemuCaps,
+ driver, obj, false)) < 0) {
goto error;
+ }
/* if domain requests security driver we haven't loaded, report error, but
* do not kill the domain
* use in hotplug
*/
VIR_DEBUG("Assigning domain PCI addresses");
- if ((qemuDomainAssignAddresses(vm->def, priv->qemuCaps, vm,
- !!(flags & VIR_QEMU_PROCESS_START_NEW))) < 0)
+ if ((qemuDomainAssignAddresses(vm->def, priv->qemuCaps, driver, vm,
+ !!(flags & VIR_QEMU_PROCESS_START_NEW))) < 0) {
goto cleanup;
+ }
if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
goto cleanup;
* use in hotplug
*/
VIR_DEBUG("Assigning domain PCI addresses");
- if ((qemuDomainAssignAddresses(vm->def, priv->qemuCaps, vm, false)) < 0)
+ if ((qemuDomainAssignAddresses(vm->def, priv->qemuCaps,
+ driver, vm, false)) < 0) {
goto error;
+ }
if ((timestamp = virTimeStringNow()) == NULL)
goto error;
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
goto cleanup;
- if (qemuDomainAssignAddresses((*vm)->def, priv->qemuCaps, *vm, true) < 0)
+ if (qemuDomainAssignAddresses((*vm)->def, priv->qemuCaps,
+ &driver, *vm, true) < 0) {
goto cleanup;
+ }
if (qemuAssignDeviceAliases((*vm)->def, priv->qemuCaps) < 0)
goto cleanup;