mirror of https://gitee.com/openkylin/libvirt.git
qemu: add a flag to the cookie to prevent slirp-helper setup
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>
This commit is contained in:
parent
6d5a9b9ed0
commit
0755234389
|
@ -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
|
static int
|
||||||
qemuDomainObjPrivateXMLFormatSlirp(virBufferPtr buf,
|
qemuDomainObjPrivateXMLFormatSlirp(virBufferPtr buf,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
|
@ -14707,7 +14725,7 @@ qemuDomainSaveCookieDispose(void *obj)
|
||||||
|
|
||||||
|
|
||||||
qemuDomainSaveCookiePtr
|
qemuDomainSaveCookiePtr
|
||||||
qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
qemuDomainSaveCookieNew(virDomainObjPtr vm)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
qemuDomainSaveCookiePtr cookie = NULL;
|
qemuDomainSaveCookiePtr cookie = NULL;
|
||||||
|
@ -14721,7 +14739,10 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED)
|
||||||
if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu)))
|
if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu)))
|
||||||
goto error;
|
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;
|
return cookie;
|
||||||
|
|
||||||
|
@ -14747,6 +14768,8 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED,
|
||||||
&cookie->cpu) < 0)
|
&cookie->cpu) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
cookie->slirpHelper = virXPathBoolean("boolean(./slirpHelper)", ctxt) > 0;
|
||||||
|
|
||||||
*obj = (virObjectPtr) cookie;
|
*obj = (virObjectPtr) cookie;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -14766,6 +14789,9 @@ qemuDomainSaveCookieFormat(virBufferPtr buf,
|
||||||
virCPUDefFormatBufFull(buf, cookie->cpu, NULL) < 0)
|
virCPUDefFormatBufFull(buf, cookie->cpu, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (cookie->slirpHelper)
|
||||||
|
virBufferAddLit(buf, "<slirpHelper/>\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -395,6 +395,7 @@ struct _qemuDomainObjPrivate {
|
||||||
virHashTablePtr blockjobs;
|
virHashTablePtr blockjobs;
|
||||||
|
|
||||||
virHashTablePtr dbusVMStates;
|
virHashTablePtr dbusVMStates;
|
||||||
|
bool disableSlirp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define QEMU_DOMAIN_PRIVATE(vm) \
|
#define QEMU_DOMAIN_PRIVATE(vm) \
|
||||||
|
@ -559,6 +560,7 @@ struct _qemuDomainSaveCookie {
|
||||||
virObject parent;
|
virObject parent;
|
||||||
|
|
||||||
virCPUDefPtr cpu;
|
virCPUDefPtr cpu;
|
||||||
|
bool slirpHelper;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6995,6 +6995,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
|
||||||
bool start_paused,
|
bool start_paused,
|
||||||
qemuDomainAsyncJob asyncJob)
|
qemuDomainAsyncJob asyncJob)
|
||||||
{
|
{
|
||||||
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
bool restored = false;
|
bool restored = false;
|
||||||
virObjectEventPtr event;
|
virObjectEventPtr event;
|
||||||
|
@ -7035,6 +7036,9 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
|
||||||
qemuDomainFixupCPUs(vm, &cookie->cpu) < 0)
|
qemuDomainFixupCPUs(vm, &cookie->cpu) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!cookie->slirpHelper)
|
||||||
|
priv->disableSlirp = true;
|
||||||
|
|
||||||
if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL,
|
if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL,
|
||||||
asyncJob, "stdio", *fd, path, NULL,
|
asyncJob, "stdio", *fd, path, NULL,
|
||||||
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
|
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
|
||||||
|
@ -16771,6 +16775,10 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
||||||
virCPUDefFree(priv->origCPU);
|
virCPUDefFree(priv->origCPU);
|
||||||
VIR_STEAL_PTR(priv->origCPU, origCPU);
|
VIR_STEAL_PTR(priv->origCPU, origCPU);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cookie && !cookie->slirpHelper)
|
||||||
|
priv->disableSlirp = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* Transitions 2, 3 */
|
/* Transitions 2, 3 */
|
||||||
load:
|
load:
|
||||||
|
|
Loading…
Reference in New Issue