diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h index 5d83230cd6..e193881450 100644 --- a/src/libxl/libxl_domain.h +++ b/src/libxl/libxl_domain.h @@ -65,6 +65,7 @@ struct _libxlDomainObjPrivate { /* console */ virChrdevsPtr devs; libxl_evgen_domain_death *deathW; + virThreadPtr migrationDstReceiveThr; unsigned short migrationPort; char *lockState; diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 54b01a3169..fc7ccb53d0 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -297,9 +297,9 @@ libxlMigrateDstReceive(virNetSocketPtr sock, libxlMigrationDstArgs *args = opaque; virNetSocketPtr *socks = args->socks; size_t nsocks = args->nsocks; + libxlDomainObjPrivatePtr priv = args->vm->privateData; virNetSocketPtr client_sock; int recvfd = -1; - virThread thread; size_t i; /* Accept migration connection */ @@ -318,7 +318,10 @@ libxlMigrateDstReceive(virNetSocketPtr sock, * the migration data */ args->recvfd = recvfd; - if (virThreadCreate(&thread, false, + VIR_FREE(priv->migrationDstReceiveThr); + if (VIR_ALLOC(priv->migrationDstReceiveThr) < 0) + goto fail; + if (virThreadCreate(priv->migrationDstReceiveThr, true, libxlDoMigrateDstReceive, args) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Failed to create thread for receiving migration data")); @@ -557,7 +560,6 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn, libxlDriverPrivatePtr driver = dconn->privateData; virDomainObjPtr vm = NULL; libxlMigrationDstArgs *args = NULL; - virThread thread; bool taint_hook = false; libxlDomainObjPrivatePtr priv = NULL; char *xmlout = NULL; @@ -617,7 +619,10 @@ libxlDomainMigrationDstPrepareTunnel3(virConnectPtr dconn, args->nsocks = 0; mig = NULL; - if (virThreadCreate(&thread, false, libxlDoMigrateDstReceive, args) < 0) { + VIR_FREE(priv->migrationDstReceiveThr); + if (VIR_ALLOC(priv->migrationDstReceiveThr) < 0) + goto error; + if (virThreadCreate(priv->migrationDstReceiveThr, true, libxlDoMigrateDstReceive, args) < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Failed to create thread for receiving migration data")); goto endjob; @@ -1291,6 +1296,13 @@ libxlDomainMigrationDstFinish(virConnectPtr dconn, virObjectEventPtr event = NULL; virDomainPtr dom = NULL; + if (priv->migrationDstReceiveThr) { + virObjectUnlock(vm); + virThreadJoin(priv->migrationDstReceiveThr); + virObjectLock(vm); + VIR_FREE(priv->migrationDstReceiveThr); + } + virPortAllocatorRelease(priv->migrationPort); priv->migrationPort = 0;