[libvirt] [PATCHv3 1/5] qemu: Extended qemuDomainAssignAddresses to be callable from everywhere.
Michal Privoznik
mprivozn at redhat.com
Tue Jul 3 16:18:22 UTC 2012
On 29.06.2012 17:02, Viktor Mihajlovski wrote:
> This is in preparation of the enablement of s390 guests with virtio devices.
>
> The assignment of device addresses happens in different places, i.e. the
> qemu driver and process modules as well as in the unit tests in slightly
> different flavors. Currently, these are PPC spapr-vio and PCI
> devices, virtio-s390 (not PCI based) will follow.
>
> By optionally passing to qemuDomainAssignAddresses the domain
> object and the capabilities it is now possible to call the function
> from most of the places (except for hotplug) where address assignment
> is done.
>
> Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> ---
> src/qemu/qemu_command.c | 41 ++++++++++++++++++++++++++++++++---------
> src/qemu/qemu_command.h | 6 ++++--
> src/qemu/qemu_driver.c | 14 +++++++-------
> src/qemu/qemu_process.c | 42 ++++--------------------------------------
> 4 files changed, 47 insertions(+), 56 deletions(-)
Nice cleanup.
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 6549f57..5edf915 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -942,16 +942,22 @@ cleanup:
>
>
> int
> -qemuDomainAssignPCIAddresses(virDomainDefPtr def)
> +qemuDomainAssignPCIAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
> + virDomainObjPtr obj)
Even though this is still less than 80 characters, I think we could have each argument per separate line.
> {
> int ret = -1;
> - virBitmapPtr qemuCaps = NULL;
> + virBitmapPtr localCaps = NULL;
> qemuDomainPCIAddressSetPtr addrs = NULL;
> + qemuDomainObjPrivatePtr priv = NULL;
>
> - if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
> - NULL,
> - &qemuCaps) < 0)
> - goto cleanup;
> + if (!qemuCaps) {
> + /* need to get information from real environment */
> + if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
> + NULL,
> + &localCaps) < 0)
> + goto cleanup;
> + qemuCaps = localCaps;
> + }
>
> if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> if (!(addrs = qemuDomainPCIAddressSetCreate(def)))
> @@ -961,16 +967,33 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def)
> goto cleanup;
> }
>
> + if (obj && obj->privateData) {
> + priv = obj->privateData;
> + if (addrs) {
> + /* if this is the live domain object, we persist the PCI addresses*/
> + if (priv->pciaddrs) {
> + qemuDomainPCIAddressSetFree(priv->pciaddrs);
> + priv->pciaddrs = NULL;
> + }
qemuDomainPCIAddressSetFree() handles passed NULL, so this check is redundant.
> + priv->persistentAddrs = 1;
> + priv->pciaddrs = addrs;
> + addrs = NULL;
> + } else {
> + priv->persistentAddrs = 0;
> + }
> + }
> +
> ret = 0;
>
> cleanup:
> - qemuCapsFree(qemuCaps);
> + qemuCapsFree(localCaps);
> qemuDomainPCIAddressSetFree(addrs);
>
> return ret;
> }
>
> -int qemuDomainAssignAddresses(virDomainDefPtr def)
> +int qemuDomainAssignAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
> + virDomainObjPtr obj)
Again. I'd prefer to have each argument on a separate line...
> {
> int rc;
>
> @@ -978,7 +1001,7 @@ int qemuDomainAssignAddresses(virDomainDefPtr def)
> if (rc)
> return rc;
>
> - return qemuDomainAssignPCIAddresses(def);
> + return qemuDomainAssignPCIAddresses(def, qemuCaps, obj);
> }
>
> static void
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 1eafeb3..dd104d6 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -175,10 +175,12 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
> virDomainChrSourceDefPtr *monConfig,
> bool *monJSON);
>
> -int qemuDomainAssignAddresses(virDomainDefPtr def);
> +int qemuDomainAssignAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
> + virDomainObjPtr);
> int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def);
>
> -int qemuDomainAssignPCIAddresses(virDomainDefPtr def);
> +int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
> + virDomainObjPtr obj);
> qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def);
... and same here.
> int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs,
> int slot, int function);
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 2f93404..ef9983c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1404,7 +1404,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
> if (qemudCanonicalizeMachine(driver, def) < 0)
> goto cleanup;
>
> - if (qemuDomainAssignAddresses(def) < 0)
> + if (qemuDomainAssignAddresses(def, NULL, NULL) < 0)
> goto cleanup;
>
> if (!(vm = virDomainAssignDef(driver->caps,
> @@ -5070,7 +5070,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
> if (qemudCanonicalizeMachine(driver, def) < 0)
> goto cleanup;
>
> - if (qemuDomainAssignAddresses(def) < 0)
> + if (qemuDomainAssignAddresses(def, NULL, NULL) < 0)
> goto cleanup;
>
> if (!(vm = virDomainAssignDef(driver->caps,
> @@ -5548,7 +5548,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
> if (disk->bus != VIR_DOMAIN_DISK_BUS_VIRTIO)
> if (virDomainDefAddImplicitControllers(vmdef) < 0)
> return -1;
> - if (qemuDomainAssignAddresses(vmdef) < 0)
> + if (qemuDomainAssignAddresses(vmdef, NULL, NULL) < 0)
> return -1;
> break;
>
> @@ -5566,7 +5566,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
> return -1;
> }
> dev->data.net = NULL;
> - if (qemuDomainAssignAddresses(vmdef) < 0)
> + if (qemuDomainAssignAddresses(vmdef, NULL, NULL) < 0)
> return -1;
> break;
>
> @@ -5582,7 +5582,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef,
> return -1;
> }
> dev->data.hostdev = NULL;
> - if (qemuDomainAssignAddresses(vmdef) < 0)
> + if (qemuDomainAssignAddresses(vmdef, NULL, NULL) < 0)
> return -1;
> break;
>
> @@ -5736,7 +5736,7 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef,
> vmdef->nets[pos] = net;
> dev->data.net = NULL;
>
> - if (qemuDomainAssignAddresses(vmdef) < 0)
> + if (qemuDomainAssignAddresses(vmdef, NULL, NULL) < 0)
> return -1;
> break;
>
> @@ -11734,7 +11734,7 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
> if (qemudCanonicalizeMachine(driver, def) < 0)
> goto cleanup;
>
> - if (qemuDomainAssignAddresses(def) < 0)
> + if (qemuDomainAssignAddresses(def, NULL, NULL) < 0)
> goto cleanup;
>
> if (!(vm = virDomainAssignDef(driver->caps,
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index c5140c3..bf32487 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3090,13 +3090,8 @@ qemuProcessReconnect(void *opaque)
> goto endjob;
> }
>
> - if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
> - priv->persistentAddrs = 1;
> -
> - if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(obj->def)) ||
> - qemuAssignDevicePCISlots(obj->def, priv->pciaddrs) < 0)
> - goto error;
> - }
> + if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE))
> + qemuDomainAssignAddresses(obj->def, priv->qemuCaps, obj);
>
> if (virSecurityManagerReserveLabel(driver->securityManager, obj->def, obj->pid) < 0)
> goto error;
> @@ -3560,22 +3555,7 @@ int qemuProcessStart(virConnectPtr conn,
> */
> if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
> VIR_DEBUG("Assigning domain PCI addresses");
> - /* Populate cache with current addresses */
> - if (priv->pciaddrs) {
> - qemuDomainPCIAddressSetFree(priv->pciaddrs);
> - priv->pciaddrs = NULL;
> - }
> - if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(vm->def)))
> - goto cleanup;
> -
> -
> - /* Assign any remaining addresses */
> - if (qemuAssignDevicePCISlots(vm->def, priv->pciaddrs) < 0)
> - goto cleanup;
> -
> - priv->persistentAddrs = 1;
> - } else {
> - priv->persistentAddrs = 0;
> + qemuDomainAssignAddresses(vm->def, priv->qemuCaps, vm);
> }
>
> VIR_DEBUG("Building emulator command line");
> @@ -4257,21 +4237,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
> */
> if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
> VIR_DEBUG("Assigning domain PCI addresses");
> - /* Populate cache with current addresses */
> - if (priv->pciaddrs) {
> - qemuDomainPCIAddressSetFree(priv->pciaddrs);
> - priv->pciaddrs = NULL;
> - }
> - if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(vm->def)))
> - goto cleanup;
> -
> - /* Assign any remaining addresses */
> - if (qemuAssignDevicePCISlots(vm->def, priv->pciaddrs) < 0)
> - goto cleanup;
> -
> - priv->persistentAddrs = 1;
> - } else {
> - priv->persistentAddrs = 0;
> + qemuDomainAssignAddresses(vm->def, priv->qemuCaps, vm);
> }
>
> if ((timestamp = virTimeStringNow()) == NULL) {
>
ACK with this squashed in:
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a6fc9ca..bcc2192 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -942,7 +942,8 @@ cleanup:
int
-qemuDomainAssignPCIAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
+qemuDomainAssignPCIAddresses(virDomainDefPtr def,
+ virBitmapPtr qemuCaps,
virDomainObjPtr obj)
{
int ret = -1;
@@ -971,10 +972,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
priv = obj->privateData;
if (addrs) {
/* if this is the live domain object, we persist the PCI addresses*/
- if (priv->pciaddrs) {
- qemuDomainPCIAddressSetFree(priv->pciaddrs);
- priv->pciaddrs = NULL;
- }
+ qemuDomainPCIAddressSetFree(priv->pciaddrs);
priv->persistentAddrs = 1;
priv->pciaddrs = addrs;
addrs = NULL;
@@ -992,7 +990,8 @@ cleanup:
return ret;
}
-int qemuDomainAssignAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
+int qemuDomainAssignAddresses(virDomainDefPtr def,
+ virBitmapPtr qemuCaps,
virDomainObjPtr obj)
{
int rc;
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index dd104d6..ddf426f 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -175,11 +175,13 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
virDomainChrSourceDefPtr *monConfig,
bool *monJSON);
-int qemuDomainAssignAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
+int qemuDomainAssignAddresses(virDomainDefPtr def,
+ virBitmapPtr qemuCaps,
virDomainObjPtr);
int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def);
-int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virBitmapPtr qemuCaps,
+int qemuDomainAssignPCIAddresses(virDomainDefPtr def,
+ virBitmapPtr qemuCaps,
virDomainObjPtr obj);
qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def);
int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs,
Michal
More information about the libvir-list
mailing list