Add migration capabilities

The management can query the current migration capabilities using
query-migrate-capabilities QMP command.
The user can use 'info migrate_capabilities' HMP command.
Currently only XBZRLE capability is available.

Signed-off-by: Orit Wasserman <owasserm@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>

Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Orit Wasserman 2012-08-06 21:42:47 +03:00 committed by Juan Quintela
parent c03b0aa0ca
commit bbf6da32b5
8 changed files with 140 additions and 0 deletions

View File

@ -1417,6 +1417,8 @@ show CPU statistics
show user network stack connection states show user network stack connection states
@item info migrate @item info migrate
show migration status show migration status
@item info migrate_capabilities
show current migration capabilities
@item info balloon @item info balloon
show balloon information show balloon information
@item info qtree @item info qtree

33
hmp.c
View File

@ -131,8 +131,21 @@ void hmp_info_mice(Monitor *mon)
void hmp_info_migrate(Monitor *mon) void hmp_info_migrate(Monitor *mon)
{ {
MigrationInfo *info; MigrationInfo *info;
MigrationCapabilityStatusList *caps, *cap;
info = qmp_query_migrate(NULL); info = qmp_query_migrate(NULL);
caps = qmp_query_migrate_capabilities(NULL);
/* do not display parameters during setup */
if (info->has_status && caps) {
monitor_printf(mon, "capabilities: ");
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s ",
MigrationCapability_lookup[cap->value->capability],
cap->value->state ? "on" : "off");
}
monitor_printf(mon, "\n");
}
if (info->has_status) { if (info->has_status) {
monitor_printf(mon, "Migration status: %s\n", info->status); monitor_printf(mon, "Migration status: %s\n", info->status);
@ -159,6 +172,26 @@ void hmp_info_migrate(Monitor *mon)
} }
qapi_free_MigrationInfo(info); qapi_free_MigrationInfo(info);
qapi_free_MigrationCapabilityStatusList(caps);
}
void hmp_info_migrate_capabilities(Monitor *mon)
{
MigrationCapabilityStatusList *caps, *cap;
caps = qmp_query_migrate_capabilities(NULL);
if (caps) {
monitor_printf(mon, "capabilities: ");
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s ",
MigrationCapability_lookup[cap->value->capability],
cap->value->state ? "on" : "off");
}
monitor_printf(mon, "\n");
}
qapi_free_MigrationCapabilityStatusList(caps);
} }
void hmp_info_cpus(Monitor *mon) void hmp_info_cpus(Monitor *mon)

1
hmp.h
View File

@ -25,6 +25,7 @@ void hmp_info_uuid(Monitor *mon);
void hmp_info_chardev(Monitor *mon); void hmp_info_chardev(Monitor *mon);
void hmp_info_mice(Monitor *mon); void hmp_info_mice(Monitor *mon);
void hmp_info_migrate(Monitor *mon); void hmp_info_migrate(Monitor *mon);
void hmp_info_migrate_capabilities(Monitor *mon);
void hmp_info_cpus(Monitor *mon); void hmp_info_cpus(Monitor *mon);
void hmp_info_block(Monitor *mon); void hmp_info_block(Monitor *mon);
void hmp_info_blockstats(Monitor *mon); void hmp_info_blockstats(Monitor *mon);

View File

