]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: add a flag to the cookie to prevent slirp-helper setup
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Thu, 8 Aug 2019 14:55:07 +0000 (18:55 +0400)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 6 Sep 2019 10:47:47 +0000 (12:47 +0200)
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 <marcandre.lureau@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c

index ec80905c899f494d8974681c9713660bbd8ac147..28fd930df2b60f236007b7d10ce0cea53e3b7252 100644 (file)
@@ -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, "<slirpHelper/>\n");
+
     return 0;
 }
 
index d297cb3a961e203aa1cae4d602c1ff09ab8a9459..bc88580a65139fb2b82e2eb5f1a7393e2fb63c74 100644 (file)
@@ -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;
 };
 
 
index 69c841d5f51f5aaa732f9c9acddff8e957759a30..73e1571dc007fa4966d671328ad034defa01f85d 100644 (file)
@@ -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: