From nobody Thu May 15 00:58:08 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 1513788500919964.3653052119421; Wed, 20 Dec 2017 08:48:20 -0800 (PST) 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 CEE564903B; Wed, 20 Dec 2017 16:48:18 +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 A9EF818E40; Wed, 20 Dec 2017 16:48:18 +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 75C653FCF9; Wed, 20 Dec 2017 16:48:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vBKGm9Hf008478 for ; Wed, 20 Dec 2017 11:48:09 -0500 Received: by smtp.corp.redhat.com (Postfix) id 4A24960C29; Wed, 20 Dec 2017 16:48:09 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.42.22.189]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9510C18E54; Wed, 20 Dec 2017 16:48:05 +0000 (UTC) From: "Daniel P. Berrange" To: libvir-list@redhat.com Date: Wed, 20 Dec 2017 16:47:49 +0000 Message-Id: <20171220164750.26419-5-berrange@redhat.com> In-Reply-To: <20171220164750.26419-1-berrange@redhat.com> References: <20171220164750.26419-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Cc: Martin Kletzander , David Vossel , Fabian Deutsch Subject: [libvirt] [PATCH 4/5] qemu: implement the new virDomainQemuReconnect method 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.38]); Wed, 20 Dec 2017 16:48:19 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Daniel P. Berrange --- src/qemu/qemu_driver.c | 57 +++++++++++++++++++++++++++++++++++++++++++++= ++++ src/qemu/qemu_process.c | 31 ++++++++++++++++++--------- src/qemu/qemu_process.h | 1 + 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 97b194b057..fea1f24250 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16300,6 +16300,62 @@ static virDomainPtr qemuDomainQemuAttach(virConnec= tPtr conn, } =20 =20 +static virDomainPtr qemuDomainQemuReconnect(virConnectPtr conn, + const char *name, + unsigned int flags) +{ + virQEMUDriverPtr driver =3D conn->privateData; + virDomainObjPtr vm =3D NULL; + virDomainPtr dom =3D NULL; + virCapsPtr caps =3D NULL; + virQEMUDriverConfigPtr cfg; + + virCheckFlags(0, NULL); + + cfg =3D virQEMUDriverGetConfig(driver); + + if (strchr(name, '/')) { + virReportError(VIR_ERR_XML_ERROR, + _("name %s cannot contain '/'"), name); + goto cleanup; + } + + vm =3D virDomainObjListFindByName(driver->domains, name); + if (vm) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("Domain '%s' already exists"), name); + goto cleanup; + } + + if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) + goto cleanup; + + if (!(vm =3D virDomainObjListLoadStatus(driver->domains, + cfg->stateDir, + name, + caps, + driver->xmlopt, + NULL, NULL))) { + goto cleanup; + } + + if (virDomainQemuReconnectEnsureACL(conn, vm->def) < 0) { + qemuDomainRemoveInactive(driver, vm); + goto cleanup; + } + + dom =3D virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); + + qemuDomainObjEndJob(driver, vm); + + cleanup: + virDomainObjEndAPI(&vm); + virObjectUnref(caps); + virObjectUnref(cfg); + return dom; +} + + static int qemuDomainOpenConsole(virDomainPtr dom, const char *dev_name, @@ -21262,6 +21318,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainSnapshotDelete =3D qemuDomainSnapshotDelete, /* 0.8.0 */ .domainQemuMonitorCommand =3D qemuDomainQemuMonitorCommand, /* 0.8.3 */ .domainQemuAttach =3D qemuDomainQemuAttach, /* 0.9.4 */ + .domainQemuReconnect =3D qemuDomainQemuReconnect, /* 4.1.0 */ .domainQemuAgentCommand =3D qemuDomainQemuAgentCommand, /* 0.10.0 */ .connectDomainQemuMonitorEventRegister =3D qemuConnectDomainQemuMonito= rEventRegister, /* 1.2.3 */ .connectDomainQemuMonitorEventDeregister =3D qemuConnectDomainQemuMoni= torEventDeregister, /* 1.2.3 */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index a0f430f89f..ea924cf9b6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7088,14 +7088,10 @@ struct qemuProcessReconnectData { * We can't do normal MonitorEnter & MonitorExit because these two lock the * monitor lock, which does not exists in this early phase. */ -static void -qemuProcessReconnect(void *opaque) +int +qemuProcessReconnect(virQEMUDriverPtr driver, virDomainObjPtr obj, virConn= ectPtr conn) { - struct qemuProcessReconnectData *data =3D opaque; - virQEMUDriverPtr driver =3D data->driver; - virDomainObjPtr obj =3D data->obj; qemuDomainObjPrivatePtr priv; - virConnectPtr conn =3D data->conn; struct qemuDomainJobObj oldjob; int state; int reason; @@ -7104,8 +7100,7 @@ qemuProcessReconnect(void *opaque) unsigned int stopFlags =3D 0; bool jobStarted =3D false; virCapsPtr caps =3D NULL; - - VIR_FREE(data); + int ret =3D -1; =20 qemuDomainObjRestoreJob(obj, &oldjob); if (oldjob.asyncJob =3D=3D QEMU_ASYNC_JOB_MIGRATION_IN) @@ -7297,6 +7292,7 @@ qemuProcessReconnect(void *opaque) if (virAtomicIntInc(&driver->nactive) =3D=3D 1 && driver->inhibitCallb= ack) driver->inhibitCallback(true, driver->inhibitOpaque); =20 + ret =3D 0; cleanup: if (jobStarted) { if (!virDomainObjIsActive(obj)) @@ -7311,7 +7307,7 @@ qemuProcessReconnect(void *opaque) virObjectUnref(cfg); virObjectUnref(caps); virNWFilterUnlockFilterUpdates(); - return; + return ret; =20 error: if (virDomainObjIsActive(obj)) { @@ -7338,6 +7334,21 @@ qemuProcessReconnect(void *opaque) goto cleanup; } =20 + +static void +qemuProcessReconnectThread(void *opaque) +{ + struct qemuProcessReconnectData *data =3D opaque; + virQEMUDriverPtr driver =3D data->driver; + virDomainObjPtr obj =3D data->obj; + virConnectPtr conn =3D data->conn; + + qemuProcessReconnect(driver, obj, conn); + + VIR_FREE(data); +} + + static int qemuProcessReconnectHelper(virDomainObjPtr obj, void *opaque) @@ -7369,7 +7380,7 @@ qemuProcessReconnectHelper(virDomainObjPtr obj, */ virObjectRef(data->conn); =20 - if (virThreadCreate(&thread, false, qemuProcessReconnect, data) < 0) { + if (virThreadCreate(&thread, false, qemuProcessReconnectThread, data) = < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not create thread. QEMU initialization " "might be incomplete")); diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index cd9a720313..846577d341 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -45,6 +45,7 @@ int qemuProcessBuildDestroyMemoryPaths(virQEMUDriverPtr d= river, =20 void qemuProcessAutostartAll(virQEMUDriverPtr driver); void qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver); +int qemuProcessReconnect(virQEMUDriverPtr driver, virDomainObjPtr obj, vir= ConnectPtr conn); =20 typedef struct _qemuProcessIncomingDef qemuProcessIncomingDef; typedef qemuProcessIncomingDef *qemuProcessIncomingDefPtr; --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list