mirror of https://github.com/proxmox/mirror_qemu
migration: Add hmp interface to set and query parameters
Add the hmp interface to tune and query the parameters used in live migration. Signed-off-by: Liang Li <liang.z.li@intel.com> Signed-off-by: Yang Zhang <yang.z.zhang@intel.com> Signed-off-by: Juan Quintela <quintela@redhat.com>master
parent
85de83231e
commit
50e9a629c6
|
@ -990,6 +990,21 @@ STEXI
|
||||||
@item migrate_set_capability @var{capability} @var{state}
|
@item migrate_set_capability @var{capability} @var{state}
|
||||||
@findex migrate_set_capability
|
@findex migrate_set_capability
|
||||||
Enable/Disable the usage of a capability @var{capability} for migration.
|
Enable/Disable the usage of a capability @var{capability} for migration.
|
||||||
|
ETEXI
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "migrate_set_parameter",
|
||||||
|
.args_type = "parameter:s,value:i",
|
||||||
|
.params = "parameter value",
|
||||||
|
.help = "Set the parameter for migration",
|
||||||
|
.mhandler.cmd = hmp_migrate_set_parameter,
|
||||||
|
.command_completion = migrate_set_parameter_completion,
|
||||||
|
},
|
||||||
|
|
||||||
|
STEXI
|
||||||
|
@item migrate_set_parameter @var{parameter} @var{value}
|
||||||
|
@findex migrate_set_parameter
|
||||||
|
Set the parameter @var{parameter} for migration.
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -1761,6 +1776,8 @@ show user network stack connection states
|
||||||
show migration status
|
show migration status
|
||||||
@item info migrate_capabilities
|
@item info migrate_capabilities
|
||||||
show current migration capabilities
|
show current migration capabilities
|
||||||
|
@item info migrate_parameters
|
||||||
|
show current migration parameters
|
||||||
@item info migrate_cache_size
|
@item info migrate_cache_size
|
||||||
show current migration XBZRLE cache size
|
show current migration XBZRLE cache size
|
||||||
@item info balloon
|
@item info balloon
|
||||||
|
|
65
hmp.c
65
hmp.c
|
@ -252,6 +252,29 @@ void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
|
||||||
qapi_free_MigrationCapabilityStatusList(caps);
|
qapi_free_MigrationCapabilityStatusList(caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
MigrationParameters *params;
|
||||||
|
|
||||||
|
params = qmp_query_migrate_parameters(NULL);
|
||||||
|
|
||||||
|
if (params) {
|
||||||
|
monitor_printf(mon, "parameters:");
|
||||||
|
monitor_printf(mon, " %s: %" PRId64,
|
||||||
|
MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_LEVEL],
|
||||||
|
params->compress_level);
|
||||||
|
monitor_printf(mon, " %s: %" PRId64,
|
||||||
|
MigrationParameter_lookup[MIGRATION_PARAMETER_COMPRESS_THREADS],
|
||||||
|
params->compress_threads);
|
||||||
|
monitor_printf(mon, " %s: %" PRId64,
|
||||||
|
MigrationParameter_lookup[MIGRATION_PARAMETER_DECOMPRESS_THREADS],
|
||||||
|
params->decompress_threads);
|
||||||
|
monitor_printf(mon, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
qapi_free_MigrationParameters(params);
|
||||||
|
}
|
||||||
|
|
||||||
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
|
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
|
monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
|
||||||
|
@ -1185,6 +1208,48 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
|
||||||
|
{
|
||||||
|
const char *param = qdict_get_str(qdict, "parameter");
|
||||||
|
int value = qdict_get_int(qdict, "value");
|
||||||
|
Error *err = NULL;
|
||||||
|
bool has_compress_level = false;
|
||||||
|
bool has_compress_threads = false;
|
||||||
|
bool has_decompress_threads = false;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < MIGRATION_PARAMETER_MAX; i++) {
|
||||||
|
if (strcmp(param, MigrationParameter_lookup[i]) == 0) {
|
||||||
|
switch (i) {
|
||||||
|
case MIGRATION_PARAMETER_COMPRESS_LEVEL:
|
||||||
|
has_compress_level = true;
|
||||||
|
break;
|
||||||
|
case MIGRATION_PARAMETER_COMPRESS_THREADS:
|
||||||
|
has_compress_threads = true;
|
||||||
|
break;
|
||||||
|
case MIGRATION_PARAMETER_DECOMPRESS_THREADS:
|
||||||
|
has_decompress_threads = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
qmp_migrate_set_parameters(has_compress_level, value,
|
||||||
|
has_compress_threads, value,
|
||||||
|
has_decompress_threads, value,
|
||||||
|
&err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == MIGRATION_PARAMETER_MAX) {
|
||||||
|
error_set(&err, QERR_INVALID_PARAMETER, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
monitor_printf(mon, "migrate_set_parameter: %s\n",
|
||||||
|
error_get_pretty(err));
|
||||||
|
error_free(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void hmp_set_password(Monitor *mon, const QDict *qdict)
|
void hmp_set_password(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
const char *protocol = qdict_get_str(qdict, "protocol");
|
const char *protocol = qdict_get_str(qdict, "protocol");
|
||||||
|
|
4
hmp.h
4
hmp.h
|
@ -28,6 +28,7 @@ void hmp_info_chardev(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_mice(Monitor *mon, const QDict *qdict);
|
void hmp_info_mice(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_migrate(Monitor *mon, const QDict *qdict);
|
void hmp_info_migrate(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
|
void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
|
void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_cpus(Monitor *mon, const QDict *qdict);
|
void hmp_info_cpus(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_info_block(Monitor *mon, const QDict *qdict);
|
void hmp_info_block(Monitor *mon, const QDict *qdict);
|
||||||
|
@ -64,6 +65,7 @@ void hmp_migrate_incoming(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict);
|
void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict);
|
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
|
void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict);
|
void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_set_password(Monitor *mon, const QDict *qdict);
|
void hmp_set_password(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_expire_password(Monitor *mon, const QDict *qdict);
|
void hmp_expire_password(Monitor *mon, const QDict *qdict);
|
||||||
|
@ -113,6 +115,8 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args,
|
||||||
const char *str);
|
const char *str);
|
||||||
void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
|
void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
|
||||||
const char *str);
|
const char *str);
|
||||||
|
void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
|
||||||
|
const char *str);
|
||||||
void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str);
|
void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str);
|
||||||
void host_net_remove_completion(ReadLineState *rs, int nb_args,
|
void host_net_remove_completion(ReadLineState *rs, int nb_args,
|
||||||
const char *str);
|
const char *str);
|
||||||
|
|
25
monitor.c
25
monitor.c
|
@ -2858,6 +2858,13 @@ static mon_cmd_t info_cmds[] = {
|
||||||
.help = "show current migration capabilities",
|
.help = "show current migration capabilities",
|
||||||
.mhandler.cmd = hmp_info_migrate_capabilities,
|
.mhandler.cmd = hmp_info_migrate_capabilities,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "migrate_parameters",
|
||||||
|
.args_type = "",
|
||||||
|
.params = "",
|
||||||
|
.help = "show current migration parameters",
|
||||||
|
.mhandler.cmd = hmp_info_migrate_parameters,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "migrate_cache_size",
|
.name = "migrate_cache_size",
|
||||||
.args_type = "",
|
.args_type = "",
|
||||||
|
@ -4540,6 +4547,24 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
|
||||||
|
const char *str)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = strlen(str);
|
||||||
|
readline_set_completion_index(rs, len);
|
||||||
|
if (nb_args == 2) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MIGRATION_PARAMETER_MAX; i++) {
|
||||||
|
const char *name = MigrationParameter_lookup[i];
|
||||||
|
if (!strncmp(str, name, len)) {
|
||||||
|
readline_add_completion(rs, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str)
|
void host_net_add_completion(ReadLineState *rs, int nb_args, const char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Reference in New Issue