From: Eli Qiao <liyong.qiao(a)intel.com>
Add command to allow set and get multi-thread migration parameters
for a domain.
Signed-off-by: ShaoHe Feng <shaohe.feng(a)intel.com>
Signed-off-by: Eli Qiao <liyong.qiao(a)intel.com>
---
tools/virsh-domain.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++-
tools/virsh.pod | 14 +++++
2 files changed, 184 insertions(+), 1 deletion(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index b5713cc..11ac27d 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -10301,7 +10301,7 @@ static const vshCmdInfo info_migrate_setspeed[] = {
},
{.name = "desc",
.data = N_("Set the maximum migration bandwidth (in MiB/s) for a domain "
- "which is being migrated to another host.")
+ "before migrating another host.")
},
{.name = NULL}
};
@@ -10392,6 +10392,163 @@ cmdMigrateGetMaxSpeed(vshControl *ctl, const vshCmd *cmd)
}
/*
+ * "migrate-setparameters" command
+ */
+static const vshCmdInfo info_migrate_setparameters[] = {
+ {.name = "help",
+ .data = N_("Set the multi-thread migration parameters")
+ },
+ {.name = "desc",
+ .data = N_("Set the multi-thread migration parameters for a domain "
+ "which is being migrated to another host.")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_migrate_setparameters[] = {
+ {.name = "domain",
+ .type = VSH_OT_DATA,
+ .flags = VSH_OFLAG_REQ,
+ .help = N_("domain name, id or uuid")
+ },
+ {.name = "level",
+ .type = VSH_OT_INT,
+ .help = N_("compression level, from 1-9, 0 means use default level")
+ },
+ {.name = "threads",
+ .type = VSH_OT_INT,
+ .help = N_("compression thread count for multi-thread migration")
+ },
+ {.name = "dthreads",
+ .type = VSH_OT_INT,
+ .help = N_("decompression thread count for multi-thread migration")
+ },
+ {.name = NULL}
+};
+
+static bool
+cmdMigrateSetParameters(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom = NULL;
+ virTypedParameterPtr params = NULL;
+ int flags = 0;
+ unsigned int level = 0;
+ unsigned int threads = 0;
+ unsigned int dthreads = 0;
+ int nparams = 0;
+ int maxparams = 0;
+ bool ret = false;
+ int rv = 0;
+
+ if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ if ((rv = vshCommandOptUIntWrap(cmd, "level", &level)) < 0) {
+ vshError(ctl,
+ _("Numeric value for <%s> option is malformed or out of
range"),
+ "level");
+ goto done;
+ } else if (rv > 0) {
+ if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
+ VIR_DOMAIN_MIRGRATE_COMPRESSION_LEVEL,
+ level) < 0)
+ goto done;
+ }
+
+ if ((rv = vshCommandOptUIntWrap(cmd, "threads", &threads)) < 0) {
+ vshError(ctl,
+ _("Numeric value for <%s> option is malformed or out of
range"),
+ "threads");
+ goto done;
+ } else if (rv > 0) {
+ if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
+ VIR_DOMAIN_MIRGRATE_COMPRESSION_THREADS,
+ threads) < 0)
+ goto done;
+ }
+
+ if ((rv = vshCommandOptUIntWrap(cmd, "dthreads", &dthreads)) < 0) {
+ vshError(ctl,
+ _("Numeric value for <%s> option is malformed or out of
range"),
+ "dthreads");
+ goto done;
+ } else if (rv > 0) {
+ if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
+ VIR_DOMAIN_MIRGRATE_DECOMPRESSION_THREADS,
+ dthreads) < 0)
+ goto done;
+ }
+
+ if (virDomainMigrateSetParameters(dom, params, nparams, flags) < 0)
+ goto done;
+
+ ret = true;
+
+ done:
+ virDomainFree(dom);
+ virTypedParamsFree(params, nparams);
+ return ret;
+}
+
+/*
+ * "migrate-getparameters" command
+ */
+static const vshCmdInfo info_migrate_getparameters[] = {
+ {.name = "help",
+ .data = N_("Get the mutit-thread migration parameters")
+ },
+ {.name = "desc",
+ .data = N_("Get the mutit-thread migration parameters for a domain.")
+ },
+ {.name = NULL}
+};
+
+static const vshCmdOptDef opts_migrate_getparameters[] = {
+ {.name = "domain",
+ .type = VSH_OT_DATA,
+ .flags = VSH_OFLAG_REQ,
+ .help = N_("domain name, id or uuid")
+ },
+ {.name = NULL}
+};
+
+static bool
+cmdMigrateGetParameters(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom = NULL;
+ int flags = 0;
+ int i = 0;
+ int nparams = 0;
+ virTypedParameterPtr params = NULL;
+ bool ret = false;
+
+ if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+ return false;
+
+ /* probe the compress param number of migrate. Now it supports 3 params. */
+ if (virDomainMigrateGetParameters(dom, NULL, &nparams, 0) < 0)
+ goto done;
+
+ params = vshCalloc(ctl, nparams, sizeof(*params));
+
+ if (virDomainMigrateGetParameters(dom, params, &nparams, flags) < 0)
+ goto done;
+
+ for (i = 0; i < nparams; i++) {
+ char *str = vshGetTypedParamValue(ctl, ¶ms[i]);
+ vshPrint(ctl, "%-15s: %s\n", params[i].field, str);
+ VIR_FREE(str);
+ }
+
+ ret = true;
+
+ done:
+ virDomainFree(dom);
+ virTypedParamsFree(params, nparams);
+ return ret;
+}
+
+/*
* "domdisplay" command
*/
static const vshCmdInfo info_domdisplay[] = {
@@ -13239,6 +13396,18 @@ const vshCmdDef domManagementCmds[] = {
.info = info_migrate_getspeed,
.flags = 0
},
+ {.name = "migrate-setparameters",
+ .handler = cmdMigrateSetParameters,
+ .opts = opts_migrate_setparameters,
+ .info = info_migrate_setparameters,
+ .flags = 0
+ },
+ {.name = "migrate-getparameters",
+ .handler = cmdMigrateGetParameters,
+ .opts = opts_migrate_getparameters,
+ .info = info_migrate_getparameters,
+ .flags = 0
+ },
{.name = "numatune",
.handler = cmdNumatune,
.opts = opts_numatune,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index b81fd01..c158e8d 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1685,6 +1685,20 @@ reject the value or convert it to the maximum value allowed.
Get the maximum migration bandwidth (in MiB/s) for a domain.
+=item B<migrate-setparameters> I<domain> [I<level> B<number>]
+[I<threads> B<number>] [I<dthreads> B<number>]
+
+Set the multi-thread parameters for live migration. I<level> is interpreted as
+an unsigned int value from 0-9. O means hypervisor choose an default value.
+Specifying a negative value results in an essentially unlimited value being
+provided to the hypervisor. The hypervisor can choose whether to reject the
+value or convert it to the maximum value allowed. I<threads> is interpreted as
+an unsigned int value. I<dthreads> is interpreted as an unsigned int value.
+
+=item B<migrate-getspeed> I<domain>
+
+Get the multi-thread migration parameters for a domain.
+
=item B<numatune> I<domain> [I<--mode> B<mode>]
[I<--nodeset> B<nodeset>]
[[I<--config>] [I<--live>] | [I<--current>]]
--
2.1.4