SHA256
1
0
forked from pool/libvirt

Accepting request 860506 from Virtualization

OBS-URL: https://build.opensuse.org/request/show/860506
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libvirt?expand=0&rev=321
This commit is contained in:
Dominique Leuenberger 2021-01-10 18:38:12 +00:00 committed by Git OBS Bridge
commit 899e0a166d
2 changed files with 64 additions and 74 deletions

View File

@ -1,3 +1,16 @@
-------------------------------------------------------------------
Mon Jan 4 19:19:19 UTC 2021 - olaf@aepfle.de
- Update libxl-set-migration-constraints.patch
Remove code which handled --max_factor. The total amount of
transferred data is no indicator to trigger the final stop+copy.
This should have been removed during upgrade to Xen 4.7.
Reduce default value of --max_iters from 5 to 2.
The workload within domU will continue to produce dirty pages.
It is unreasonable to expect any slowdown during migration.
Now there is one initial copy of all memory, one instead of four
iteration for dirty memory, and a final copy iteration prior move.
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Dec 17 04:20:58 UTC 2020 - James Fehlig <jfehlig@suse.com> Thu Dec 17 04:20:58 UTC 2020 - James Fehlig <jfehlig@suse.com>

View File

@ -16,11 +16,38 @@ Signed-off-by: Jim Fehlig <jfehlig@suse.com>
tools/virsh.pod | 8 ++++++++ tools/virsh.pod | 8 ++++++++
6 files changed, 125 insertions(+), 6 deletions(-) 6 files changed, 125 insertions(+), 6 deletions(-)
Index: libvirt-6.10.0/docs/manpages/virsh.rst
===================================================================
--- libvirt-6.10.0.orig/docs/manpages/virsh.rst
+++ libvirt-6.10.0/docs/manpages/virsh.rst
@@ -3134,7 +3134,8 @@ migrate
[--postcopy-bandwidth bandwidth]
[--parallel [--parallel-connections connections]]
[--bandwidth bandwidth] [--tls-destination hostname]
- [--disks-uri URI]
+ [--disks-uri URI] [--max_iters num]
+ [--min_remaining num] [--abort_if_busy]
Migrate domain to another host. Add *--live* for live migration; <--p2p>
for peer-2-peer migration; *--direct* for direct migration; or *--tunnelled*
@@ -3240,6 +3241,12 @@ parallel connections. The number of such
network link between the source and the target and thus speeding up the
migration.
+SUSE-specific options for Xen: *--max_iters* allows specifying the maximum
+number of iterations before final suspend. Default is 2. *--min_remaining*
+allows specifying the number of dirty pages before final suspend. Default is 50.
+*--abort_if_busy* can be used to abort the migration instead of doing the final
+suspend for domUs with busy workloads, to avoid a long suspend-time of the domU.
+
Running migration can be canceled by interrupting virsh (usually using
``Ctrl-C``) or by ``domjobabort`` command sent from another virsh instance.
Index: libvirt-6.10.0/include/libvirt/libvirt-domain.h Index: libvirt-6.10.0/include/libvirt/libvirt-domain.h
=================================================================== ===================================================================
--- libvirt-6.10.0.orig/include/libvirt/libvirt-domain.h --- libvirt-6.10.0.orig/include/libvirt/libvirt-domain.h
+++ libvirt-6.10.0/include/libvirt/libvirt-domain.h +++ libvirt-6.10.0/include/libvirt/libvirt-domain.h
@@ -1078,6 +1078,31 @@ typedef enum { @@ -1078,6 +1078,25 @@ typedef enum {
*/ */
# define VIR_MIGRATE_PARAM_TLS_DESTINATION "tls.destination" # define VIR_MIGRATE_PARAM_TLS_DESTINATION "tls.destination"
@ -31,12 +58,6 @@ Index: libvirt-6.10.0/include/libvirt/libvirt-domain.h
+ */ + */
+#define VIR_MIGRATE_PARAM_SUSE_MAX_ITERS "max_iters" +#define VIR_MIGRATE_PARAM_SUSE_MAX_ITERS "max_iters"
+/** +/**
+ * VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR:
+ *
+ * virDomainMigrate* params field: xc_domain_save max_factor
+ */
+#define VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR "max_factor"
+/**
+ * VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING: + * VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING:
+ * + *
+ * virDomainMigrate* params field: xc_domain_save min_remaining + * virDomainMigrate* params field: xc_domain_save min_remaining
@ -66,7 +87,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_driver.c
#ifdef LIBXL_HAVE_NO_SUSPEND_RESUME #ifdef LIBXL_HAVE_NO_SUSPEND_RESUME
virReportUnsupportedError(); virReportUnsupportedError();
@@ -6247,6 +6250,18 @@ libxlDomainMigratePerform3Params(virDoma @@ -6247,6 +6250,15 @@ libxlDomainMigratePerform3Params(virDoma
virTypedParamsGetString(params, nparams, virTypedParamsGetString(params, nparams,
VIR_MIGRATE_PARAM_DEST_NAME, VIR_MIGRATE_PARAM_DEST_NAME,
&dname) < 0 || &dname) < 0 ||
@ -74,9 +95,6 @@ Index: libvirt-6.10.0/src/libxl/libxl_driver.c
+ VIR_MIGRATE_PARAM_SUSE_MAX_ITERS, + VIR_MIGRATE_PARAM_SUSE_MAX_ITERS,
+ &props.max_iters) < 0 || + &props.max_iters) < 0 ||
+ virTypedParamsGetUInt(params, nparams, + virTypedParamsGetUInt(params, nparams,
+ VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR,
+ &props.max_factor) < 0 ||
+ virTypedParamsGetUInt(params, nparams,
+ VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING, + VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING,
+ &props.min_remaining) < 0 || + &props.min_remaining) < 0 ||
+ virTypedParamsGetUInt(params, nparams, + virTypedParamsGetUInt(params, nparams,
@ -85,7 +103,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_driver.c
virTypedParamsGetString(params, nparams, virTypedParamsGetString(params, nparams,
VIR_MIGRATE_PARAM_URI, VIR_MIGRATE_PARAM_URI,
&uri) < 0) &uri) < 0)
@@ -6261,11 +6276,11 @@ libxlDomainMigratePerform3Params(virDoma @@ -6261,11 +6273,11 @@ libxlDomainMigratePerform3Params(virDoma
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) { if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
if (libxlDomainMigrationSrcPerformP2P(driver, vm, dom->conn, dom_xml, if (libxlDomainMigrationSrcPerformP2P(driver, vm, dom->conn, dom_xml,
@ -103,7 +121,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
=================================================================== ===================================================================
--- libvirt-6.10.0.orig/src/libxl/libxl_migration.c --- libvirt-6.10.0.orig/src/libxl/libxl_migration.c
+++ libvirt-6.10.0/src/libxl/libxl_migration.c +++ libvirt-6.10.0/src/libxl/libxl_migration.c
@@ -341,18 +341,39 @@ libxlMigrateDstReceive(virNetSocketPtr s @@ -341,18 +341,38 @@ libxlMigrateDstReceive(virNetSocketPtr s
static int static int
libxlDoMigrateSrcSend(libxlDriverPrivatePtr driver, libxlDoMigrateSrcSend(libxlDriverPrivatePtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
@ -127,7 +145,6 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
+ libxl_props.flags |= LIBXL_SUSPEND_LIVE; + libxl_props.flags |= LIBXL_SUSPEND_LIVE;
+ +
+ libxl_props.max_iters = props->max_iters; + libxl_props.max_iters = props->max_iters;
+ libxl_props.max_factor = props->max_factor;
+ libxl_props.min_remaining = props->min_remaining; + libxl_props.min_remaining = props->min_remaining;
+ if (props->abort_if_busy) + if (props->abort_if_busy)
+ libxl_props.flags |= LIBXL_SUSPEND_ABORT_IF_BUSY; + libxl_props.flags |= LIBXL_SUSPEND_ABORT_IF_BUSY;
@ -145,7 +162,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (ret != 0) { if (ret != 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Failed to send migration data to destination host")); _("Failed to send migration data to destination host"));
@@ -905,7 +926,7 @@ struct libxlTunnelControl { @@ -905,7 +925,7 @@ struct libxlTunnelControl {
static int static int
libxlMigrationSrcStartTunnel(libxlDriverPrivatePtr driver, libxlMigrationSrcStartTunnel(libxlDriverPrivatePtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
@ -154,7 +171,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
virStreamPtr st, virStreamPtr st,
struct libxlTunnelControl **tnl) struct libxlTunnelControl **tnl)
{ {
@@ -938,7 +959,7 @@ libxlMigrationSrcStartTunnel(libxlDriver @@ -938,7 +958,7 @@ libxlMigrationSrcStartTunnel(libxlDriver
virObjectUnlock(vm); virObjectUnlock(vm);
/* Send data to pipe */ /* Send data to pipe */
@ -163,7 +180,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
virObjectLock(vm); virObjectLock(vm);
out: out:
@@ -974,7 +995,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -974,7 +994,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
const char *dconnuri G_GNUC_UNUSED, const char *dconnuri G_GNUC_UNUSED,
const char *dname, const char *dname,
const char *uri, const char *uri,
@ -172,7 +189,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
{ {
virDomainPtr ddomain = NULL; virDomainPtr ddomain = NULL;
virTypedParameterPtr params = NULL; virTypedParameterPtr params = NULL;
@@ -1019,11 +1040,11 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -1019,11 +1039,11 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
/* We don't require the destination to have P2P support /* We don't require the destination to have P2P support
* as it looks to be normal migration from the receiver perspective. * as it looks to be normal migration from the receiver perspective.
*/ */
@ -186,7 +203,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (!(st = virStreamNew(dconn, 0))) if (!(st = virStreamNew(dconn, 0)))
goto confirm; goto confirm;
ret = dconn->driver->domainMigratePrepareTunnel3Params ret = dconn->driver->domainMigratePrepareTunnel3Params
@@ -1037,7 +1058,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -1037,7 +1057,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
if (ret == -1) if (ret == -1)
goto confirm; goto confirm;
@ -195,7 +212,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (uri_out) { if (uri_out) {
if (virTypedParamsReplaceString(&params, &nparams, if (virTypedParamsReplaceString(&params, &nparams,
VIR_MIGRATE_PARAM_URI, uri_out) < 0) { VIR_MIGRATE_PARAM_URI, uri_out) < 0) {
@@ -1052,11 +1073,11 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -1052,11 +1072,11 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
} }
VIR_DEBUG("Perform3 uri=%s", NULLSTR(uri_out)); VIR_DEBUG("Perform3 uri=%s", NULLSTR(uri_out));
@ -210,7 +227,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (ret < 0) { if (ret < 0) {
notify_source = false; notify_source = false;
virErrorPreserveLast(&orig_err); virErrorPreserveLast(&orig_err);
@@ -1091,7 +1112,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -1091,7 +1111,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
confirm: confirm:
if (notify_source) { if (notify_source) {
VIR_DEBUG("Confirm3 cancelled=%d vm=%p", cancelled, vm); VIR_DEBUG("Confirm3 cancelled=%d vm=%p", cancelled, vm);
@ -219,7 +236,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (ret < 0) if (ret < 0)
VIR_WARN("Guest %s probably left in 'paused' state on source", VIR_WARN("Guest %s probably left in 'paused' state on source",
@@ -1099,7 +1120,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP @@ -1099,7 +1119,7 @@ libxlDoMigrateSrcP2P(libxlDriverPrivateP
} }
cleanup: cleanup:
@ -228,7 +245,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
libxlMigrationSrcStopTunnel(tc); libxlMigrationSrcStopTunnel(tc);
virObjectUnref(st); virObjectUnref(st);
} }
@@ -1143,7 +1164,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD @@ -1143,7 +1163,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD
const char *dconnuri, const char *dconnuri,
const char *uri_str G_GNUC_UNUSED, const char *uri_str G_GNUC_UNUSED,
const char *dname, const char *dname,
@ -237,7 +254,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
{ {
int ret = -1; int ret = -1;
bool useParams; bool useParams;
@@ -1178,7 +1199,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD @@ -1178,7 +1198,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD
} }
ret = libxlDoMigrateSrcP2P(driver, vm, sconn, xmlin, dconn, dconnuri, ret = libxlDoMigrateSrcP2P(driver, vm, sconn, xmlin, dconn, dconnuri,
@ -246,7 +263,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
if (ret < 0) { if (ret < 0) {
/* /*
@@ -1205,7 +1226,7 @@ libxlDomainMigrationSrcPerform(libxlDriv @@ -1205,7 +1225,7 @@ libxlDomainMigrationSrcPerform(libxlDriv
const char *dconnuri G_GNUC_UNUSED, const char *dconnuri G_GNUC_UNUSED,
const char *uri_str, const char *uri_str,
const char *dname G_GNUC_UNUSED, const char *dname G_GNUC_UNUSED,
@ -255,7 +272,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.c
{ {
libxlDomainObjPrivatePtr priv = vm->privateData; libxlDomainObjPrivatePtr priv = vm->privateData;
char *hostname = NULL; char *hostname = NULL;
@@ -1241,7 +1262,7 @@ libxlDomainMigrationSrcPerform(libxlDriv @@ -1241,7 +1261,7 @@ libxlDomainMigrationSrcPerform(libxlDriv
/* suspend vm and send saved data to dst through socket fd */ /* suspend vm and send saved data to dst through socket fd */
virObjectUnlock(vm); virObjectUnlock(vm);
@ -268,25 +285,23 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.h
=================================================================== ===================================================================
--- libvirt-6.10.0.orig/src/libxl/libxl_migration.h --- libvirt-6.10.0.orig/src/libxl/libxl_migration.h
+++ libvirt-6.10.0/src/libxl/libxl_migration.h +++ libvirt-6.10.0/src/libxl/libxl_migration.h
@@ -35,6 +35,10 @@ @@ -35,6 +35,9 @@
VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING, \ VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING, \
VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \ VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \
VIR_MIGRATE_PARAM_DEST_XML, VIR_TYPED_PARAM_STRING, \ VIR_MIGRATE_PARAM_DEST_XML, VIR_TYPED_PARAM_STRING, \
+ VIR_MIGRATE_PARAM_SUSE_MAX_ITERS, VIR_TYPED_PARAM_UINT, \ + VIR_MIGRATE_PARAM_SUSE_MAX_ITERS, VIR_TYPED_PARAM_UINT, \
+ VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR, VIR_TYPED_PARAM_UINT, \
+ VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING, VIR_TYPED_PARAM_UINT, \ + VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING, VIR_TYPED_PARAM_UINT, \
+ VIR_MIGRATE_PARAM_SUSE_ABORT_IF_BUSY, VIR_TYPED_PARAM_UINT, \ + VIR_MIGRATE_PARAM_SUSE_ABORT_IF_BUSY, VIR_TYPED_PARAM_UINT, \
NULL NULL
char * char *
@@ -66,6 +70,14 @@ libxlDomainMigrationDstPrepare(virConnec @@ -66,6 +69,13 @@ libxlDomainMigrationDstPrepare(virConnec
int cookieinlen, int cookieinlen,
unsigned int flags); unsigned int flags);
+typedef struct { +typedef struct {
+ unsigned int virFlags; + unsigned int virFlags;
+ unsigned int max_iters; + unsigned int max_iters;
+ unsigned int max_factor;
+ unsigned int min_remaining; + unsigned int min_remaining;
+ unsigned int abort_if_busy; + unsigned int abort_if_busy;
+} libxlDomainMigrationProps; +} libxlDomainMigrationProps;
@ -294,7 +309,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.h
int int
libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr driver, libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
@@ -74,7 +86,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD @@ -74,7 +84,7 @@ libxlDomainMigrationSrcPerformP2P(libxlD
const char *dconnuri, const char *dconnuri,
const char *uri_str, const char *uri_str,
const char *dname, const char *dname,
@ -303,7 +318,7 @@ Index: libvirt-6.10.0/src/libxl/libxl_migration.h
int int
libxlDomainMigrationSrcPerform(libxlDriverPrivatePtr driver, libxlDomainMigrationSrcPerform(libxlDriverPrivatePtr driver,
@@ -83,7 +95,7 @@ libxlDomainMigrationSrcPerform(libxlDriv @@ -83,7 +93,7 @@ libxlDomainMigrationSrcPerform(libxlDriv
const char *dconnuri, const char *dconnuri,
const char *uri_str, const char *uri_str,
const char *dname, const char *dname,
@ -316,17 +331,13 @@ Index: libvirt-6.10.0/tools/virsh-domain.c
=================================================================== ===================================================================
--- libvirt-6.10.0.orig/tools/virsh-domain.c --- libvirt-6.10.0.orig/tools/virsh-domain.c
+++ libvirt-6.10.0/tools/virsh-domain.c +++ libvirt-6.10.0/tools/virsh-domain.c
@@ -10707,6 +10707,22 @@ static const vshCmdOptDef opts_migrate[] @@ -10707,6 +10707,18 @@ static const vshCmdOptDef opts_migrate[]
.type = VSH_OT_STRING, .type = VSH_OT_STRING,
.help = N_("override the destination host name used for TLS verification") .help = N_("override the destination host name used for TLS verification")
}, },
+ {.name = "max_iters", + {.name = "max_iters",
+ .type = VSH_OT_INT, + .type = VSH_OT_INT,
+ .help = N_("SUSE libxl: Number of iterations before final suspend (default: 5).") + .help = N_("SUSE libxl: Number of iterations before final suspend (default: 2).")
+ },
+ {.name = "max_factor",
+ .type = VSH_OT_INT,
+ .help = N_("SUSE libxl: Max amount of memory to transfer before final suspend (default: 3*RAM).")
+ }, + },
+ {.name = "min_remaining", + {.name = "min_remaining",
+ .type = VSH_OT_INT, + .type = VSH_OT_INT,
@ -339,7 +350,7 @@ Index: libvirt-6.10.0/tools/virsh-domain.c
{.name = NULL} {.name = NULL}
}; };
@@ -10727,6 +10743,7 @@ doMigrate(void *opaque) @@ -10727,6 +10739,7 @@ doMigrate(void *opaque)
unsigned long long ullOpt = 0; unsigned long long ullOpt = 0;
int rv; int rv;
virConnectPtr dconn = data->dconn; virConnectPtr dconn = data->dconn;
@ -347,7 +358,7 @@ Index: libvirt-6.10.0/tools/virsh-domain.c
#ifndef WIN32 #ifndef WIN32
sigset_t sigmask, oldsigmask; sigset_t sigmask, oldsigmask;
@@ -10857,6 +10874,27 @@ doMigrate(void *opaque) @@ -10857,6 +10870,22 @@ doMigrate(void *opaque)
goto save_error; goto save_error;
} }
@ -356,11 +367,6 @@ Index: libvirt-6.10.0/tools/virsh-domain.c
+ VIR_MIGRATE_PARAM_SUSE_MAX_ITERS, uint_opt) < 0) + VIR_MIGRATE_PARAM_SUSE_MAX_ITERS, uint_opt) < 0)
+ goto save_error; + goto save_error;
+ } + }
+ if (vshCommandOptUInt(ctl, cmd, "max_factor", &uint_opt) > 0 && uint_opt) {
+ if (virTypedParamsAddUInt(&params, &nparams, &maxparams,
+ VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR, uint_opt) < 0)
+ goto save_error;
+ }
+ if (vshCommandOptUInt(ctl, cmd, "min_remaining", &uint_opt) > 0 && uint_opt) { + if (vshCommandOptUInt(ctl, cmd, "min_remaining", &uint_opt) > 0 && uint_opt) {
+ if (virTypedParamsAddUInt(&params, &nparams, &maxparams, + if (virTypedParamsAddUInt(&params, &nparams, &maxparams,
+ VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING, uint_opt) < 0) + VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING, uint_opt) < 0)
@ -375,32 +381,3 @@ Index: libvirt-6.10.0/tools/virsh-domain.c
if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0) if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0)
goto out; goto out;
if (opt) { if (opt) {
Index: libvirt-6.10.0/docs/manpages/virsh.rst
===================================================================
--- libvirt-6.10.0.orig/docs/manpages/virsh.rst
+++ libvirt-6.10.0/docs/manpages/virsh.rst
@@ -3134,7 +3134,8 @@ migrate
[--postcopy-bandwidth bandwidth]
[--parallel [--parallel-connections connections]]
[--bandwidth bandwidth] [--tls-destination hostname]
- [--disks-uri URI]
+ [--disks-uri URI] [--max_iters num] [--max_factor num]
+ [--min_remaining num] [--abort_if_busy]
Migrate domain to another host. Add *--live* for live migration; <--p2p>
for peer-2-peer migration; *--direct* for direct migration; or *--tunnelled*
@@ -3240,6 +3241,14 @@ parallel connections. The number of such
network link between the source and the target and thus speeding up the
migration.
+SUSE-specific options for Xen: *--max_iters* allows specifying the maximum
+number of iterations before final suspend. Default is 5. *--max_factor*
+allows specifying the maximum amount of memory to transfer before final suspend.
+Default is (3*VM memory size). *--min_remaining* allows specifying the
+number of dirty pages before final suspend. Default is 50. *--abort_if_busy*
+can be used to abort the migration instead of doing the final suspend for VMs
+with busy workloads.
+
Running migration can be canceled by interrupting virsh (usually using
``Ctrl-C``) or by ``domjobabort`` command sent from another virsh instance.