Index: libvirt-1.2.5/src/xen/xen_driver.c
===================================================================
--- libvirt-1.2.5.orig/src/xen/xen_driver.c
+++ libvirt-1.2.5/src/xen/xen_driver.c
@@ -1894,6 +1894,10 @@ xenUnifiedDomainMigratePerform3Params(vi
     const char *uri = NULL;
     virDomainDefPtr def = NULL;
     int ret = -1;
+    unsigned int max_iters = 0;
+    unsigned int max_factor = 0;
+    unsigned int min_remaining = 0;
+    unsigned int abort_if_busy = 0;
 
     virCheckFlags(XEN_MIGRATION_FLAGS, -1);
 
@@ -1902,8 +1906,19 @@ xenUnifiedDomainMigratePerform3Params(vi
 
     if (virTypedParamsGetString(params, nparams,
                                 VIR_MIGRATE_PARAM_URI,
-                                &uri) < 0)
-
+                                &uri) < 0 ||
+        virTypedParamsGetUInt(params, nparams,
+                              VIR_MIGRATE_PARAM_SUSE_MAX_ITERS,
+                              &max_iters) < 0 ||
+        virTypedParamsGetUInt(params, nparams,
+                              VIR_MIGRATE_PARAM_SUSE_MAX_FACTOR,
+                              &max_factor) < 0 ||
+        virTypedParamsGetUInt(params, nparams,
+                              VIR_MIGRATE_PARAM_SUSE_MIN_REMAINING,
+                              &min_remaining) < 0 ||
+        virTypedParamsGetUInt(params, nparams,
+                              VIR_MIGRATE_PARAM_SUSE_ABORT_IF_BUSY,
+                              &abort_if_busy) < 0)
         return -1;
 
     if (!(def = xenGetDomainDefForDom(dom)))
@@ -1912,6 +1927,11 @@ xenUnifiedDomainMigratePerform3Params(vi
     if (virDomainMigratePerform3ParamsEnsureACL(dom->conn, def) < 0)
         goto cleanup;
 
+    if (xenDaemonDomainMigrateConstraintsSet(dom->conn, def, max_iters,
+                                             max_factor, min_remaining,
+                                             abort_if_busy) < 0)
+        goto cleanup;
+
     ret = xenDaemonDomainMigratePerform(dom->conn, def, NULL, 0, uri,
                                         flags, NULL, 0);
 
Index: libvirt-1.2.5/src/xen/xen_driver.h
===================================================================
--- libvirt-1.2.5.orig/src/xen/xen_driver.h
+++ libvirt-1.2.5/src/xen/xen_driver.h
@@ -88,6 +88,10 @@ extern int xenRegister (void);
     VIR_MIGRATE_PARAM_URI,              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_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_ABORT_IF_BUSY, VIR_TYPED_PARAM_UINT, \
     NULL
 
 typedef struct xenXMConfCache *xenXMConfCachePtr;
Index: libvirt-1.2.5/src/xen/xend_internal.c
===================================================================
--- libvirt-1.2.5.orig/src/xen/xend_internal.c
+++ libvirt-1.2.5/src/xen/xend_internal.c
@@ -2692,6 +2692,47 @@ xenDaemonDomainMigratePrepare(virConnect
 }
 
 int
+xenDaemonDomainMigrateConstraintsSet(virConnectPtr conn,
+                                     virDomainDefPtr def,
+                                     unsigned int max_iters,
+                                     unsigned int max_factor,
+                                     unsigned int min_remaining,
+                                     unsigned int abort_if_busy)
+{
+    int ret = -1;
+    char *max_iters_str = NULL;
+    char *max_factor_str = NULL;
+    char *min_remaining_str = NULL;
+
+    VIR_DEBUG("Setting migration constraints: max_iters %u, max_factor %u, "
+              "min_remaining %u, abort_if_busy %u",
+              max_iters, max_factor,
+              min_remaining, abort_if_busy);
+
+    if (virAsprintf(&max_iters_str, "%u", max_iters) < 0)
+        goto cleanup;
+    if (virAsprintf(&max_factor_str, "%u", max_factor) < 0)
+        goto cleanup;
+    if (virAsprintf(&min_remaining_str, "%u", min_remaining) < 0)
+        goto cleanup;
+
+    ret = xend_op(conn, def->name,
+                  "op", "migrate_constraints_set",
+                  "max_iters", max_iters_str,
+                  "max_factor", max_factor_str,
+                  "min_remaining", min_remaining_str,
+                  "abort_if_busy", abort_if_busy ? "1" : "0",
+                  "log_progress", "1",
+                  NULL);
+
+ cleanup:
+    VIR_FREE(max_iters_str);
+    VIR_FREE(max_factor_str);
+    VIR_FREE(min_remaining_str);
+    return ret;
+}
+
+int
 xenDaemonDomainMigratePerform(virConnectPtr conn,
                               virDomainDefPtr def,
                               const char *cookie ATTRIBUTE_UNUSED,
Index: libvirt-1.2.5/src/xen/xend_internal.h
===================================================================
--- libvirt-1.2.5.orig/src/xen/xend_internal.h
+++ libvirt-1.2.5/src/xen/xend_internal.h
@@ -190,6 +190,15 @@ int xenDaemonDomainMigratePrepare (virCo
                                    char **cookie, int *cookielen,
                                    const char *uri_in, char **uri_out,
                                    unsigned long flags, const char *dname, unsigned long resource);
+
+int
+xenDaemonDomainMigrateConstraintsSet(virConnectPtr conn,
+                                     virDomainDefPtr def,
+                                     unsigned int max_iters,
+                                     unsigned int max_factor,
+                                     unsigned int min_remaining,
+                                     unsigned int abort_if_busy);
+
 int xenDaemonDomainMigratePerform (virConnectPtr conn,
                                    virDomainDefPtr def,
                                    const char *cookie, int cookielen,
