From nobody Thu May 15 20:44:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1506008712788288.58722045837976; Thu, 21 Sep 2017 08:45:12 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1407EC047B82; Thu, 21 Sep 2017 15:45:11 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DA28B5D964; Thu, 21 Sep 2017 15:45:10 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 94B83410B4; Thu, 21 Sep 2017 15:45:10 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v8LEldMj014696 for ; Thu, 21 Sep 2017 10:47:39 -0400 Received: by smtp.corp.redhat.com (Postfix) id 43037600C2; Thu, 21 Sep 2017 14:47:39 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id BFC4F5C7A2 for ; Thu, 21 Sep 2017 14:47:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1407EC047B82 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Thu, 21 Sep 2017 16:47:08 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v1 4/7] qemu: Allow regeneration of aliases X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 21 Sep 2017 15:45:11 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" In the near future the qemuAssignDeviceAliases() function is going to be called multiple times: once at the domain define time, then in domain prepare phase. To avoid regenerating the same aliases the second time we need to be able to tell the function which time it is being called. Signed-off-by: Michal Privoznik --- src/qemu/qemu_alias.c | 113 ++++++++++++++++++++++++++++++++++++++++++++= ++-- src/qemu/qemu_alias.h | 4 +- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_process.c | 2 +- tests/qemuhotplugtest.c | 2 +- 5 files changed, 115 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index e1431e2a2..00868c50f 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -481,25 +481,99 @@ qemuAssignDeviceShmemAlias(virDomainDefPtr def, } =20 =20 +/* + * qemuAssignDeviceAliases: + * @def: domain definition + * @qemuCaps: qemu capabilities + * @regenerate: forcibly regenerate aliases + * + * Assign aliases to domain devices. If @regenerate is false only + * the missing aliases are generated leaving already assigned + * aliases untouched. If @regenerate is true any preexisting + * aliases are overwritten. + * + * Returns 0 on success, -1 otherwise. + */ int -qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) +qemuAssignDeviceAliases(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + bool regenerate) { size_t i; =20 + if (regenerate) { + /* If we need to regenerate the aliases, we have to free + * them all upfront because there are some dependencies, + * e.g. an interface can be a hostdev and so on. + * Therefore, if we'd do the freeing in the loop below we + * might not start from zero. */ + for (i =3D 0; i < def->ndisks; i++) + VIR_FREE(def->disks[i]->info.alias); + for (i =3D 0; i < def->nnets; i++) + VIR_FREE(def->nets[i]->info.alias); + for (i =3D 0; i < def->nfss; i++) + VIR_FREE(def->fss[i]->info.alias); + for (i =3D 0; i < def->nsounds; i++) + VIR_FREE(def->sounds[i]->info.alias); + for (i =3D 0; i < def->nhostdevs; i++) + VIR_FREE(def->hostdevs[i]->info->alias); + for (i =3D 0; i < def->nredirdevs; i++) + VIR_FREE(def->redirdevs[i]->info.alias); + for (i =3D 0; i < def->nvideos; i++) + VIR_FREE(def->videos[i]->info.alias); + for (i =3D 0; i < def->ncontrollers; i++) + VIR_FREE(def->controllers[i]->info.alias); + for (i =3D 0; i < def->ninputs; i++) + VIR_FREE(def->inputs[i]->info.alias); + for (i =3D 0; i < def->nparallels; i++) + VIR_FREE(def->parallels[i]->info.alias); + for (i =3D 0; i < def->nserials; i++) + VIR_FREE(def->serials[i]->info.alias); + for (i =3D 0; i < def->nchannels; i++) + VIR_FREE(def->channels[i]->info.alias); + for (i =3D 0; i < def->nconsoles; i++) + VIR_FREE(def->consoles[i]->info.alias); + for (i =3D 0; i < def->nhubs; i++) + VIR_FREE(def->hubs[i]->info.alias); + for (i =3D 0; i < def->nshmems; i++) + VIR_FREE(def->shmems[i]->info.alias); + for (i =3D 0; i < def->nsmartcards; i++) + VIR_FREE(def->smartcards[i]->info.alias); + if (def->watchdog) + VIR_FREE(def->watchdog->info.alias); + if (def->memballoon) + VIR_FREE(def->memballoon->info.alias); + for (i =3D 0; i < def->nrngs; i++) + VIR_FREE(def->rngs[i]->info.alias); + if (def->tpm) + VIR_FREE(def->tpm->info.alias); + for (i =3D 0; i < def->nmems; i++) + VIR_FREE(def->mems[i]->info.alias); + } + + for (i =3D 0; i < def->ndisks; i++) { + if (def->disks[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceDiskAlias(def, def->disks[i], qemuCaps) < 0) return -1; } for (i =3D 0; i < def->nnets; i++) { + if (def->nets[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceNetAlias(def, def->nets[i], -1) < 0) return -1; } =20 for (i =3D 0; i < def->nfss; i++) { + if (def->fss[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceFSAlias(def->fss[i], i) < 0) return -1; } for (i =3D 0; i < def->nsounds; i++) { + if (def->sounds[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceSoundAlias(def->sounds[i], i) < 0) return -1; } @@ -509,71 +583,102 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMU= CapsPtr qemuCaps) * linked to a NetDef, they will share an info and the alias * will already be set, so don't try to set it again. */ + if (def->hostdevs[i]->info->alias && !regenerate) + continue; if (!def->hostdevs[i]->info->alias && qemuAssignDeviceHostdevAlias(def, &def->hostdevs[i]->info->ali= as, -1) < 0) return -1; } for (i =3D 0; i < def->nredirdevs; i++) { + if (def->redirdevs[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceRedirdevAlias(def, def->redirdevs[i], i) < 0) return -1; } for (i =3D 0; i < def->nvideos; i++) { + if (def->videos[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceVideoAlias(def->videos[i], i) < 0) return -1; } for (i =3D 0; i < def->ncontrollers; i++) { + if (def->controllers[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceControllerAlias(def, qemuCaps, def->controller= s[i]) < 0) return -1; } for (i =3D 0; i < def->ninputs; i++) { + if (def->inputs[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceInputAlias(def->inputs[i], i) < 0) return -1; } for (i =3D 0; i < def->nparallels; i++) { + if (def->parallels[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceChrAlias(def, def->parallels[i], i) < 0) return -1; } for (i =3D 0; i < def->nserials; i++) { + if (def->serials[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceChrAlias(def, def->serials[i], i) < 0) return -1; } for (i =3D 0; i < def->nchannels; i++) { + if (def->channels[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceChrAlias(def, def->channels[i], i) < 0) return -1; } for (i =3D 0; i < def->nconsoles; i++) { + if (def->consoles[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceChrAlias(def, def->consoles[i], i) < 0) return -1; } for (i =3D 0; i < def->nhubs; i++) { + if (def->hubs[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceHubAlias(def->hubs[i], i) < 0) return -1; } for (i =3D 0; i < def->nshmems; i++) { + if (def->shmems[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceShmemAlias(def, def->shmems[i], i) < 0) return -1; } for (i =3D 0; i < def->nsmartcards; i++) { + if (def->smartcards[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceSmartcardAlias(def->smartcards[i], i) < 0) return -1; } - if (def->watchdog) { + if (def->watchdog && + (!def->watchdog->info.alias || regenerate)) { if (qemuAssignDeviceWatchdogAlias(def->watchdog, 0) < 0) return -1; } - if (def->memballoon) { + if (def->memballoon && + (!def->memballoon->info.alias || regenerate)) { if (qemuAssingDeviceMemballoonAlias(def->memballoon, 0) < 0) return -1; } for (i =3D 0; i < def->nrngs; i++) { + if (def->rngs[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceRNGAlias(def, def->rngs[i], i) < 0) return -1; } - if (def->tpm) { + if (def->tpm && + (!def->tpm->info.alias || regenerate)) { if (qemuAssignDeviceTPMAlias(def->tpm, 0) < 0) return -1; } for (i =3D 0; i < def->nmems; i++) { + if (def->mems[i]->info.alias && !regenerate) + continue; if (qemuAssignDeviceMemoryAlias(NULL, def->mems[i], false) < 0) return -1; } diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h index 860ab6c0c..e33a05580 100644 --- a/src/qemu/qemu_alias.h +++ b/src/qemu/qemu_alias.h @@ -66,7 +66,9 @@ int qemuAssignDeviceShmemAlias(virDomainDefPtr def, virDomainShmemDefPtr shmem, int idx); =20 -int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps); +int qemuAssignDeviceAliases(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + bool regenerate); =20 int qemuDomainDeviceAliasIndex(const virDomainDeviceInfo *info, const char *prefix); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1b271792d..64ba7d454 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16145,7 +16145,7 @@ static virDomainPtr qemuDomainQemuAttach(virConnect= Ptr conn, def->emulator))) goto cleanup; =20 - if (qemuAssignDeviceAliases(def, qemuCaps) < 0) + if (qemuAssignDeviceAliases(def, qemuCaps, true) < 0) goto cleanup; =20 if (!(vm =3D virDomainObjListAdd(driver->domains, def, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e6cc41e13..448de679c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5340,7 +5340,7 @@ qemuProcessPrepareDomain(virConnectPtr conn, goto cleanup; } =20 - if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0) + if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps, false) < 0) goto cleanup; =20 VIR_DEBUG("Setting graphics devices"); diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 23a498617..0b1b00176 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -95,7 +95,7 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, goto cleanup; } =20 - if (qemuAssignDeviceAliases((*vm)->def, priv->qemuCaps) < 0) + if (qemuAssignDeviceAliases((*vm)->def, priv->qemuCaps, true) < 0) goto cleanup; =20 (*vm)->def->id =3D QEMU_HOTPLUG_TEST_DOMAIN_ID; --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list