提交 4908772e 编写于 作者: J John Ferlan

qemu: Introduce qemuBuildControllerDevCommandLine

Add new function to manage adding the controller -device options to the
command line removing that task from the mainline qemuBuildCommandLine.

Also adjust to using const virDomainDef instead of virDomainDefPtr.
This causes collateral damage in order to modify called APIs to use
the const virDomainDef instead as well.
Signed-off-by: NJohn Ferlan <jferlan@redhat.com>
上级 73379375
...@@ -13500,8 +13500,9 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def, ...@@ -13500,8 +13500,9 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
} }
int int
virDomainControllerFind(virDomainDefPtr def, virDomainControllerFind(const virDomainDef *def,
int type, int idx) int type,
int idx)
{ {
size_t i; size_t i;
...@@ -13529,8 +13530,9 @@ virDomainControllerFindUnusedIndex(virDomainDefPtr def, int type) ...@@ -13529,8 +13530,9 @@ virDomainControllerFindUnusedIndex(virDomainDefPtr def, int type)
const char * const char *
virDomainControllerAliasFind(virDomainDefPtr def, virDomainControllerAliasFind(const virDomainDef *def,
int type, int idx) int type,
int idx)
{ {
int contIndex; int contIndex;
const char *contTypeStr = virDomainControllerTypeToString(type); const char *contTypeStr = virDomainControllerTypeToString(type);
......
...@@ -2835,12 +2835,12 @@ int virDomainControllerInsert(virDomainDefPtr def, ...@@ -2835,12 +2835,12 @@ int virDomainControllerInsert(virDomainDefPtr def,
ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_RETURN_CHECK;
void virDomainControllerInsertPreAlloced(virDomainDefPtr def, void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
virDomainControllerDefPtr controller); virDomainControllerDefPtr controller);
int virDomainControllerFind(virDomainDefPtr def, int type, int idx); int virDomainControllerFind(const virDomainDef *def, int type, int idx);
int virDomainControllerFindByType(virDomainDefPtr def, int type); int virDomainControllerFindByType(virDomainDefPtr def, int type);
int virDomainControllerFindByPCIAddress(virDomainDefPtr def, int virDomainControllerFindByPCIAddress(virDomainDefPtr def,
virDevicePCIAddressPtr addr); virDevicePCIAddressPtr addr);
virDomainControllerDefPtr virDomainControllerRemove(virDomainDefPtr def, size_t i); virDomainControllerDefPtr virDomainControllerRemove(virDomainDefPtr def, size_t i);
const char *virDomainControllerAliasFind(virDomainDefPtr def, const char *virDomainControllerAliasFind(const virDomainDef *def,
int type, int idx) int type, int idx)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
......
...@@ -330,7 +330,7 @@ char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk, ...@@ -330,7 +330,7 @@ char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
static int static int
qemuBuildDeviceAddressStr(virBufferPtr buf, qemuBuildDeviceAddressStr(virBufferPtr buf,
virDomainDefPtr domainDef, const virDomainDef *domainDef,
virDomainDeviceInfoPtr info, virDomainDeviceInfoPtr info,
virQEMUCapsPtr qemuCaps) virQEMUCapsPtr qemuCaps)
{ {
...@@ -979,7 +979,7 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk) ...@@ -979,7 +979,7 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk)
* an error and return false; otherwise, return true. * an error and return false; otherwise, return true.
*/ */
bool bool
qemuCheckCCWS390AddressSupport(virDomainDefPtr def, qemuCheckCCWS390AddressSupport(const virDomainDef *def,
virDomainDeviceInfo info, virDomainDeviceInfo info,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
const char *devicename) const char *devicename)
...@@ -1958,7 +1958,7 @@ qemuControllerModelUSBToCaps(int model) ...@@ -1958,7 +1958,7 @@ qemuControllerModelUSBToCaps(int model)
static int static int
qemuBuildUSBControllerDevStr(virDomainDefPtr domainDef, qemuBuildUSBControllerDevStr(const virDomainDef *domainDef,
virDomainControllerDefPtr def, virDomainControllerDefPtr def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
virBuffer *buf) virBuffer *buf)
...@@ -1996,7 +1996,7 @@ qemuBuildUSBControllerDevStr(virDomainDefPtr domainDef, ...@@ -1996,7 +1996,7 @@ qemuBuildUSBControllerDevStr(virDomainDefPtr domainDef,
} }
char * char *
qemuBuildControllerDevStr(virDomainDefPtr domainDef, qemuBuildControllerDevStr(const virDomainDef *domainDef,
virDomainControllerDefPtr def, virDomainControllerDefPtr def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
int *nusbcontroller) int *nusbcontroller)
...@@ -2354,6 +2354,120 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, ...@@ -2354,6 +2354,120 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef,
} }
static int
qemuBuildControllerDevCommandLine(virCommandPtr cmd,
const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
size_t i, j;
int usbcontroller = 0;
bool usblegacy = false;
int contOrder[] = {
/*
* List of controller types that we add commandline args for,
* *in the order we want to add them*.
*
* The floppy controller is implicit on PIIX4 and older Q35
* machines. For newer Q35 machines it is added out of the
* controllers loop, after the floppy drives.
*
* We don't add PCI/PCIe root controller either, because it's
* implicit, but we do add PCI bridges and other PCI
* controllers, so we leave that in to check each
* one. Likewise, we don't do anything for the primary IDE
* controller on an i440fx machine or primary SATA on q35, but
* we do add those beyond these two exceptions.
*/
VIR_DOMAIN_CONTROLLER_TYPE_PCI,
VIR_DOMAIN_CONTROLLER_TYPE_USB,
VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
VIR_DOMAIN_CONTROLLER_TYPE_IDE,
VIR_DOMAIN_CONTROLLER_TYPE_SATA,
VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
VIR_DOMAIN_CONTROLLER_TYPE_CCID,
};
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
goto check_add_usb;
for (j = 0; j < ARRAY_CARDINALITY(contOrder); j++) {
for (i = 0; i < def->ncontrollers; i++) {
virDomainControllerDefPtr cont = def->controllers[i];
char *devstr;
if (cont->type != contOrder[j])
continue;
/* skip USB controllers with type none.*/
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) {
usbcontroller = -1; /* mark we don't want a controller */
continue;
}
/* skip pci-root/pcie-root */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
(cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT))
continue;
/* first SATA controller on Q35 machines is implicit */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA &&
cont->idx == 0 && qemuDomainMachineIsQ35(def))
continue;
/* first IDE controller is implicit on various machines */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
cont->idx == 0 && qemuDomainMachineHasBuiltinIDE(def))
continue;
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
cont->model == -1 &&
!qemuDomainMachineIsQ35(def)) {
bool need_legacy = false;
/* We're not using legacy usb controller for q35 */
if (ARCH_IS_PPC64(def->os.arch)) {
/* For ppc64 the legacy was OHCI */
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI))
need_legacy = true;
} else {
/* For anything else, we used PIIX3_USB_UHCI */
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI))
need_legacy = true;
}
if (need_legacy) {
if (usblegacy) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Multiple legacy USB controllers are "
"not supported"));
return -1;
}
usblegacy = true;
continue;
}
}
virCommandAddArg(cmd, "-device");
if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps,
&usbcontroller)))
return -1;
virCommandAddArg(cmd, devstr);
VIR_FREE(devstr);
}
}
check_add_usb:
if (usbcontroller == 0 &&
!qemuDomainMachineIsQ35(def) &&
!ARCH_IS_S390(def->os.arch))
virCommandAddArg(cmd, "-usb");
return 0;
}
/** /**
* qemuBuildMemoryBackendStr: * qemuBuildMemoryBackendStr:
* @size: size of the memory device in kibibytes * @size: size of the memory device in kibibytes
...@@ -7596,33 +7710,7 @@ qemuBuildCommandLine(virConnectPtr conn, ...@@ -7596,33 +7710,7 @@ qemuBuildCommandLine(virConnectPtr conn,
int last_good_net = -1; int last_good_net = -1;
virCommandPtr cmd = NULL; virCommandPtr cmd = NULL;
bool emitBootindex = false; bool emitBootindex = false;
int usbcontroller = 0;
int actualSerials = 0; int actualSerials = 0;
bool usblegacy = false;
int contOrder[] = {
/*
* List of controller types that we add commandline args for,
* *in the order we want to add them*.
*
* The floppy controller is implicit on PIIX4 and older Q35
* machines. For newer Q35 machines it is added out of the
* controllers loop, after the floppy drives.
*
* We don't add PCI/PCIe root controller either, because it's
* implicit, but we do add PCI bridges and other PCI
* controllers, so we leave that in to check each
* one. Likewise, we don't do anything for the primary IDE
* controller on an i440fx machine or primary SATA on q35, but
* we do add those beyond these two exceptions.
*/
VIR_DOMAIN_CONTROLLER_TYPE_PCI,
VIR_DOMAIN_CONTROLLER_TYPE_USB,
VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
VIR_DOMAIN_CONTROLLER_TYPE_IDE,
VIR_DOMAIN_CONTROLLER_TYPE_SATA,
VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL,
VIR_DOMAIN_CONTROLLER_TYPE_CCID,
};
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virBuffer fdc_opts = VIR_BUFFER_INITIALIZER; virBuffer fdc_opts = VIR_BUFFER_INITIALIZER;
char *fdc_opts_str = NULL; char *fdc_opts_str = NULL;
...@@ -7733,80 +7821,8 @@ qemuBuildCommandLine(virConnectPtr conn, ...@@ -7733,80 +7821,8 @@ qemuBuildCommandLine(virConnectPtr conn,
if (qemuBuildGlobalControllerCommandLine(cmd, def, qemuCaps) < 0) if (qemuBuildGlobalControllerCommandLine(cmd, def, qemuCaps) < 0)
goto error; goto error;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { if (qemuBuildControllerDevCommandLine(cmd, def, qemuCaps) < 0)
for (j = 0; j < ARRAY_CARDINALITY(contOrder); j++) { goto error;
for (i = 0; i < def->ncontrollers; i++) {
virDomainControllerDefPtr cont = def->controllers[i];
char *devstr;
if (cont->type != contOrder[j])
continue;
/* skip USB controllers with type none.*/
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
cont->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) {
usbcontroller = -1; /* mark we don't want a controller */
continue;
}
/* skip pci-root/pcie-root */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
(cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT ||
cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT))
continue;
/* first SATA controller on Q35 machines is implicit */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA &&
cont->idx == 0 && qemuDomainMachineIsQ35(def))
continue;
/* first IDE controller is implicit on various machines */
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
cont->idx == 0 && qemuDomainMachineHasBuiltinIDE(def))
continue;
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
cont->model == -1 &&
!qemuDomainMachineIsQ35(def)) {
bool need_legacy = false;
/* We're not using legacy usb controller for q35 */
if (ARCH_IS_PPC64(def->os.arch)) {
/* For ppc64 the legacy was OHCI */
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI))
need_legacy = true;
} else {
/* For anything else, we used PIIX3_USB_UHCI */
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI))
need_legacy = true;
}
if (need_legacy) {
if (usblegacy) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Multiple legacy USB controllers are "
"not supported"));
goto error;
}
usblegacy = true;
continue;
}
}
virCommandAddArg(cmd, "-device");
if (!(devstr = qemuBuildControllerDevStr(def, cont, qemuCaps,
&usbcontroller)))
goto error;
virCommandAddArg(cmd, devstr);
VIR_FREE(devstr);
}
}
}
if (usbcontroller == 0 &&
!qemuDomainMachineIsQ35(def) &&
!ARCH_IS_S390(def->os.arch))
virCommandAddArg(cmd, "-usb");
for (i = 0; i < def->nhubs; i++) { for (i = 0; i < def->nhubs; i++) {
virDomainHubDefPtr hub = def->hubs[i]; virDomainHubDefPtr hub = def->hubs[i];
......
...@@ -129,7 +129,7 @@ char *qemuBuildFSDevStr(virDomainDefPtr domainDef, ...@@ -129,7 +129,7 @@ char *qemuBuildFSDevStr(virDomainDefPtr domainDef,
virDomainFSDefPtr fs, virDomainFSDefPtr fs,
virQEMUCapsPtr qemuCaps); virQEMUCapsPtr qemuCaps);
/* Current, best practice */ /* Current, best practice */
char *qemuBuildControllerDevStr(virDomainDefPtr domainDef, char *qemuBuildControllerDevStr(const virDomainDef *domainDef,
virDomainControllerDefPtr def, virDomainControllerDefPtr def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
int *nusbcontroller); int *nusbcontroller);
...@@ -228,7 +228,7 @@ int qemuCheckDiskConfig(virDomainDiskDefPtr disk); ...@@ -228,7 +228,7 @@ int qemuCheckDiskConfig(virDomainDiskDefPtr disk);
bool bool
qemuCheckFips(void); qemuCheckFips(void);
bool qemuCheckCCWS390AddressSupport(virDomainDefPtr def, bool qemuCheckCCWS390AddressSupport(const virDomainDef *def,
virDomainDeviceInfo info, virDomainDeviceInfo info,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
const char *devicename); const char *devicename);
......
...@@ -40,7 +40,7 @@ VIR_LOG_INIT("qemu.qemu_domain_address"); ...@@ -40,7 +40,7 @@ VIR_LOG_INIT("qemu.qemu_domain_address");
int int
qemuDomainSetSCSIControllerModel(virDomainDefPtr def, qemuDomainSetSCSIControllerModel(const virDomainDef *def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
int *model) int *model)
{ {
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
# include "domain_conf.h" # include "domain_conf.h"
# include "qemu_capabilities.h" # include "qemu_capabilities.h"
int qemuDomainSetSCSIControllerModel(virDomainDefPtr def, int qemuDomainSetSCSIControllerModel(const virDomainDef *def,
virQEMUCapsPtr qemuCaps, virQEMUCapsPtr qemuCaps,
int *model); int *model);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册