@ -113,6 +113,30 @@ uint64_t migrate_max_downtime(void)
return max_downtime; return max_downtime;
} }
MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
{
MigrationCapabilityStatusList *head = NULL;
MigrationCapabilityStatusList *caps;
MigrationState *s = migrate_get_current();
int i;
for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
if (head == NULL) {
head = g_malloc0(sizeof(*caps));
caps = head;
} else {
caps->next = g_malloc0(sizeof(*caps));
caps = caps->next;
}
caps->value =
g_malloc(sizeof(*caps->value));
caps->value->capability = i;
caps->value->state = s->enabled_capabilities[i];
}
return head;
}
MigrationInfo *qmp_query_migrate(Error **errp) MigrationInfo *qmp_query_migrate(Error **errp)
{ {
MigrationInfo *info = g_malloc0(sizeof(*info)); MigrationInfo *info = g_malloc0(sizeof(*info));
@ -375,10 +399,16 @@ static MigrationState *migrate_init(const MigrationParams *params)
{ {
MigrationState *s = migrate_get_current(); MigrationState *s = migrate_get_current();
int64_t bandwidth_limit = s->bandwidth_limit; int64_t bandwidth_limit = s->bandwidth_limit;
bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
memcpy(enabled_capabilities, s->enabled_capabilities,
sizeof(enabled_capabilities));
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
s->bandwidth_limit = bandwidth_limit; s->bandwidth_limit = bandwidth_limit;
s->params = *params; s->params = *params;
memcpy(s->enabled_capabilities, enabled_capabilities,
sizeof(enabled_capabilities));
s->bandwidth_limit = bandwidth_limit; s->bandwidth_limit = bandwidth_limit;
s->state = MIG_STATE_SETUP; s->state = MIG_STATE_SETUP;

View File

@ -19,6 +19,7 @@
#include "notify.h" #include "notify.h"
#include "error.h" #include "error.h"
#include "vmstate.h" #include "vmstate.h"
#include "qapi-types.h"
struct MigrationParams { struct MigrationParams {
bool blk; bool blk;
@ -39,6 +40,7 @@ struct MigrationState
void *opaque; void *opaque;
MigrationParams params; MigrationParams params;
int64_t total_time; int64_t total_time;
bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
}; };
void process_incoming_migration(QEMUFile *f); void process_incoming_migration(QEMUFile *f);

View File

@ -2654,6 +2654,13 @@ static mon_cmd_t info_cmds[] = {
.help = "show migration status", .help = "show migration status",
.mhandler.info = hmp_info_migrate, .mhandler.info = hmp_info_migrate,
}, },
{
.name = "migrate_capabilities",
.args_type = "",
.params = "",
.help = "show current migration capabilities",
.mhandler.info = hmp_info_migrate_capabilities,
},
{ {
.name = "balloon", .name = "balloon",
.args_type = "", .args_type = "",

View File

@ -305,6 +305,45 @@
## ##
{ 'command': 'query-migrate', 'returns': 'MigrationInfo' } { 'command': 'query-migrate', 'returns': 'MigrationInfo' }
##
# @MigrationCapability
#
# Migration capabilities enumeration
#
# @xbzrle: Migration supports xbzrle (Xor Based Zero Run Length Encoding).
# This feature allows us to minimize migration traffic for certain work
# loads, by sending compressed difference of the pages
#
# Since: 1.2
##
{ 'enum': 'MigrationCapability',
'data': ['xbzrle'] }
##
# @MigrationCapabilityStatus
#
# Migration capability information
#
# @capability: capability enum
#
# @state: capability state bool
#
# Since: 1.2
##
{ 'type': 'MigrationCapabilityStatus',
'data': { 'capability' : 'MigrationCapability', 'state' : 'bool' } }
##
# @query-migrate-capabilities
#
# Returns information about the current migration capabilities status
#
# Returns: @MigrationCapabilitiesStatus
#
# Since: 1.2
##
{ 'command': 'query-migrate-capabilities', 'returns': ['MigrationCapabilityStatus']}
## ##
# @MouseInfo: # @MouseInfo:
# #

View File

@ -2142,6 +2142,32 @@ EQMP
.mhandler.cmd_new = qmp_marshal_input_query_migrate, .mhandler.cmd_new = qmp_marshal_input_query_migrate,
}, },
SQMP
query-migrate-capabilities
-------
Query current migration capabilities
- "capabilities": migration capabilities state
- "xbzrle" : XBZRLE state (json-bool)
Arguments:
Example:
-> { "execute": "query-migrate-capabilities" }
<- { "return": {
"capabilities" : [ { "capability" : "xbzrle", "state" : false } ]
}
}
EQMP
{
.name = "query-migrate-capabilities",
.args_type = "",
.mhandler.cmd_new = qmp_marshal_input_query_migrate_capabilities,
},
SQMP SQMP
query-balloon query-balloon
------------- -------------