From 0755234389d9740972286c33b02b65dabe8f061a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 8 Aug 2019 18:55:07 +0400 Subject: [PATCH] qemu: add a flag to the cookie to prevent slirp-helper setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For VM started and migrated/saved without slirp-helpers, let's prevent the automatic setup (as it would fail to migrate otherwise). Signed-off-by: Marc-André Lureau Reviewed-by: Michal Privoznik --- src/qemu/qemu_domain.c | 30 ++++++++++++++++++++++++++++-- src/qemu/qemu_domain.h | 2 ++ src/qemu/qemu_driver.c | 8 ++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ec80905c89..28fd930df2 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2671,6 +2671,24 @@ qemuDomainHasSlirp(virDomainObjPtr vm) } +static bool +qemuDomainGetSlirpHelperOk(virDomainObjPtr vm) +{ + size_t i; + + for (i = 0; i < vm->def->nnets; i++) { + virDomainNetDefPtr net = vm->def->nets[i]; + + /* if there is a builtin slirp, prevent slirp-helper */ + if (net->type == VIR_DOMAIN_NET_TYPE_USER && + !QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp) + return false; + } + + return true; +} + + static int qemuDomainObjPrivateXMLFormatSlirp(virBufferPtr buf, virDomainObjPtr vm) @@ -14707,7 +14725,7 @@ qemuDomainSaveCookieDispose(void *obj) qemuDomainSaveCookiePtr -qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED) +qemuDomainSaveCookieNew(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainSaveCookiePtr cookie = NULL; @@ -14721,7 +14739,10 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED) if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu))) goto error; - VIR_DEBUG("Save cookie %p, cpu=%p", cookie, cookie->cpu); + cookie->slirpHelper = qemuDomainGetSlirpHelperOk(vm); + + VIR_DEBUG("Save cookie %p, cpu=%p, slirpHelper=%d", + cookie, cookie->cpu, cookie->slirpHelper); return cookie; @@ -14747,6 +14768,8 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED, &cookie->cpu) < 0) goto error; + cookie->slirpHelper = virXPathBoolean("boolean(./slirpHelper)", ctxt) > 0; + *obj = (virObjectPtr) cookie; return 0; @@ -14766,6 +14789,9 @@ qemuDomainSaveCookieFormat(virBufferPtr buf, virCPUDefFormatBufFull(buf, cookie->cpu, NULL) < 0) return -1; + if (cookie->slirpHelper) + virBufferAddLit(buf, "\n"); + return 0; } diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index d297cb3a96..bc88580a65 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -395,6 +395,7 @@ struct _qemuDomainObjPrivate { virHashTablePtr blockjobs; virHashTablePtr dbusVMStates; + bool disableSlirp; }; #define QEMU_DOMAIN_PRIVATE(vm) \ @@ -559,6 +560,7 @@ struct _qemuDomainSaveCookie { virObject parent; virCPUDefPtr cpu; + bool slirpHelper; }; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 69c841d5f5..73e1571dc0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6995,6 +6995,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, bool start_paused, qemuDomainAsyncJob asyncJob) { + qemuDomainObjPrivatePtr priv = vm->privateData; int ret = -1; bool restored = false; virObjectEventPtr event; @@ -7035,6 +7036,9 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, qemuDomainFixupCPUs(vm, &cookie->cpu) < 0) goto cleanup; + if (!cookie->slirpHelper) + priv->disableSlirp = true; + if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, asyncJob, "stdio", *fd, path, NULL, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, @@ -16771,6 +16775,10 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, virCPUDefFree(priv->origCPU); VIR_STEAL_PTR(priv->origCPU, origCPU); } + + if (cookie && !cookie->slirpHelper) + priv->disableSlirp = true; + } else { /* Transitions 2, 3 */ load: